Joh*_*ohn 0 email php email-server
我无法让 PHP 的 mail() 函数在我的 localhost 笔记本电脑上工作。我使用的是 Ubuntu 9.04 并且我在家中连接到无线网络来上网。我在终端中运行了以下命令:
sudo apt-get install postfix
Run Code Online (Sandbox Code Playgroud)
一切看起来都很好。我没有看到任何错误。当我运行
mail('john@mydomain.com', 'Subject', 'Message', 'From: localhost <no-reply@mydomain.com>')
Run Code Online (Sandbox Code Playgroud)
在 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=<john@mydomain.com>, 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)
Run Code Online (Sandbox Code Playgroud)
唔...
好吧,人们在这里猜测,我想我更愿意在实际给您答案之前先进行故障排除和诊断路线。他们的回答非常有效,但尽管如此,我们甚至不知道您的邮件是否由您当地的 MTA 中继。
好的,首先,您已经安装了 Postfix……它正在运行吗?
$ sudo /etc/init.d/postfix status
$ telnet localhost 25
Run Code Online (Sandbox Code Playgroud)
在端口 25 上 telnet 到 localhost 应该会给你一个横幅,表明 Postfix 已安装,如下所示:
220 gromit.brassy.net ESMTP Postfix (Ubuntu)
Run Code Online (Sandbox Code Playgroud)
好的,您已经确认 Postfix 已启动并正在运行。接下来,搜索您的 mail.log:
$ sudo grep john@hotmail.com /var/log/mail.log
Run Code Online (Sandbox Code Playgroud)
(您看起来可能在 Ubuntu / Debian 上,您的邮件日志通常在 /var/log/mail.log 在其他系统上,它可能是 /var/log/maillog。其次,如果您在 Ubuntu 上,很多您的用户帐户将有权直接读取 mail.log 而无需 sudo'ing 的时间,因为您在适当的组中)
您应该看到如下几行:
Nov 8 08:37:24 hostname postfix/smtp[7164]: E97DE56A31: to=<john@hotmail.com>, 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)
Run Code Online (Sandbox Code Playgroud)
所以该行有很多信息,但您想要的是后缀队列 id 来查看发生的所有事情。
该行的开头包含时间和日期,以及记录该行的进程的后缀和 PID。下一部分是队列 id:E97DE56A31
现在这一行通常会告诉您您的邮件是否已发送,但无论如何运行此过程是一种很好的做法:
$ sudo grep E97DE56A31 /var/log/mail.log
Run Code Online (Sandbox Code Playgroud)
这应该为您提供邮件的完整记录。
如果在上述情况下您在 mail.log 文件中找不到任何感兴趣的内容,则您的邮件似乎没有提交到 Postfix。此时您需要开始检查 php.ini 邮件设置。