我希望有一个通过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();
}
在网上看的任何地方,我都找不到这样的例子。
编辑: 从我自己的测试来看,似乎我需要为每封电子邮件提供一个新的传输实例。这是真的吗,还是我做错了什么?
答案 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循环中切换收据,发件人,主题和正文。