使用php发送(相对)大量的html电子邮件

时间:2010-02-18 14:00:55

标签: php email

发送大量html电子邮件的最佳方式/类是什么?

(每封邮件都需要包含链接到其发送地址的信息(来自mysql数据库)

5 个答案:

答案 0 :(得分:2)

首先,我将所需的信息存储在临时表中(不是临时,只是我完成后丢弃的普通表)。

然后我生成邮件,在我去的时候删除已处理的记录,并将生成的邮件放入“发件箱”表中。

最后,脚本每N分钟触发一次,将M记录从“发件箱”表中删除:它发送邮件,然后从发件箱表中删除该邮件。

为什么是瞬态表?因为发生这一切的服务器具有非常严格的时间限制。使用上述方法可以让我部分生成邮件;您可以安全地重新运行生成阶段,而无需担心生成重复的邮件。因此,尽管服务器终止了这项工作,但该脚本仍然取得了进展。

发送脚本每小时发送一次(60 / N)* M封邮件,再次在服务器的限制范围内工作。

答案 1 :(得分:2)

我建议使用Pear包Mail(http://pear.php.net/package/Mail)和Mail_Mime(http://pear.php.net/package/Mail_Mime)。

如果您需要排队系统,可以尝试使用gearman(http://gearman.org/

答案 2 :(得分:1)

我使用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

答案 3 :(得分:1)

我认为首先要考虑的是可能需要一些时间来处理 - 所以不应该作为同步网络请求来完成 - 请参阅

Best way to manage long-running php script?

然后有关于创建HTML电子邮件的各种问题。您可能希望查看其中一个现成的软件包,例如phpmailer,以生成电子邮件本身。或者,如果内容非常复杂,您可以考虑将其设置为网页,也许使用模板系统 - 但请记住限制对它的任何外部访问。 e.g。

<?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

下进行。

答案 4 :(得分:0)

我喜欢Karim的想法,虽然我会在try/catch周围加$mail->send($transport)这样你可以跟踪已发送的内容和未发送的内容,并相应地记录或在相关数据库。