44

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

4

4 回答 4

26

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

于 2012-08-04T20:21:31.297 回答
12

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

第一种方法

$ 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

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

于 2015-05-22T16:02:59.420 回答
7

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

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

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

于 2013-12-18T20:00:10.030 回答
4

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

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

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

于 2012-08-04T20:21:39.730 回答