PHP的mail()函数返回true,但是邮件没有发送。

12

我知道这个问题之前已经被问过了。

当我调用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,但无法发送邮件。
你有什么想法吗?

你怎么知道它没有发送邮件? - Popnoodles
看这里:https://dev59.com/8WYq5IYBdhLWcg3weQcy - 通常是当主机过滤通过mail()函数发送的邮件而不使用SMTP时。 - Joe
请检查您的垃圾邮件文件夹!!!https://dev59.com/l2Ag5IYBdhLWcg3wM4r_#30268849 - Andrew
补充@Joe的评论 - 在一个实例中,当函数中使用的发件地址在服务器上不存在时,主机会阻止发送邮件。 - undefined
5个回答

6
要发送电子邮件,您需要一个SMTP服务器(本地或远程)。实际上,您的邮件功能只是将邮件传递给您的SMTP服务器,而它才是真正发送邮件的。
在您的php.ini文件中出现了这一行:
sendmail_path = /usr/sbin/sendmail -t -i

如果您使用以下配置参数(来自手册),则需要注意:

如果设置了此参数,则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文件)

  • 您还可以验证邮件不在postfix队列中:

postqueue -f


3
我曾遇到与此类似的问题;mail()wp_mail()函数都返回TRUE,但电子邮件未发送到我的xyz@yahoo.com邮箱。
原来是Yahoo将这些邮件视作垃圾邮件而屏蔽了它们。因为我没有在表单中实现验证码,所以向Yahoo发送了很多垃圾邮件,这就是他们屏蔽邮件的原因。邮件成功发送,但Yahoo将其标记为垃圾邮件。
请确保这不是你的问题所在。

@Irfan Kissa @OnlyMAJ 我在共享主机上遇到了完全相同的问题。mail()返回true,但是什么也没有。我的垃圾邮件文件夹里也没有。这到底是怎么回事? - user2230470
@user2230470 如果您无法通过雅虎或谷歌发送电子邮件,可以尝试将其发送到其他提供商。如果在其他提供商也无法发送,则问题可能来自您的主机,否则问题可能来自雅虎或谷歌。 - OnlyMAJ
@OnlyMAJ 昨晚我尝试向自己域名的电子邮件发送一些内容,成功了。我的原始电子邮件是hotmail地址,但一直无法使用。昨天我尝试向一个gmail账户发送,但没有成功。今天我会进行更多测试。据说我的主机支持此功能...有什么其他选择吗? - user2230470

1
请检查您的DNS设置, 我在本地测试时遇到了同样的问题,但在真实主机上却可以正常工作。 问题出在虚假的DNS设置上,您的电子邮件被Google屏蔽了。 如果您使用其他电子邮件服务(例如:雅虎邮件),您将会收到垃圾邮件。 我是在检查邮件日志后发现这个问题的。

我该如何检查? - user2230470
1
邮件日志在哪里啊? - Behnam Esmaili

1

我曾经遇到过类似的问题。使用了Sendmail。请注意以下几点:

  • 真正的发件人是安装Sendmail的地方(通常是VPS)。
  • From字段在php邮件脚本中(应该与发件人匹配)
  • 域名的MX记录(告诉哪个发件人可信)
  • Sendmail日志可以提供很多信息(在我的情况下是/var/mail)。它们确实解释了为什么尽管消息未被传递,但返回了true

在我的情况下,php脚本中的from值不正确,而且MX记录也不信任发件人。

我想提到另一个可能的错误是主机名来自这篇指南可能已更改。

hostnamectl set-hostname domain.name

-1

我在设置SMTP时遇到了问题,最后只能使用Gmail。您可以按照这里的说明使用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 将被发送邮件时使用的电子邮件地址替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接