0

我有一个已经开始发送邮件的工作邮件脚本。我们需要向大约 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。我不知道这是否明智,但这就是我目前所拥有的。有什么建议么?

4

2 回答 2

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

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

于 2012-11-28T11:34:17.467 回答
0

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

根据我对您的代码的了解,第一次迭代将尝试$row['email']在 $row 设置之前添加一个电子邮件地址?

就像是:

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

应该对你更好。

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

于 2012-11-28T11:41:05.870 回答