我有一个已经开始发送邮件的工作邮件脚本。我们需要向大约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。我不知道这是否明智,但那是我现在所拥有的。有什么建议吗?
答案 0 :(得分:1)
根据PHPMailer的构建方式,是的,它可能会非常好地减慢它的速度。原因很简单:如果您将邮件作为附件邮寄,则邮件调用必须知道邮件的确切字节大小。它通过准备它来做到这一点,其中包括完整地阅读图像。这对一封电子邮件来说是一个相当小的延迟,但如果必须这样做5000次......考虑排队和工人的做法。
在数据库中添加一个字段,将其命名为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
}
应该更适合你。
不确定这应该是评论而不是答案,但我无论如何都无法发表评论。