如何使用swiftmailer发送多个不相关的电子邮件?

时间:2015-12-11 16:16:38

标签: php email swiftmailer

我希望有一个通过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();
}

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

编辑: 从我自己的测试来看,似乎我需要为每封电子邮件提供一个新的传输实例。这是真的吗,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

这取决于您的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目标的唯一原因是你有附件。否则,您只需要一个$message对象,您可以在while循环中切换收据,发件人,主题和正文。