Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP SwiftMailer和SMTP发送新闻稿_Php_Email_Postfix Mta_Swiftmailer_Newsletter - Fatal编程技术网

使用PHP SwiftMailer和SMTP发送新闻稿

使用PHP SwiftMailer和SMTP发送新闻稿,php,email,postfix-mta,swiftmailer,newsletter,Php,Email,Postfix Mta,Swiftmailer,Newsletter,我每天向大约2万名收件人发送一份时事通讯。在转移到其他服务器之后,我使用相同的PHP脚本需要大约六倍多的时间来完成这项工作——我尝试了许多不同的设置,但没有成功()。电子邮件服务器似乎已正确配置(关于垃圾邮件、中继和病毒),服务器使用Plesk 11.5.30运行 通过多次实验、更改PHP脚本和后缀设置,我能够通过以下方式获得最佳性能: 使用SwiftMailer从PHP发送电子邮件 使用SMTP(本地帐户)作为传输 将收件人列表分为四个部分,并为每个部分启动单独的PHP-CLI过程 当我只启动

我每天向大约2万名收件人发送一份时事通讯。在转移到其他服务器之后,我使用相同的PHP脚本需要大约六倍多的时间来完成这项工作——我尝试了许多不同的设置,但没有成功()。电子邮件服务器似乎已正确配置(关于垃圾邮件、中继和病毒),服务器使用Plesk 11.5.30运行

通过多次实验、更改PHP脚本和后缀设置,我能够通过以下方式获得最佳性能:

  • 使用SwiftMailer从PHP发送电子邮件
  • 使用SMTP(本地帐户)作为传输
  • 将收件人列表分为四个部分,并为每个部分启动单独的PHP-CLI过程
  • 当我只启动一个进程时,PHP每秒发送大约5封电子邮件(这与我使用mail()函数发送电子邮件时大致相同)。Postfix在“动态”发送它们时没有问题,因此几乎没有队列

    当我启动四个进程时,PHP每秒发送大约10封电子邮件,但是postfix无法“动态”发送它们(它每秒只能发送大约5封电子邮件)因此,队列变得越来越大。当PHP进程结束时,我的队列中大约有4500封电子邮件。有趣的是:当不再有活动的PHP进程发送电子邮件时,Postfix会加速“大约每秒发送20封电子邮件。当PHP发送新电子邮件时,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
    

    嘿,我找不到你设置的确切问题,但我已经阅读了可能有助于找到确切时间延迟的注释。请参考,你也可以通过


    关于swiftmailer的设置,请参考

    ,因为您写的PHP进程每秒发送大约5或20封邮件,我假设您已经在详细测量PHP代码,因此如果PHP代码中存在此延迟,您应该已经发现了

    阅读评论,我还认为您的系统相当大,所以您有足够的ram和磁盘

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

    另一方面,我甚至记得postfix有一个节流配置,以避免服务器滥用

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

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

    strace -fp <pid of main process>
    
    strace-fp
    

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

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

    如果您的PHP进程完成后Postfix变得更快,可能是CPU问题?当PHP进程运行时,
    top
    说明了什么?您是在共享服务器上还是在VPS上?什么规范?我们使用的是一个专用服务器,实际上没有太多工作要做。CPU和内存不是问题-我们有足够的资源(今天我们发送时事通讯时我再次检查了这个问题)。运行iostat-m-x-d5时,我发现磁盘使用率非常高(%util高达100%——当PHP和Postfix完成时,大约是10%——这可能与我们的性能问题有关吗?)我不知道的是,为什么新服务器上的PHP能够在一个进程中每秒最多发送5-7封邮件(如果只运行一个进程),而我们的旧服务器每秒可以发送20个或更多。我不是服务器问题专家,但100%的问题都值得进一步研究,当然。它是否说PHP和Postfix中的哪一个是造成这种使用水平的原因?PHP似乎是造成这种高使用率的原因。我真正不喜欢的是我必须启动许多程序ses。在旧服务器上,我启动了一个进程,PHP能够每秒“传输”大约20封邮件到Postfix。所以问题是,我必须做些什么来加快PHP的邮件发送速度。邮件日志中没有关于“不合格主机名”或“名称解析失败”的内容?当听起来一切都发生了变化时,很难用“发生了什么变化”来诊断。