【问题标题】:How do I send multiple unrelated emails with swiftmailer?如何使用 swiftmailer 发送多封不相关的电子邮件?
【发布时间】:2016-03-17 15:01:16
【问题描述】:

我想要一个通过 cron 处理的电子邮件队列,每 30 秒发送一次电子邮件,将发送的电子邮件限制为 100 封。swiftmailer 文档没有明确说明如何在单个 SMTP 连接中完成此操作.我知道我基本上需要重置所有消息和附件参数,但希望获得有关循环位置和循环内容的建议。

例如,我是否需要为每封电子邮件创建一个新邮件:

$transport = Swift_SmtpTransport::newInstance( $params['smtp_host'], $params['smtp_port'] )
   ->setUsername( $params['smtp_user'] )
   ->setPassword( $params['smtp_pass'] );
foreach( $emails as $email ){
  $mailer = Swift_Mailer::newInstance( $transport );
  //...
  $this->reset();
}

或者可以将同一个邮件程序用于多封不相关的电子邮件吗?我是否真的需要为每封电子邮件使用新的传输方式:

foreach( $emails as $params ){
  $transport = Swift_SmtpTransport::newInstance( $params['smtp_host'], $params['smtp_port'] )
     ->setUsername( $params['smtp_user'] )
     ->setPassword( $params['smtp_pass'] );
  $mailer = Swift_Mailer::newInstance( $transport );
  //...
  $this->reset();
}

我在网上的任何地方都找不到这样的例子。

编辑: 根据我自己的测试,我似乎需要为每封电子邮件创建一个新的传输实例。这是真的,还是我做错了什么?

【问题讨论】:

    标签: php email swiftmailer


    【解决方案1】:

    这取决于您的 SMTP 服务器。但是,如果您使用一个 cronjob 在 30 秒内发送 100 封电子邮件,那么您可能只需要一个邮件程序和一个传输实例。然后你可以像这样在一个循环中创建多个消息对象:

    // Create the Transport
    $transport = Swift_SmtpTransport::newInstance('****', 25);
    //$transport->setUsername('****');
    //$transport->setPassword('***');
    $transport->setUsername('***');
    $transport->setPassword('***');
    // Create the Mailer using your created Transport
    $mailer = Swift_Mailer::newInstance($transport);
    
    $db = createDB();
    $sql = "SELECT * FROM emailQueue WHERE send = '0000-00-00 00:00:00' ORDER BY id LIMIT 5";
    $result = $db->query($sql);
    
    while ($row = $result->fetch_assoc()) {
      // Create the message
      $message = Swift_Message::newInstance();
    
      // Give the message a subject
      $message->setSubject($row['subject']);
    
      // Set the From address with an associative array
      $message->setFrom(..);
    
      // Set the To addresses with an associative array
      $message->setTo($$row['receiver']);
      ..
    
     // send message
     $mailer->send($message);
    }
    

    但是,许多 SMTP 服务器对在任何单个 SMTP 连接期间可以发送的邮件数量都有限制。如果您接近该限制(100 可能是一个现实的限制),那么您应该在达到该限制之前重新连接。这可以通过 swiftmailer 的 anti-flood plugin 轻松实现。

    我能想到为每个循环创建一个新的$message objecte 的唯一原因是您是否有附件。否则,您只需要一个$message 对象,您就可以在while 循环内切换收据、发件人、主题和正文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2011-02-08
      相关资源
      最近更新 更多