【问题标题】:Problems with bulk mailing phpmailer群发邮件phpmailer的问题
【发布时间】:2012-11-16 05:52:40
【问题描述】:

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

【问题讨论】:

  • 您使用 SMTP 服务器吗?它是哪一个?例如,gmail 服务器不允许每天发送超过 100 封电子邮件或更多。
  • 我们使用自己的域 smtp。它不在 gmail 上,但它也有一个限制,这就是我们购买按需付费服务的原因。

标签: php email smtp phpmailer


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

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

【讨论】:

  • 这不是附件,而是嵌入,但我不确定在这种情况下是否有区别。
  • 就邮件格式而言,它们是一回事。如果你是盗链,你就可以阅读 5000 次 300kb。
  • 我猜你是对的。我确实建议过,但我工作的公司不想这样做 -.- 无论如何,关于第 2 点,我的查询不适合吗?它现在已经发送了 2000 封电子邮件,我不知道如何将所有已发送的邮件一一标记:/ 但如果您有任何建议,我愿意接受
  • 最终,您的操作方式很好。但是,我的建议与我对第 1 点的回答的最后一句话有关:考虑使用工作者方法,尤其是在超时的情况下!让工人完成工作,并获得一个数据库,告诉他们该做什么(各种各样的队列)。他们成功地做某事,他们将其从队列中弹出(或将其标记为已完成)。我的表结构允许你这样做——这对未来来说是个好主意:-)
  • 好的,谢谢你的提示。将来会这样做!也许您对为什么邮件重复有任何想法?
【解决方案2】:

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

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

类似:

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

应该更适合你。

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

【讨论】:

  • 我想我有点习惯 do while 了,因为我使用的是 Dreamweaver,它会生成这样的循环。
猜你喜欢
  • 2012-04-14
  • 2018-06-22
  • 2016-06-05
  • 1970-01-01
  • 2010-12-20
  • 2017-09-23
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多