PHP mail() 函数返回 true,但不发送邮件

Posted

技术标签:

【中文标题】PHP mail() 函数返回 true,但不发送邮件【英文标题】:PHP mail() function returns true, but doesn't send mail 【发布时间】:2014-07-14 11:37:37 【问题描述】:

我知道以前有人问过这个问题。

当我调用 php mail() 函数时,它返回 true。

我检查了我的 php.ini(我正在运行 CentOS):

SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On

我在一个论坛上看到我必须安装 sendmail。所以我安装了它。现在具有 mail() 功能的网站不再加载。于是我把sendmail去掉了,mail()函数又返回了true,但是没有发送邮件。

有什么想法吗?

【问题讨论】:

你怎么知道它不发邮件? 看这里:***.com/questions/14456673/… - 通常是主机过滤通过mail() 函数而不是使用 SMTP 发送的邮件。 检查您的垃圾邮件文件夹!!! ***.com/a/30268849/3093731 【参考方案1】:

要发送电子邮件,您需要一个 SMTP 服务器(本地或远程)。实际上,您的邮件功能只是将邮件传递到您的 SMTP 服务器,而这才是真正发送您的电子邮件的功能。

在你的 php.ini 中出现这一行

sendmail_path = /usr/sbin/sendmail -t -i

您应该注意是否使用该配置参数(来自manual):

如果设置,smtp、smtp_port 和 sendmail_from 将被忽略,并且 执行指定的命令。

但这里最重要的是您只需卸载 sendmail,这样您的邮件就会无处可去。我知道 sendmail 给你带来了一些问题,可能是配置问题,但现在你的 php.ini 配置是错误的。

如何解决?

开始从 php.ini 中删除 sendmail_path 参数。

安装一个简单的 SMTP 服务器,如 postfix

验证 postfix 是否在端口 22 上侦听:

netstat -lnt

尝试从您的 php mail() 函数发送邮件

验证您的邮件是否已正确发送(检查您的 /var/log/mail.log/var/log/mail/mail.log 文件)

您还可以验证邮件不在后缀队列中:

后队列-f

【讨论】:

【参考方案2】:

我遇到了类似的问题; mail()wp_mail() 函数都返回 TRUE,但没有电子邮件发送到我的 xyz@yahoo.com 电子邮件帐户。

事实证明,雅虎将这些电子邮件作为垃圾邮件进行了拦截。我没有在我的表单上实施验证码,因此许多垃圾邮件被发送到雅虎,这就是他们阻止这些电子邮件的原因。电子邮件已成功发送,但 Yahoo 将其标记为垃圾邮件。

确保这不是您的问题。

【讨论】:

@Irfan Kissa @OnlyMAJ 我在共享主机上遇到了完全相同的问题。 mail() 返回真,但什么也没有。我的垃圾文件夹里什么都没有。到底是怎么回事 @user2230470 您可以将电子邮件发送给 yahoo 和 google 以外的其他提供商,如果它也无法正常工作,那么您的托管存在问题,否则问题来自 yahoo 或 google。 @OnlyMAJ 昨晚我尝试将一些内容发送到我自己域的电子邮件中,这很有效。我原来的电子邮件是一个hotmail地址,一直没有用。我昨天尝试发送到 gmail 帐户,但什么也没有。我今天要做更多的测试。据说我的主人支持它...有什么替代方案?【参考方案3】:

请检查您的 DNS, 在本地主机上测试时遇到同样的问题,但在真实主机上工作。 问题是假 DNS,你的电子邮件被谷歌阻止了。 如果您使用其他电子邮件服务(例如:雅虎邮件)进行测试,您将收到垃圾邮件。 我是在查看邮件日志后发现的

【讨论】:

如何检查? 邮件日志哥们在哪里?【参考方案4】:

我在设置 smtp 时遇到问题,所以我最终使用了 gmail。您可以按照here的指示使用 PEAR MAIL 发送邮件:

$from = "NoReply <noreply@random.com>";
$to = "someone <someone@somemail.com>";
$subject = "my subject";
$body = "my body";
$host = "ssl://smtp.gmail.com";
$port = "465";
$username = "gmailaccount@gmail.com";
$password = "gmailpass";

$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port,
'auth' => true,
'username' => $username,
'password' => $password));
$mail = $smtp->send($to, $headers, $body);

如果您使用 gmail,您的 $from 将替换为用于发送邮件的电子邮件地址。

【讨论】:

以上是关于PHP mail() 函数返回 true,但不发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mail():设置返回路径导致邮件发送失败

PHP 中的 mail() 函数返回 bool false

openshift 电子邮件从终端发送,但不是从 php

如何使用php的mail函数

使 PHP 的 mail() 函数在 OS X Mavericks 上工作的分步指南

我的邮件没有被php函数mail()发送[重复]