背景:如果您为开发目的而设置了一个本地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。
这对我工作:
在这里看到如何做到这一点的说明: 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
find
sendmail
进程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,所以它不会很灵活,但也许在你的开发案例中适合你?