【问题标题】:Sending bulk mail using phpmailer使用 phpmailer 发送批量邮件
【发布时间】:2011-12-07 01:18:11
【问题描述】:

我是 Phpmailer 的新手,我正在使用它从一个 noreply 帐户向一千多人发送大量电子邮件。当我将电子邮件发送给一两个人时,代码可以正常工作,但是当我将其发送给所有人(包括我自己)时,它就会变成垃圾邮件。另一个问题是电子邮件的详细信息,它显示了我不希望它这样做的所有人的电子邮件 ID。 代码如下:

//date_default_timezone_set('America/Toronto');

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php  if not already loaded

$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host          = "smtp1.site.com;smtp2.site.com";
$mail->SMTPAuth      = true;// enable SMTP authentication
$mail->SMTPKeepAlive = true;// SMTP connection will not close after each email sent
$mail->Host          = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port          = 26;                    // set the SMTP port for the server
$mail->Username      = "yourname@yourdomain"; // SMTP account username
$mail->Password      = "yourpassword";        // SMTP account password
$mail->SetFrom('noreply@mydomain.com', 'List manager');
$mail->AddReplyTo('list@mydomain.com', 'List manager');
$mail->Subject       = 'Newsletter';
$ids = mysql_query($select, $connection) or die(mysql_error());
while ($row = mysql_fetch_row($ids)) {
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$mail->AddAddress($row[0]);
$mail->Send();//Sends the email
}

【问题讨论】:

    标签: php email phpmailer


    【解决方案1】:

    我认为您将新地址添加到已发送的电子邮件中 ​​- 所以第一封电子邮件将发送给一个人,第二封发送的电子邮件将发送给同一个人加上另一个人,第三封电子邮件将发送给这两个人再加一个,以此类推。

    另外,我认为您不需要每次都设置 AltBody 和 MsgHTML。

    您应该先将所有地址添加到密件抄送字段,然后发送。

    那就试试吧……

    // rest of code first
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
    $mail->MsgHTML($body);
    $mail->AddAddress("you@example.com")
    
    $ids = mysql_query($select, $connection) or die(mysql_error());
    while ($row = mysql_fetch_row($ids)) {
      $mail->AddBCC($row[0]);
    }
    
    $mail->Send();//Sends the email
    

    【讨论】:

    • Marc B 的代码比我原来的代码好——我描述的没错,但我的代码没有反映密件抄送的建议。您应该按照他的示例添加一个“收件人”收件人(通常是您自己,使用AddAddress),然后使用AddBCC 作为列表成员的电子邮件。我已经编辑了我的代码以反映这一点。谢谢你,马克!
    • 不仅不需要每次都设置 de MsgHTML,如果插入的文本在每封邮件中都不同,可能会产生不良影响
    【解决方案2】:

    使用密件抄送(密件抄送)隐藏收件人列表。 与垃圾邮件问题相关,取决于收件人的电子邮件提供商,哪些是垃圾邮件,哪些不是,有很多因素。

    【讨论】:

      【解决方案3】:

      正如 JoLoCo 所指出的,AddAddress() 方法只是将新地址添加到现有收件人列表中。而且由于您将其作为添加/发送循环进行,因此您向第一个收件人发送了大量重复的副本,向第二个收件人发送了更少的副本,等等......

      你需要的是:

      while($row = mysql_fetch_row(...)) {
         $mail->AddAddress($row[0]);
         $mail->send();
         $mail->ClearAllRecipients(); // reset the `To:` list to empty
      }
      

      另一方面,由于这会向您的邮件服务器发送大量单封电子邮件,因此另一种选择是生成一封单封电子邮件,并密件抄送所有收件人。

      $mail->AddAddress('you@example.com'); // send the mail to yourself
      while($row = mysql_fetch_row(...)) {
         $mail->AddBCC($row[0]);
      }
      $mail->send();
      

      这个选项很可能是更可取的。您只生成一封电子邮件,并让邮件服务器处理向每个收件人发送副本的繁重工作。

      【讨论】:

      • 密件抄送的问题在于它会被当作垃圾邮件。我在两个或三个不同的帐户上对其进行了测试,所有这些帐户都会发送垃圾邮件。
      • 您必须做其他事情,例如实施域密钥和 SPF 记录,并且可能将您的邮件转移到更“合法”的发送平台以缓解垃圾邮件问题。但除此之外,只需切换到使用 To:,因为 PHP 必须为每个收件人生成一封电子邮件。
      • 感谢漂亮的脚本,我得到了空电子邮件地址的想法 $mail->ClearAllRecipients()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2014-04-28
      相关资源
      最近更新 更多