本地开发机器上的PHP邮件()函数痛苦缓慢

背景:如果您为开发目的而设置了一个本地apache服务器,那么您可能会遇到sendmail需要很长时间(至less一分钟)才能发送邮件的问题。 如果您尝试使用您生成的电子邮件debugging问题,这是非常令人沮丧的。

在互联网上有几个论坛post讨论这个问题。 然而,没有一个主题描述了我有限的知识足够的细节做什么。 以下是适合我的步骤:

1)使用这个命令find你的主机名(以防你忘记了):

:~$ cat /hosts/hostname

myhostname

2)编辑文件/etc/hosts ,并确保第一行是以下内容:

127.0.0.1 localhost.localdomain localhost myhostname

3)编辑sendmailconfiguration文件(Ubuntu中的/etc/mail/sendmail.cf )并取消注释#O HostsFile=/etc/hosts

4)重新启动电脑。 现在计算机启动要快得多,mail()函数应该立即返回。 但是,除非您按照步骤5进行,否则电子邮件实际上不会被发送。

5)每当使用邮件function时,您都必须重新使用sendmail'-f'选项。 例如:

mail('[email protected]', 'the subject', 'the message', null, '[email protected]');

我的同事服务失败者的问题是:

还有什么更改可以使我不必使用sendmail -f选项? 虽然添加-f选项并不难,但是当您的CMS(例如Drupal)在发送邮件时不使用-f选项时,这是一个问题。 你需要破解一个核心模块来添加这个选项。

那么我知道这不是你问的,但为什么你不试试Postfix或Exim? 它们都可以用于Ubuntu(Postfix甚至是Ubuntu系统上的默认mta),它们都提供了兼容的“sendmail”命令,效果很好。 恕我直言,sendmail是有点过时了,你会得到更好的机会支持更现代的MTA。

这对我工作:

  • 安装postfix

在这里看到如何做到这一点的说明: https : //help.ubuntu.com/community/Postfix (它可能已经安装,'sendmail'二进制可能实际上是一个后缀的别名)

  • 按照说明在这里:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

 mkfifo /var/spool/postfix/public/pickup 

findsendmail进程

 ps aux | grep mail 

杀了它

 kill <thepid> 

重新启动postfix

 /etc/init.d/postfix restart 

我想你可以将“myorigin”参数设置为任何活动域名,例如您拥有的域名。

通过观察networkingstream量(思考tcpdump )或者通过在sendmail或apache进程上运行strace ,您应该能够了解为什么会出现这种延迟,以便解决根本问题。

通常在这个范围内的延迟是由于DNS查询失败,但是直到你看,你才会知道。 除非你解决了潜在的问题,否则无论你如何解决这个问题,它最终都可能成为一个问题。

我从来没有遇到过一个问题,使用PHP中的邮件()不是在MTA问题的结果。

在你的php.ini文件中,它将显示发送邮件的命令(默认为“sendmail -t -i”)。 尝试使用这个从命令行发送电子邮件 – 我会打赌它的缓慢。

通常需要检查的是DNS服务器在机器上是否configuration正确(并且可以parsing在MTA中configuration的所有地址),并且如果configuration了智能继电器,名称可以parsing为系统可以连接的地址。

这可能或可能不是您的解决scheme:将mail.force_extra_parameters = "[email protected]"添加到您的php.ini文件。 它使PHP自动添加[email protected]作为PHP的mail()函数的第五个参数。

这是一个硬编码的值,只适用于php.ini,所以它不会很灵活,但也许在你的开发案例中适合你?