PHP 的“邮件”是如何工作的?

Posted

技术标签:

【中文标题】PHP 的“邮件”是如何工作的?【英文标题】:How does PHP's `mail` work? 【发布时间】:2012-08-02 10:42:14 【问题描述】:

phpmail 函数似乎在一个干净的系统上传递邮件,管理员或网站管理员没有进行明显的配置(php.ini 中没有 SMTP 配置等)。 mail 函数如何将邮件投递到远程服务器?

【问题讨论】:

为什么要进行该配置?除非你的意思是给站长投递邮件,否则站长配置东西是没有意义的。 您问错了问题 - PHP 中的 mail() 函数没有任何问题 - 它并非不可靠。问题是您的邮件的内容和分发。一个更好的问题是“我怎样才能避免我的邮件以垃圾邮件文件夹结尾?”。 @Alex 当然是。我问的是它是如何工作的,而不是如何避免垃圾邮件文件夹。 我想知道为什么这会被否决...?这是一个合理的问题,询问脚本语言的功能如何工作。 通常PHP是系统命令/c命令的前端,对linux有很强的依赖。因此,查找联机帮助页和同名命令通常也会有所帮助。 unixhelp.ed.ac.uk/CGI/man-cgi?mail 【参考方案1】:

在 *nix 上,它调用 sendmail 二进制文件,然后使用邮件配置来路由电子邮件。在 Windows 上,它发送到 SMTP 服务器。在这两种情况下,系统管理员都会设置邮件系统。

【讨论】:

感谢您回答我提出的问题。我不确定 PHP 是否正在联系远程服务器本身并处理 SMTP,或者它是否将该任务移交给本地服务器上的 MTA。另外,您知道为什么这个问题被否决了吗?我想很多人只是误解了它。它似乎很适合网站的范围(由the FAQ 定义)。 @Tom:人们关注的是措辞而不是问题。 我已修改问题以帮助纠正问题。我不明白什么是“模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈”。我尝试在 PHP 聊天室中提问,但那里没有版主,或者没有人回复。有没有更好的地方了解该网站? sendmail 使用的“邮件配置”能否再清楚一点? @vaab:不。这完全取决于您的 MTA。【参考方案2】:

您可以检测它是如何工作的,如下所示。

第一种方法

$ ltrace php -r "mail('tester@127.0.0.1', 'Test', 'Hello world');" 2>&1 | grep sendmail
memcpy(0x095ea168, "sendmail_from", 14)          = 0x095ea168
memcpy(0x095ea1e0, "sendmail_path", 14)          = 0x095ea1e0
popen("/usr/sbin/sendmail -t -i ", "w")          = 0x0977c7c0

从上面命令的结果可以看出popen()函数打开了/usr/sbin/sendmail -t -i的进程。

$ ls -l /usr/sbin/sendmail
... /usr/sbin/sendmail -> exim4

所以sendmailexim4 的符号链接,因此sendmail -t -i 调用exim4 -t -i

exim4 的手册页中,您可以阅读这些选项-t -i

$ man exim4 | grep ' -t -i'
-ti       This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail.

第二种方法

安装snoopy 并运行:

# grep snoopy /var/log/auth.log | tail
... php -r mail('tester@127.0.0.1', 'Test', 'Hello world');
... /usr/sbin/sendmail -t -i
... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw
... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw
... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj

上述命令的结果显示了执行命令的顺序。

【讨论】:

【参考方案3】:

mail() 使用 sendmail,它使用 DNS 查找目标域的 MX 记录并直接发送到那里。而已。

而且由于目标服务器可能不知道您的 IP 地址,特别是如果它经过 NAT,它可能会被标记为垃圾邮件。

您可以修改您的配置以使用不同的(合法广告已知的)smtp 服务器作为中介。

【讨论】:

【参考方案4】:

实际上,它真的不那么可靠,除非底层 sendmail 或其他配置正确。

Amazon SES 拥有比您使用的任何服务器更好的服务器,并且在那里接收邮件的次数比使用 mail() 的次数多。

您不应该使用mail() 的真正原因是因为您的服务器的IP 地址可能对GMail、Yahoo 等邮件服务完全未知,并且它被标记为垃圾邮件的可能性更高。为什么会被标记为垃圾邮件?因为mail() 很容易被用于垃圾邮件目的。

【讨论】:

这并不能真正回答问题,它是如何工作的。我将 SES 用于其他事情。这只是想知道它在没有配置的全新安装上是如何工作的,而不是为什么它被标记为垃圾邮件或我应该改用什么。不过,感谢您的回答。

以上是关于PHP 的“邮件”是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

php邮件功能不想工作

Php SMTP 邮件发送仅在本地工作

PHP Mail停止工作[重复]

XAMPP OSX Lion 让邮件正常工作

Ajax 如何与 PHP 一起工作?

PhP 邮件无法正常工作 windows 7 xampp - argosoft 邮件服务器