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

PHP mail()函数返回false,但没有错误,php,email,Php,Email,我使用php的mail()函数将联系人表单的输入通过电子邮件发送给相应的人。奇怪的是,表单总是用来处理电子邮件,但有一天这一切都停止了,现在函数返回false,但没有给出任何错误 该站点位于共享主机上。当被问及这一点时,他们建议我使用smtp中继xx.xxx.x.xxx 如果我错了,请纠正我,但是mail()函数没有为此提供规定,是吗?当然,由主机来正确配置继电器 我的问题是:这看起来像是主机配置的错误,还是我的代码?以下是我使用过的邮件代码示例: $to = "xxx@xxx.co.za";

我使用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;

这是否意味着我需要更改
set\u error\u处理程序(“customError”,E\u ALL)
设置错误处理程序(“customError”,-1)

听起来您的主机禁用了
mail()
,您应该研究使用SMTP发送邮件,这是一个很好的PHP邮件类,可以让您轻松地通过SMTP发送邮件

函数返回false,但没有错误

欢迎来到PHP

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

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

当被问及这一点时,他们建议我使用smtp中继

事实上,你可能应该这样做。仔细看看,这是一个优秀、全面、现代的PHP邮件库,可以直接与SMTP服务器通信。它擅长于构建MIME消息,就像上面您费尽心思拼凑的消息一样


其他流行的选项包括,以及经典中的经典。

更可能是主机配置。我认为(但可能是错误的)mail()使用server-mail命令。因此,如果服务器上没有安装sendmail/postfix/ssmtp或其他MTA,它将无法工作。

如果他们告诉您直接寻址SMTP服务器,您应该使用另一个实现SMTP协议的库和邮件类来构建邮件并通过SMTP直接发送(在PEAR或Zend Framework PHP类中您会发现)

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

检查是否允许web通过发送邮件来发送邮件
getsebool httpd\u可以从终端发送邮件。如果输出是

httpd_can_sendmail --> off
通过发出
setseboolhttpd\u can\u sendmail 1,授予https发送邮件的权限

命令。您必须具有root权限才能发出这些命令。

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

$headers.=“发件人:$fname\r\n”

您在“发件人”字段中使用了用户电子邮件。我的主机只接受我的域名为这个领域的电子邮件。因此,我将其替换为:

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

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

+1推荐SwiftMailer,这无疑是目前最完整的PHP Mailer库,正在积极开发中!blackness的黑匣子,哈哈。SwiftMailer是我决定运行的工具,看看lib和docs,它的使用非常简单,就像php的mail()函数要破解一样!谢谢你的帮助。这似乎是一个更好的方法。至少我可以依赖客户端SMTP帐户的详细信息,而不是依赖一个错误严重的共享服务器。再次感谢。我们甚至不去那里,他们说“他们不能直接访问他们”,这意味着他们可能在出售位于世界另一端的服务器上的托管空间,他们实际上不知道自己在做什么。SMTP方法将是。@webfac在这种情况下SMTP很好:)在我的情况下,我在file\mail\dovecot.index.cache中发现错误“邮件失败-没有收件人地址”(地址取自数据库,但为空字符串)请尝试错误报告(-1);在你的代码之上。我希望你收到一条有用的信息。来源:@eisberg-我有一个自定义的错误函数,将所有错误(E_all)记录到文件中,但仍然没有!它会拾取最挑剔的错误,但仍然没有邮件()相关。
E_ALL
在所有PHP版本中都不是
-1
:-)@eisberg-请参阅我在上面的问题中对错误处理的回答,我需要格式化代码,我只是想说,
-1
将使您能够控制每个PHP版本中的每个错误。如果您的
-1
没有出现错误,则很可能是您的配置有问题。
$headers = "From: webmaster@yourdomain.com" ."\r\n" ;