![php mail() 函数在本地开发机器上非常慢](https://linux22.com/image/522467/php%20mail()%20%E5%87%BD%E6%95%B0%E5%9C%A8%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91%E6%9C%BA%E5%99%A8%E4%B8%8A%E9%9D%9E%E5%B8%B8%E6%85%A2.png)
背景:如果您已为开发目的设置了本地 Apache 服务器,则可能会遇到 sendmail 需要很长时间(至少一分钟)才能发送电子邮件的问题。如果您尝试调试已生成的电子邮件的问题,这会非常令人沮丧。
互联网上有几个论坛帖子讨论了这个问题。但是,没有一个帖子能详细地描述如何解决我有限的知识。以下是对我有用的步骤:
1)使用以下命令找到您的主机名(以防您忘记了):
:~$ cat /hosts/hostname
myhostname
2)编辑文件/etc/hosts
并确保第一行如下:
127.0.0.1 localhost.localdomain localhost myhostname
3)编辑 sendmail 配置文件(/etc/mail/sendmail.cf
在 Ubuntu 中)并取消注释该行#O HostsFile=/etc/hosts
4) 重启电脑。现在电脑启动速度应该快多了,mail() 函数应该几乎立即返回。但是,除非您按照步骤 5 操作,否则电子邮件实际上不会发送。
5) 每次使用邮件功能时,必须使用 sendmail '-f' 选项。例如:
mail('[email protected]', 'the subject', 'the message', null, '[email protected]');
我对其他 serverfaulters 的问题是:
可以进行哪些进一步的更改以便我不必使用 sendmail -f 选项?虽然添加 -f 选项并不难,但是当您的 CMS(例如 Drupal)在发送邮件时不使用 -f 选项时,就会出现问题。您需要破解核心模块来添加此选项。
答案1
好吧,我知道这不是你要问的,但是你为什么不试试 Postfix 或 Exim?它们都适用于 ubuntu(Postfix 甚至是 Ubuntu 系统上的默认 mta),并且它们都提供了兼容的“sendmail”命令,效果非常好。在我看来,sendmail 有点过时了,使用更现代的 MTA 更有可能获得支持。
答案2
这对我有用:
- 安装 postfix
请参阅此处有关如何执行此操作的说明: https://help.ubuntu.com/community/Postfix (它可能已经安装,并且“sendmail”二进制文件实际上可能是 postfix 的别名)
- 请按照此处的说明进行操作:
http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/
mkfifo /var/spool/postfix/public/pickup
查找
sendmail
进程ps aux | grep mail
杀了它
kill <thepid>
重新开始
postfix
/etc/init.d/postfix restart
我认为您可以将“myorigin”参数设置为任何活动域名,例如您拥有的域名。
答案3
这可能是也可能不是您的解决方案:添加到您的mail.force_extra_parameters = "[email protected]"
php.ini文件。它使 PHP 自动追加[电子邮件保护]作为 PHP 的 mail() 函数的第五个参数。
这是一个硬编码值,仅适用于 php.ini,因此它不太灵活,但也许在您的开发案例中适合您?
答案4
我从未遇到过在 PHP 中使用 mail() 时出现的问题,而该问题不是由 MTA 问题引起的。
在您的 php.ini 文件中,它将显示发送电子邮件时运行的命令(默认:“sendmail -t -i”)。尝试使用此命令从命令行发送电子邮件 - 我敢打赌它很慢。
通常要检查的是机器上的 DNS 服务器是否配置正确(并且能解析 MTA 中配置的所有地址),以及如果配置了智能中继,那么名称是否可以解析为系统可以连接的地址。