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

时间:2011-03-31 07:19:25

标签: php email

我正在使用php的mail()函数来简单地将联系表单的输入通过电子邮件发送给相应的人。奇怪的是,表单始终用于处理电子邮件,但有一天这一切都停止了,现在函数返回false,但根本没有错误。

该网站位于共享主机上。当被问及这个问题时,他们建议我使用smtp relay xx.xxx.x.xxx

如果我错了,请纠正我,但mail()函数没有为此提供条款吗?肯定是由HOST机器正确配置它的继电器?

我的问题是:这看起来像主机配置错误,还是我的代码?以下是我使用的邮件代码示例:

$to = "xxx@xxx.co.za"; //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);

6 个答案:

答案 0 :(得分:18)

  

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

欢迎使用PHP!

  

这看起来像主机配置错误,还是我的代码?

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

  

当被问到这个问题时,他们建议我使用smtp中继......

的确,你可能应该这样做。仔细看看SwiftMailer,这是一个优秀,全面,现代的PHP邮件库,可以直接与该SMTP服务器通信。它擅长构建MIME消息,就像你似乎在上面拼凑起来的那样。

其他受欢迎的选项包括PEAR's MailZend Framework's Zend_Mail和经典经典PHPMailer

答案 1 :(得分:7)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您应该查看邮件日志。他们坚持了答案。您可能不得不与您的托管公司争夺日志。

答案 4 :(得分:0)

检查是否允许网络通过提供发送邮件 来自终端的getsebool httpd_can_sendmail。如果输出是

httpd_can_sendmail --> off

通过发出setsebool httpd_can_sendmail 1 命令向https授予发送邮件的权限。您必须具有root权限才能发出这些命令。

答案 5 :(得分:0)

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

$ headers。=&#34;来自:$ fname \ r \ n&#34 ;;

您在from字段中使用了用户电子邮件。我的托管只接受包含此域名的电子邮件。所以我用它替换了它:

$headers = "From: webmaster@yourdomain.com" ."\r\n" ;

它解决了这个问题!之后PHP mail()工作正常。