php mail()函数在本地开发计算机上的速度缓慢


21

背景:如果您出于开发目的而设置了本地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('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

我对服务器故障同行的问题是:

可以进行哪些进一步的更改,使我不必使用sendmail -f选项?尽管添加-f选项不是很困难,但是当您的CMS(例如Drupal)在发送邮件时不使用-f选项时,这是一个问题。您可能需要破解一个核心模块才能添加此选项。


1
在我的Ubuntu系统上,命令是cat /etc/hostname
zkent 2014年

Answers:


6

好吧,我知道这不是您要的内容,但是为什么您不尝试Postfix或Exim?它们都可用于ubuntu(Postfix甚至是Ubuntu系统上的默认mta),并且都提供了兼容的'sendmail'命令,效果很好。恕我直言sendmail是一种过时的,您将有更多的机会通过更现代的MTA获得支持。


即使有比sendmail更好的邮件系统,问题仍然在于维护可镜像生产服务器的开发服务器。sendmail是php的默认邮件代理。
Michael B

1
您是说sendmail是软件还是sendmail是二进制文件?由于sendmail兼容性,Exim和Postfix也具有与原始sendmail接受相同选项的二进制文件。
coredump

从过去的经验来看,我不是Exim的忠实拥护者,但是尝试了Postfix并解决了我们立即与Sendmail一起发生的问题。
quickshiftin 2012年

2

这为我工作:

  • 安装后缀

在此处查看有关如何执行此操作的说明: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”参数设置为任何活动域名,例如您拥有的域名。


完善!这让我困扰了两个小时之后吗?=)
汉尼斯·施耐德

1

这可能对您来说不是解决方案:将其添加mail.force_extra_parameters = "-fsender@somewhere.com"php.ini文件中。它使PHP自动将-fsender@somewhere.com附加为PHP的mail()函数的第五个参数。

这是一个硬编码的值,仅适用于php.ini,因此它不会非常灵活,但在您的开发案例中也许对您有用?


0

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

通常,该范围内的延迟是由于DNS查找失败而引起的,但是直到您查找时您才知道。除非您解决根本的问题,否则无论您如何尝试解决它,它最终都可能成为问题。


1
延迟是由于主机名是一个单词而不是FQDN(完全限定的域名)引起的。通过将sendmail指向/ etc / hosts并将localhost.domain作为第一个域名(它是FQDN),没有延迟。在步骤1-4中已解决此问题。剩下的问题是必须使用'-f'-仍然需要等待2分钟才能发送邮件,这是一个重大改进。
Michael B 2010年

0

我从未遇到过在PHP中使用mail()的问题,这不是MTA上的问题造成的。

在您的php.ini文件中,它将显示它运行什么命令来发送电子邮件(默认值:“ sendmail -t -i”)。尝试使用此命令从命令行发送电子邮件-我敢打赌,它很慢。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.