【问题标题】:PHP mail() function returning false, but with no errorPHP mail() 函数返回 false,但没有错误
【发布时间】:2011-07-26 16:05:59
【问题描述】:

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

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

如果我错了,请纠正我,但是 mail() 函数没有为此提供规定,对吗?是否正确配置继电器是否取决于主机?

我的问题是:这似乎是主机配置错误,还是我的代码?这是我使用的邮件代码示例:

$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);

【问题讨论】:

  • 在您的代码上方尝试 error_reporting(-1);。我希望你能得到一个有用的信息。来源:php.net/manual/en/function.error-reporting.php
  • @eisberg - 我有一个自定义错误函数将所有错误(E_ALL)记录到文件中,但仍然没有!它会发现最挑剔的错误,但仍然没有任何与 mail() 相关的错误。
  • E_ALL 在所有 PHP 版本中都不是 -1 :-)
  • @eisberg - 在上面的问题中查看我对错误处理的回复,我需要格式化代码,因此将其添加到问题中。
  • 我的意思是-1 可以让您控制每个 PHP 版本中的每个错误。如果您没有收到 -1 错误,则很有可能您的配置有问题。

标签: php email


【解决方案1】:

经过几个月的摸索,我最近才弄明白这一点。

Php mail() 限制为每行 70 个字符。在您的消息周围使用 wordwrap() ,这将防止它过度运行该行并且它每次都会工作(或者至少不会因为这个问题而失败)。

【讨论】:

    【解决方案2】:

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

    $headers .= "来自:$fname\r\n";

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

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

    它解决了问题! PHP mail() 之后就可以正常工作了。

    【讨论】:

      【解决方案3】:

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

      httpd_can_sendmail --> off
      

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

      【讨论】:

        【解决方案4】:

        你应该看看邮件日志。他们持有答案。不过,您可能不得不与托管公司争夺日志。

        【讨论】:

        • 我们甚至不要去那里,他们说“他们不能直接访问它们”,这意味着他们可能正在出售位于世界另一端的服务器上的托管空间,而他们实际上并不知道他们在做什么。将是 SMTP 方法。
        • @webfac 在这种情况下 SMTP 就可以了 :)
        • 在我的例子中,我在文件 \mail\dovecot.index.cache 中发现错误“邮件失败 - 没有收件人地址”(地址是从数据库中获取的,但是是空字符串)
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          欢迎使用 PHP!

          这似乎是主机配置错误,还是我的代码?

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

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

          确实,您可能应该这样做。好好看看SwiftMailer,这是一个优秀、全面、现代的 PHP 邮件库,可以直接与该 SMTP 服务器通信。它擅长构建 MIME 消息,就像您在上面煞费苦心整理的那样。

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

          【讨论】:

          • +1 推荐 SwiftMailer,毫无疑问是最完整的 PHP Mailer 库,并且正在积极开发中!
          • 黑盒子,哈哈。
          • SwiftMailer 是我决定运行的,查看了 lib 和 docs,它使用起来就像 php 的 mail() 函数一样简单!
          【解决方案7】:

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

          【讨论】:

          • 感谢您提供的有用资源。这似乎是一个更好的方法。至少我可以依赖客户端的 SMTP 帐户详细信息,而不是依赖一个漏洞百出的共享服务器。再次感谢。
          猜你喜欢
          • 2013-06-16
          • 2019-08-06
          • 2013-04-30
          • 1970-01-01
          • 2019-11-22
          • 2015-06-27
          • 2012-09-04
          • 2014-03-12
          • 1970-01-01
          相关资源
          最近更新 更多