2011-03-31 131 views
6

我正在使用php的mail()函数进行电子邮件输入联系表单到相应人员的简单过程。奇怪的是,表单总是用来处理电子邮件,但有一天这一切都停止了,现在函数返回false,但根本没有提供任何错误。PHP mail()函数返回false,但没有错误

该网站位于共享主机。当被问及这一点,他们推荐我用的SMTP中继xx.xxx.x.xxx

纠正我,如果我错了,但邮件()函数没有提供规定的这样做呢?当然,主机需要配置正确的继电器吗?

我的问题是这样的:这似乎是一个错误的主机配置,或者它是我的代码?下面是我用的邮件代码示例:

$to = "[email protected]"; //to who? 
$subject = "Website Contact: $mysubject"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "From: $fname<$email1>\r\n"; 
$headers .= "Reply-To: $email1\r\n"; 
$headers .= "Return-Path:$email1\r\n"; 
$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; 
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; 
$msg2 = nl2br($msg); 

$send = mail($to, $subject, $msg2, $headers); //process mail 

if(!$send): 
    //error stuff here 
endif; 

非常感谢, 西蒙

@eisberg - 我用这样的自定义错误处理程序:

//error handler function 
function customError($errno, $errstr){ 
$err = "\n".date('Y-m-d H:m:s')." Error: [$errno] $errstr"; 
$fh = fopen("errlog.txt", 'a+'); 
fwrite($fh, $err); 
fclose($fh); 
} 
set_error_handler("customError", E_ALL); 

会那意味着我需要将set_error_handler("customError", E_ALL);更改为set_error_handler("customError", -1);

+0

尝试** error_reporting(-1); **上面的代码。我希望你得到一个可用的消息。来源:http://php.net/manual/en/function.error-reporting.php – eisberg 2011-03-31 07:39:50

+0

@eisberg - 我有一个自定义错误函数记录所有错误(E_ALL)文件,仍然没有!它挑起最挑剔的错误,但仍然没有任何邮件()相关。 – SimonDowdles 2011-03-31 07:47:45

+0

'E_ALL'在所有PHP版本中都不是'-1':-) – eisberg 2011-03-31 07:50:47

回答

7

听起来像你的主机禁用mail(),你应该考虑使用SMTP发送邮件,一个好的PHP邮件类如SwiftMailer将允许你通过SMTP轻松发送邮件。

+0

感谢您的有用资源。它肯定似乎是一个更好的方法,全面。至少我可以依靠客户端SMTP帐户的详细信息来反对依靠一个共享服务器,这是一个错误的地狱。再次感谢。 – SimonDowdles 2011-03-31 07:28:35

17

mail()函数返回false,但没有错误

欢迎PHP!

这似乎是一个错误的主机配置,或者它是我的代码?

谁知道? mail()是一个黑盒,当出现问题时,您将无法找到有用的信息。

当被问及此,他们建议我使用SMTP中继...

事实上,你应该。仔细看看SwiftMailer,这是一个优秀的,全面的现代PHP邮件库,可以直接与SMTP服务器通信。它擅长构建MIME消息,就像你上面似乎一直苦苦思索的一样。

其他热门选项包括PEAR's MailZend Framework's Zend_Mail,和经典的经典,PHPMailer

+1

+1推荐SwiftMailer,毫无疑问是最完整的PHP Mailer库,并且正在开发中! – ChrisR 2011-03-31 07:28:33

+0

黑框黑,哈哈。 – 2011-03-31 07:30:45

+1

SwiftMailer是我决定运行的,看看lib和docs,它和使用php的mail()函数一样简单! – SimonDowdles 2011-03-31 07:41:34

1

更可能是主机配置。我认为(但可能是错误的),mail()使用服务器邮件命令。因此,如果服务器上没有安装sendmail/postfix/ssmtp或其他MTA,则无法工作。
如果他们告诉你直接访问SMTP服务器,你应该使用另一个实现SMTP协议和Mail类的库来构建邮件并直接通过SMTP发送(在PEAR或Zend Framework PHP类中,你会发现它)

1

你应该看看邮件日志。他们持有答案。虽然你可能不得不与你的托管公司搏斗。

+0

我们甚至不去那里,他们说“他们不能直接访问他们”,这意味着他们可能正在销售位于世界另一端的服务器上的主机空间,他们实际上不知道他们在做什么。 SMTP的方法将是。 – SimonDowdles 2011-03-31 07:36:27

+0

@webfac在这种情况下,SMTP就好了:) – vbence 2011-03-31 07:52:51

0

检查是否允许网站通过从终端发送 getsebool httpd_can_sendmail发送邮件。如果输出为

httpd_can_sendmail --> off 

通过发出setsebool httpd_can_sendmail 1 命令给https发送邮件的权限。您必须拥有发行这些命令的root权限。

0

我有类似的问题,我的网站是由共享托管服务托管。我可以通过修复标题来找出问题。问题是:

$ headers。=“From:$ fname \ r \ n”;

您在from字段中使用了用户电子邮件。我的主机只接受带有此域的域名的电子邮件。所以我用它替换它:

$headers = "From: [email protected]" ."\r\n" ; 

它解决了问题! PHP邮件()后,工作正常。