php - zend smtp 邮件在 100 多封邮件后崩溃

标签 php email ssl zend-framework2 smtp

在发送类似时事通讯的邮件时,我遇到了这个奇怪的问题。

在 for 循环中,我遍历数据库中的所有用户,并尝试向他们发送一封包含一些基本信息的 HTML 邮件。现在问题是前 200 封左右的邮件运行良好,但随后脚本崩溃并给出以下错误:

Warning: fwrite(): SSL operation failed with code 1. OpenSSL Error messages: error:140D00CF:SSL routines:SSL_write:protocol is shutdown in /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php on line 263 Warning: fwrite(): SSL operation failed with code 1. OpenSSL Error messages: error:140D00CF:SSL routines:SSL_write:protocol is shutdown in /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php on line 263 Fatal error: Uncaught exception 'Zend\Mail\Protocol\Exception\RuntimeException' with message 'Could not read from smtp.gmail.com' in /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php:308 Stack trace: #0 /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php(339): Zend\Mail\Protocol\AbstractProtocol->_receive(300) #1 /opt/zendframework2/library/Zend/Mail/Protocol/Smtp.php(358): Zend\Mail\Protocol\AbstractProtocol->_expect(221, 300) #2 /opt/zendframework2/library/Zend/Mail/Protocol/Smtp.php(394): Zend\Mail\Protocol\Smtp->quit() #3 /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php(115): Zend\Mail\Protocol\Smtp->_disconnect() #4 [internal function]: Zend\Mail\Protocol\AbstractProtocol->__destruct() #5 {main} thrown in /opt/zendframework2/library/Zend/Mail/Protocol/AbstractProtocol.php on line 308

现在,我不太熟悉 smtp、ssl 和 tls,但我相信错误中最重要的一行是:“无法从 smtp.gmail.com 读取”。这对我来说没有任何意义。

我们一直在发送电子邮件(丢失密码、注册邮件等),这(据我所知)总是很好用。脚本在短时间内发送过多邮件后崩溃。

好的,这就是问题所在,现在让我解释一下设置:)

我在标准 LAMP 服务器 (PHP 5.3.10) 上运行 Zend 2.2.6,并使用 Zend 提供的标准 SMTP 邮件脚本。我们使用谷歌商业应用程序作为邮件客户端。以下是邮件脚本的前几行:

  <?PHP
    namespace Mail\Mails;
    use Zend\Mail;
    use Zend\Mail\Message;
    use Zend\Mime\Message as MimeMessage;
    use Zend\Mime\Part as MimePart;
    use Zend\Mail\Transport\Smtp as SmtpTransport;
    use Zend\Mail\Transport\SmtpOptions;
    use Mail\Config\Config;

    class Base
    {
        private $transport, $text, $html, $to, $subject;

        public function __construct()
        {
            $config     = new Config();
            $transport  = new SmtpTransport();
            $options    = new SmtpOptions(array(
                'name'  => 'mydomain.com',
                'host'  => 'smtp.gmail.com',
                'port'  => 587,
                'connection_class'  => 'login',
                'connection_config' => array(
                    'username'  => $config->username,
                    'password'  => $config->password,
                    'ssl'       => 'tls'
                ),
            ));

            $transport->setOptions($options);
            $this->transport = $transport;

            // This happens in different parts of the code.
            $this->subject( $subject );
            $this->to( $address );
            $this->html( $html );
            $this->text( $text );
            $this->send();
        }

    ?>

到目前为止我尝试了什么:

  1. 再次运行脚本
    • 这有不同的结果:有时它中断得更早,有时它中断得更远,但这证明脚本不会在特定地址中断。我感觉服务器有点冷却:第一次运行它处理 200 个地址,但是当我之后直接重新运行脚本时,它可能会在 20 个地址后中断。当我大约一个小时后尝试时,脚本在大约 200 个地址后再次中断。
  2. 我尝试将 ssl 选项更改为“ssl”,将端口选项更改为“465”,但结果完全相同。

有人熟悉这个问题吗?我不太确定在哪里寻找问题,也许有人可以给我一个正确方向的插入?

提前致谢!

最佳答案

较旧的站点,但可能是您的问题

http://www.serversmtp.com/en/limits-of-gmail-smtp-server

That's because Google places all sorts of limits on the use of its SMTP service by marketers. Those limits begin with a restriction on the number of recipients who can receive the same message. If Gmail's SMTP server detects that your message is going to more than 500 people, it disables your account.

关于php - zend smtp 邮件在 100 多封邮件后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163462/

相关文章:

javascript - Angular js表单提交并将准备好的json数据发送到服务器

php - 有没有办法判断在测试中是否将 --debug 或 --verbose 传递给了 PHPUnit?

php - SQL 通过条件连接其他表

ios - Delphi XE2/FireMonkey 电子邮件创建

带有文本/html但没有纯文本/文本的电子邮件

javascript - 带有 Mailgun 的 AJAX 函数,获取 "ERROR Request header field Authorization is not allowed by Access-Control-Allow-Headers"

java - 限制 java ssl 调试日志记录

ssl - 在 nginx 中为 nextcloud 反向代理?

html - 中等公共(public)站点的体面 HTTPs 实现是否始终是付费解决方案?

PHP输出到变量