使用PHP SwiftMailer和SMTP发送简报

时间:2013-10-30 13:12:01

标签: php email postfix-mta swiftmailer newsletter

我每天向大约20,000名收件人发送简报。移动到其他服务器后,我需要大约六倍的时间使用相同的PHP脚本 - 我尝试了许多不同的设置,但没有运气(please see this post)。电子邮件服务器似乎已正确配置(关于垃圾邮件,中继和病毒),服务器运行Plesk 11.5.30。

做了很多实验,更改了PHP脚本和Postfix设置我能够通过以下方式获得最佳性能:

  1. 使用SwiftMailer从PHP发送电子邮件。
  2. 使用SMTP(本地帐户)作为传输。
  3. 将收件人列表分为四个部分,并为每个部分启动单独的PHP-CLI流程。
  4. 当我只启动一个进程时,PHP发送大约5封电子邮件/秒(当我使用mail()函数发送电子邮件时大致相同)。发送它们“在运行中”没有问题,所以没有队列。

    当我启动四个进程时,PHP发送大约10封电子邮件/秒,但是后缀不再能够“动态”发送它们(它只能发送大约5封电子邮件/秒),因此队列变得越来越大。当PHP进程结束时,我的队列中有大约4500封电子邮件。这里有一个有趣的部分:当没有更多活跃的PHP进程发送电子邮件时,Postfix“加速”发送大约20封电子邮件/秒。当PHP发送新电子邮件时,Postfix是否能够以此速率发送电子邮件?没有队列,它会解决我的问题。

    我很感激我能做些什么来改善我的脚本和服务器发送简报的性能。

    Postfix配置:

    root@hostname:~# postconf -n 
    alias_database = hash:/etc/aliases 
    alias_maps = hash:/etc/aliases, hash:/var/spool/postfix/plesk/aliases 
    append_dot_mydomain = no 
    biff = no 
    config_directory = /etc/postfix 
    disable_vrfy_command = yes 
    inet_interfaces = all 
    inet_protocols = ipv4 
    mailbox_size_limit = 0 
    mailman_destination_recipient_limit = 1 
    message_size_limit = 51200000 
    mydestination = (none), localhost, localhost.localdomain, localhost 
    mydomain = domain.com 
    myhostname = myhostname.com 
    mynetworks = 127.0.0.0/8 [::1]/128 my.ip.add.ress 
    plesk_virtual_destination_recipient_limit = 1 
    readme_directory = no 
    recipient_delimiter = + 
    relayhost = 
    sender_dependent_default_transport_maps = hash:/var/spool/postfix/plesk/sdd_transport_maps 
    smtp_connect_timeout = 10s 
    smtp_helo_timeout = 100s 
    smtp_send_xforward_command = yes 
    smtp_tls_security_level = may 
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 
    smtp_use_tls = no 
    smtpd_authorized_xforward_hosts = 127.0.0.0/8 [::1]/128 
    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) 
    smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org 
    smtpd_proxy_timeout = 3600s 
    smtpd_recipient_restrictions = permit_mynetworks, check_client_access pcre:/var/spool/postfix/plesk/no_relay.re, permit_sasl_authenticated, reject_unauth_destination 
    smtpd_sasl_auth_enable = yes 
    smtpd_sender_restrictions = check_sender_access hash:/var/spool/postfix/plesk/blacklists, permit_sasl_authenticated, check_client_access pcre:/var/spool/postfix/plesk/non_auth.re 
    smtpd_timeout = 3600s 
    smtpd_tls_cert_file = /etc/postfix/postfix_default.pem 
    smtpd_tls_key_file = $smtpd_tls_cert_file 
    smtpd_tls_security_level = may 
    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache 
    smtpd_use_tls = yes 
    transport_maps = , hash:/var/spool/postfix/plesk/transport 
    virtual_alias_maps = $virtual_maps, hash:/var/spool/postfix/plesk/virtual 
    virtual_gid_maps = static:31 
    virtual_mailbox_base = /var/qmail/mailnames 
    virtual_mailbox_domains = $virtual_mailbox_maps, hash:/var/spool/postfix/plesk/virtual_domains 
    virtual_mailbox_limit = 0 
    virtual_mailbox_maps = , hash:/var/spool/postfix/plesk/vmailbox 
    virtual_transport = plesk_virtual 
    virtual_uid_maps = static:110
    

3 个答案:

答案 0 :(得分:2)

由于你写的关于你的PHP进程每秒发送大约5或20封邮件,我想你已经在详细测量你的PHP代码了,所以如果这个延迟在PHP代码中,那么你应该已经发现了。< / p>

阅读评论我还认为你的系统非常庞大,所以你有足够的ram和磁盘。

根据我的经验,可能导致此类延迟的一个非常常见的问题是DNS解析,嗯,我的意思是DNS的错误配置,导致一直延迟。 但这个假设有待证明。

另一方面,我甚至记得postfix有一个限制配置,以避免服务器滥用。 http://www.postfix.org/TUNING_README.html

最后,如果你在postfix配置中找不到任何东西,我可以建议你尝试在执行期间使用实用程序strace来调试postfix进程。

这是一个非常有用的实用程序,当我必须调试非常见问题时,我经常使用它。 简而言之:strace列出了进程完成的所有系统调用。 strace中有很多选项,但我通常只使用:

strace -fp <pid of main process>

在调试期间,您将看到postfix主进程及其所有子进程执行的所有系统调用。如果添加-c选项,则会看到每次系统调用所花费的时间。

答案 1 :(得分:0)

嘿我找不到您设置的确切问题,但我已经阅读了可能有助于找到确切时间延迟的注释。请参阅http://ubuntuforums.org/showthread.php?t=2007309,您也可以按http://liangsun.org/posts/configure-mail-service-with-php-mail-function-and-postfix/

重新检查您的代码

有关swiftmailer的设置,请参阅https://bbs.archlinux.org/viewtopic.php?id=82062

答案 2 :(得分:0)

感谢您的所有答案和努力。幸运的是,我能够找到问题的主要原因 - 它是在硬盘上保存队列。我们将其更改为RAM,现在每秒可以发送大约30封电子邮件。