使用PHP mailer发送2封电子邮件失败

使用PHP mailer发送2封电子邮件失败,php,email,phpmailer,Php,Email,Phpmailer,我对这一点相当困惑 //SMTP servers details $mail->IsSMTP(); $mail->Host = "mail.hostserver.com"; $mail->SMTPAuth = false; $mail->Username = $myEmail; // SMTP usr $mail->Password = "****"; // SMTP pass $mail->SMTPKeepAlive = true;

我对这一点相当困惑

//SMTP servers details
$mail->IsSMTP(); 
$mail->Host = "mail.hostserver.com";  
$mail->SMTPAuth = false;     
$mail->Username = $myEmail;  // SMTP usr
$mail->Password = "****";    // SMTP pass
$mail->SMTPKeepAlive = true;   
$mail->From = $patrickEmail; 
$mail->FromName = "***";    
$mail->AddAddress($email, $firstName . " " . $lastName); 
$mail->WordWrap = 50;                                 
$mail->IsHTML(true);                                  
$mail->Subject = $client_subject;
$mail->Body    = $client_msg;

if($mail->Send())
{

$mail->ClearAllRecipients(); 
$mail->ClearReplyTos();
$mail->ClearCustomHeaders();
...
$mail->From = "DO_NOT_REPLY@..."; 
$mail->FromName = "****";    
$mail->AddAddress($ToEmail1, "***"); //To: (recipients).
$mail->AddAddress($ToEmail2, "***"); //To: (recipients).
$mail->WordWrap = 50;            
$mail->IsHTML(true);             
$mail->Subject = $notification_subject;
$mail->Body    = $notification_msg;
if($mail->Send())
{
...
第一封电子邮件发送得很好。第二个没有。这种行为的原因是什么?我是否错过了某种重置


更新:使用不同的邮件服务器似乎有效,显然是特定邮件服务器的设置导致了问题。你知道那是什么吗?

关键可能在于你遗漏的部分。两封电子邮件的发件人的域是否相同?否则,SMTP主机可能会将此视为中继尝试。如果您有权访问SMTP服务器日志,请检查这些日志;他们可能会提供线索


另外,检查
$mail->ErrorInfo
所说的内容。。。它可能会告诉您问题所在。

某些提供商对在特定时间范围内可以发送的邮件数量施加限制。要确定您的问题是否取决于提供商的“速率限制”,您应该尝试在第一次发送后添加暂停。例如:

if ($mail->Send()) {
    sleep(10);  // Seconds
    ...
    if ($mail->Send()) {
        ...
    }
}

然后,通过逐步降低睡眠时间,您应该能够确定哪一个是速率限制。

i您需要为每个发送的电子邮件创建新的PHPMailer对象。如果要共享一些常见的设置,请使用以下方法:

$mail = new PHPMailer();
/* Configure common settings */

while ($row = mysql_fetch_array ($result)) {
    $mail2 = clone $mail;
    $mail2->MsgHTML("Dear ".$row["fname"].",<br>".$cbody);
    $mail2->AddAddress($row["email"], $row["fname"]);
    $mail2->send();
}
$mail=new PHPMailer();
/*配置常用设置*/
while($row=mysql\u fetch\u数组($result)){
$mail2=克隆$mail;
$mail2->MsgHTML(“亲爱的”。$row[“fname”]”,
“$cbody); $mail2->AddAddress($row[“email”],$row[“fname”]); $mail2->send(); }
我想你的问题是
$mail->SMTPAuth=false

很难相信有ISP或SMTP提供商不需要身份验证,即使它们是免费的

您可以尝试此操作来检查错误,而不是检查
send()
true:

  if ( $mail->IsError() ) { // 
    echo ERROR;
  }
  else {
    echo NO ERRORS;
  }

 //Try adding this too, for debugging:
  $mail->SMTPDebug  = 2;  // enables SMTP debug information

代码中的其他所有内容看起来都很好。我们经常使用PHPMailer,从来没有遇到过任何问题

我个人会尝试采取一些小步骤,比如发送相同的电子邮件。。所以,只需清除收件人并尝试发送相同的电子邮件(此代码适用于我)。如果此代码通过,您可以继续添加回以前的代码行,并在失败的地方进行调试

也许
$mail->ClearCustomHeaders()处理问题

//SMTP servers details
$mail->IsSMTP(); 
$mail->Host = "mail.hostserver.com";  
$mail->SMTPAuth = false;     
$mail->Username = $myEmail;  // SMTP usr
$mail->Password = "****";    // SMTP pass
$mail->SMTPKeepAlive = true;   
$mail->From = $patrickEmail; 
$mail->FromName = "***";    
$mail->AddAddress($email, $firstName . " " . $lastName); 
$mail->WordWrap = 50;                                 
$mail->IsHTML(true);                                  
$mail->Subject = $client_subject;
$mail->Body    = $client_msg;
// all above is copied
if($mail->Send()) {
  sleep(5);
  $mail->ClearAllRecipients(); 
  $mail->AddAddress('another@email.com'); //some another email

}
...

我认为你在组织上有问题

我建议:

  • 设置您的设置(SMTP、用户、密码)
  • 使用包含邮件和地址的数组中的信息创建新的电子邮件对象
  • 发送电子邮件
  • 转到步骤2
  • 试试这个: 正如@Felipe Alameda提到的
    Remove$mail->SMTPKeepAlive=true

    // for every mail
    if(!$mail->Send())
    {
        echo 'There was a problem sending this mail!';
    }
    else
    {
        echo 'Mail sent!';        
    }
    $mail->SmtpClose();
    

    试试下面的例子

    <?php
    
    //error_reporting(E_ALL);
    error_reporting(E_STRICT);
    
    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();
    
    $body             = file_get_contents('contents.html');
    $body             = eregi_replace("[\]",'',$body);
    
    $mail->IsSMTP(); // telling the class to use SMTP
    $mail->Host       = "mail.yourdomain.com"; // SMTP server
    $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                               // 1 = errors and messages
                                               // 2 = messages only
    $mail->SMTPAuth   = true;                  // enable SMTP authentication
    $mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
    $mail->Port       = 26;                    // set the SMTP port for the GMAIL server
    $mail->Username   = "yourname@yourdomain"; // SMTP account username
    $mail->Password   = "yourpassword";        // SMTP account password
    
    $mail->SetFrom('name@yourdomain.com', 'First Last');
    
    $mail->AddReplyTo("name@yourdomain.com","First Last");
    
    $mail->Subject    = "PHPMailer Test Subject via smtp, basic with authentication";
    
    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    
    $mail->MsgHTML($body);
    
    $address1 = "whoto@otherdomain.com";
    $address2 = "whoto@otherdomain.com";
    
    $mail->AddAddress($address1, "John Doe");
    $mail->AddAddress($address2, "John Peter");
    
    $mail->AddAttachment("images/phpmailer.gif");      // attachment if any
    $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment if any
    
    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
    ?>
    
    
    
    注意:最好是将多用户电子邮件和名称作为一个数组,如

    <?php
    
        $recipients = array(
           'person1@domain.com' => 'Person One',
           'person2@domain.com' => 'Person Two',
           // ..
        );
    
        foreach($recipients as $email => $name)
        {
           $mail->AddCC($email, $name);
        }
    
        (or)
    
        foreach($recipients as $email => $name)
        {
           $mail->AddAddress($email, $name);
        }
    ?>
    
    
    

    我认为这可能会帮助您解决问题。

    删除
    $mail->ClearCustomHeaders()并尝试一下…@Baba谢谢,但不要掷骰子。没什么区别。我不推荐使用PHPMailer。编写您自己的简单邮件类将是一个更加实际的体验,bug更少。我抛弃了phpmailer类,因为它附带了大量的bug和非常愚蠢的错误…@Cobra\u Fast你能给出bug和愚蠢错误的例子吗?谢谢你的想法,值得一试。本周末我将试一试。如果您的php设置的执行时间设置为默认值(30秒),则当计时器用完时,该设置将停止执行。@JamesMcDonnell您是对的;谢谢你讲清楚了。现在我编辑了我的答案,把睡眠时间从30秒缩短到10秒。是的,是同一个域名发送者。我没有访问SMTP日志的权限。对于$mail->ErrorInfo,我需要修改我的脚本(通过Ajax调用),它最初设置为true。我将其更改为false以重试,但忘了将其设置回原位(这两种设置都适用于第一封电子邮件,而不适用于第二封。请删除
    $mail->SMTPKeepAlive=true;
    ,然后重试。