批量邮寄phpmailer的问题

时间:2012-11-28 11:31:24

标签: php email smtp phpmailer

我有一个已经开始发送邮件的工作邮件脚本。我们需要向大约5,000个电子邮件地址发送电子邮件。我有一些问题。

1。)它的发送速度非常慢。我猜它是嵌入式的吗?图像是300 + kb大,是否应该减慢发送速度?邮件每分钟发送3封电子邮件。如果我们想要将电子邮件发送给5000个收件人,那么它将花费大量时间。代码是这样的:

$mail->AddEmbeddedImage("rocks.png", "my-attach", "rocks.png");
$mail->Body = 'Embedded Image: <img src="cid:my-attach"> 

2.)我们已经注册了一个smtp,它不会限制我们每天100封电子邮件。它就像你去的那样付费,它跟踪发送的消息。当我检查日志时,有重复的消息。有一些收件人被发送两次,奇怪的是它只是尝试发送消息两次,然后移动到下一个电子邮件地址。问题在于它消耗了我们对smtp服务的限制,并且在邮件中添加了太多队列,这使得发送更长。我的发送代码类似于:

if(isset($fromaddress)){
do{
$mail->AddAddress($row['email']);
$mail->Send();
$mail->ClearAddresses();
}
while ($row = mysql_fetch_array ($result));
}

我的查询类似于:

SELECT * from email where id > 200

您可能想知道我的查询。由于连接问题,我需要从中断的地方发送邮件,因此我创建了一个id列,并将该号码指定为邮件发送到的最后一个电子邮件地址的ID。我不知道这是否明智,但那是我现在所拥有的。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

  1. 根据PHPMailer的构建方式,是的,它可能会非常好地减慢它的速度。原因很简单:如果您将邮件作为附件邮寄,则邮件调用必须知道邮件的确切字节大小。它通过准备它来做到这一点,其中包括完整地阅读图像。这对一封电子邮件来说是一个相当小的延迟,但如果必须这样做5000次......考虑排队和工人的做法。

  2. 在数据库中添加一个字段,将其命名为mailSent,输入BIT。每次发送一个,将其设置为1以获得相应的行。要选择电子邮件,请SELECT * FROM mails WHERE mailSent='0' LIMIT 100

答案 1 :(得分:0)

我不确定这是否是你问题第2部分的答案,但是你有充分的理由使用do-while循环而不是一段时间吗?

从我所看到的代码中,第一次迭代将尝试在设置$ row之前添加来自$row['email']的电子邮件地址?

类似的东西:

while ($row = mysql_fetch_array($result)) {
    $mail->AddAddress($row['email']);
    //etc
}

应该更适合你。

不确定这应该是评论而不是答案,但我无论如何都无法发表评论。