我无法让 PHP 的 mail() 函数在我的 localhost 笔记本电脑上运行。我使用的是 Ubuntu 9.04,并在家里连接到无线网络以上网。我在终端中运行了以下命令:
sudo apt-get install postfix
一切看起来都很好。我没有看到任何错误。当我运行
mail('[email protected]', 'Subject', 'Message', 'From: localhost <[email protected]>')
在 PHP 中,该函数返回 true。但即使它返回 true,我也没有在我的 hotmail 帐户中收到电子邮件。
我是不是漏掉了什么步骤?
我查看了我的 mail.log,它说我的连接已超时:
Nov 7 00:36:30 john-laptop postfix/pickup[28698]: BB7E14F00AD: uid=33 from=<www-data>
Nov 7 00:36:30 john-laptop postfix/cleanup[29131]: BB7E14F00AD: message-id=<20091107053630.BB7E14F00AD@john-laptop>
Nov 7 00:36:30 john-laptop postfix/qmgr[4088]: BB7E14F00AD: from=<www-data@john-laptop>, size=316, nrcpt=1 (queue active)
Nov 7 00:37:03 john-laptop postfix/smtp[29133]: connect to mx01.1and1.com[74.208.5.4]:25: Connection timed out
Nov 7 00:37:33 john-laptop postfix/smtp[29133]: connect to mx00.1and1.com[74.208.5.3]:25: Connection timed out
Nov 7 00:37:33 john-laptop postfix/smtp[29133]: BB7E14F00AD: to=<[email protected]>, relay=none, delay=63, delays=0.02/0.01/63/0, dsn=4.4.1, status=deferred (connect to mx00.1and1.com[74.208.5.3]:25: Connection timed out)
唔...
答案1
虽然您可以在工作站上安装 SMTP 服务器,但您的邮件很可能会在各个位置被阻止。
许多 ISP 会阻止来自住宅账户的传出 SMTP 以打击垃圾邮件。
许多电子邮件提供商会保留与住宅宽带接入相关的 IP 地址列表并阻止传入的邮件,或立即将其移至垃圾邮件/垃圾邮件文件夹。
听起来这些消息已经被 postfix 接受了,所以您可以查看 postfix 日志,如果消息无法传递,您将看到错误消息。这些错误消息将帮助您找出被阻止的地方。
但正如我上面提到的,您可能无法解决阻碍您的问题。您可能应该找到一个拥有 SMTP 服务器的邮件提供商,您可以连接该服务器并使用它发送邮件。
请参阅以下相关问题:
答案2
好吧,人们都在猜测,我想我更愿意先进行故障排除和诊断,然后再给你答案。他们的答案非常有效,但尽管如此,我们甚至不知道您的邮件是否由您当地的 MTA 转发。
好的,首先,您已经安装了 Postfix...它正在运行吗?
$ sudo /etc/init.d/postfix status
$ telnet localhost 25
通过 telnet 连接到本地主机的 25 端口应该会显示一个横幅,表明 Postfix 已经安装,如下所示:
220 gromit.brassy.net ESMTP Postfix (Ubuntu)
好的,您已确认 Postfix 已启动并正在运行。下一步,搜索您的 mail.log:
$ sudo grep [email protected] /var/log/mail.log
(您看起来可能在使用 Ubuntu / Debian,您的邮件日志通常位于 /var/log/mail.log 中,而在其他系统上则可能是 /var/log/maillog。其次,如果您使用的是 Ubuntu,很多时候您的用户帐户将有权直接读取 mail.log,而无需 sudo,因为您属于适当的组)
您应该看到类似这样的行:
Nov 8 08:37:24 hostname postfix/smtp[7164]: E97DE56A31: to=<[email protected]>, relay=mx.hotmail.com[1.2.3.4]:25, delay=4.2, delays=0.21/0.11/3.8/0.1, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 1D7BF761F3)
因此,该行上有很多信息,但是您需要的是后缀队列 ID 来查看发生的所有事情。
该行的开头包含时间和日期,以及记录该行的后缀和进程的 PID。下一部分是队列 ID:E97DE56A31
现在此行通常会告诉您邮件是否已发送,但无论如何,执行此过程都是很好的做法:
$ sudo grep E97DE56A31 /var/log/mail.log
这应该会为您提供您邮件的完整记录。
如果在上述情况下,您在 mail.log 文件中找不到任何感兴趣的内容,则您的邮件似乎未提交给 Postfix。此时您需要开始检查您的 php.ini 邮件设置。
答案3
正如其他发帖者所概述的那样,原因可能有很多。我要做的第一件事是运行 mailq 命令行应用程序,看看您的测试邮件是否还在等待发送。我还会查看 /var/log/mail.log,看看电子邮件发生了什么(就像 Zoredache 所说的那样)。
Hotmail(或任何目的地)很可能只是丢弃了您的电子邮件。它很可能没有通过一些基本的反垃圾邮件测试(例如,主机名可能不完全合格,可能与 PTR 不匹配)。
欢呼吧,jmi
答案4
如果您想使用本地主机作为邮件服务器(因为您想测试脚本等),您需要告诉邮件服务器使用 ISP 的邮件服务器作为“智能主机”。现在“智能主机”是 sendmail 术语(我不使用 postfix),但我确信有一个等同于 postfix 的术语。
它的基本含义是您发送的每封电子邮件(无论通过何种方式),而您的本地主机是邮件中继,它将使用您 ISP 的邮件服务器来完成工作,通过 postfix 连接到您 ISP 的邮件服务器,而不是直接连接到 hotmail。
ISP 阻止(在您的连接上)端口 25(即邮件端口)以打击垃圾邮件,因此您无法直接发送,但可以使用 ISP 的邮件服务器间接发送。
嗨嗨。