【发布时间】:2010-02-18 14:00:55
【问题描述】:
发送大量 html 电子邮件的最佳方式/类是什么?
(每封邮件都需要包含与发送地址相关联的信息(来自 mysql 数据库)
【问题讨论】:
发送大量 html 电子邮件的最佳方式/类是什么?
(每封邮件都需要包含与发送地址相关联的信息(来自 mysql 数据库)
【问题讨论】:
首先,我将所需的信息存储在一个临时表中(不是临时,只是我完成后删除的普通表)。
然后我生成邮件,边走边删除处理过的记录,并将生成的邮件放入“发件箱”表中。
最后,每 N 分钟触发一个脚本,从“发件箱”表中取出 M 条记录:它发送一封邮件,然后从发件箱表中删除该邮件。
为什么是瞬态表?因为这一切发生的服务器有非常严格的时间限制。使用上述方法可以让我部分生成邮件;您可以安全地重新运行生成阶段,而不必担心会生成重复的邮件。因此,尽管服务器终止了作业,但脚本仍会取得进展。
发送脚本每小时发送 (60 / N)*M 封邮件,再次在服务器的约束范围内工作。
【讨论】:
我建议使用 Pear 包 Mail (http://pear.php.net/package/Mail) 和 Mail_Mime (http://pear.php.net/package/Mail_Mime)。
如果你需要排队系统,你可以试试 gearman (http://gearman.org/)
【讨论】:
我使用Zend_Mail。以下示例(来自docs)展示了如何通过单个 SMTP 连接发送多封邮件:
// Create transport
$config = array('name' => 'sender.example.com');
$transport = new Zend_Mail_Transport_Smtp('mail.example.com', $config);
// Set From & Reply-To address and name for all emails to send.
Zend_Mail::setDefaultFrom('sender@example.com', 'John Doe');
Zend_Mail::setDefaultReplyTo('replyto@example.com','Jane Doe');
// Loop through messages
for ($i = 0; $i < 5; $i++) {
$mail = new Zend_Mail();
$mail->addTo('studio@example.com', 'Test');
$mail->setSubject(
'Demonstration - Sending Multiple Mails per SMTP Connection'
);
$mail->setBodyText('...Your message here...');
$mail->send($transport);
}
// Reset defaults
Zend_Mail::clearDefaultFrom();
Zend_Mail::clearDefaultReplyTo();
您只需要修改循环以从数据库中获取特定于要发送的每条消息的数据。此外,您不需要整个 框架来使用Zend_Mail。
看看: http://framework.zend.com/manual/en/zend.mail.multiple-emails.html
【讨论】:
我认为首先考虑的是这可能需要一些时间来处理 - 所以不应该作为同步网络请求来完成 - 请参阅
Best way to manage long-running php script?
然后有各种各样的关于创建 HTML 电子邮件的问题。您可能想查看用于生成电子邮件本身的现成软件包之一,例如 phpmailer。或者,如果内容非常复杂,您可以考虑将其设置为网页,可能使用模板系统 - 但请记住限制对其的任何外部访问。例如
<?php
if ($_SERVER["REMOTE_ADDR"]!='127.0.0.1') {
die ('NO ACCESS!');
}
$send_to=$_GET['email'];
$dbh=mysql_connect(...);
....
然后在你的脚本中:
....
$content=file('http://localhost/generate_email.php?email='
. urlencode($db_row['recipient']));
mail($db_row['recipient'], $subject, $content);
HTH
C.
【讨论】:
我喜欢 Karim 的想法,尽管我会在 $mail->send($transport) 周围添加一个 try/catch,这样您就可以跟踪已发送和未发送的内容,并相应地记录或在相关数据库中标记。
【讨论】: