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,但不发送邮件的主要内容,如果未能解决你的问题,请参考以下文章