PHP 的“邮件”是如何工作的?
Posted
技术标签:
【中文标题】PHP 的“邮件”是如何工作的?【英文标题】:How does PHP's `mail` work? 【发布时间】:2012-08-02 10:42:14 【问题描述】:php 的mail
函数似乎在一个干净的系统上传递邮件,管理员或网站管理员没有进行明显的配置(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
所以sendmail
是exim4
的符号链接,因此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 的“邮件”是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章