phpmailer迴圈發送郵件失敗

來源:互聯網
上載者:User
使用的是phpmailer,賬戶和密碼均正確,並測試通過。
1.單次發送會成功
2.但是當編寫一個迴圈發郵件時,只有第一次發送成功,後面的都發送失敗,查看Log顯示:Could not authenticate,驗證沒有通過。
這是什麼原因?
try {$mail = new PHPMailer();$mail->IsSMTP();   // set mailer to use SMTP$mail->SMTPAuth = true;     // turn on SMTP authentication$mail->SMTPDebug  = 0;$mail->Host = "smtp.126.com";  // specify main and backup server$mail->Port = 25;$mail->Username = "sent@126.com";  // SMTP username$mail->Password = "******"; // SMTP password$mail->From = $mail->Username;$mail->FromName = "myname";$mail->AddAddress("receive@163.com", "toname");$mail->WordWrap = 50;         // set word wrap to 50 characters$mail->IsHTML(true);          // set email format to HTML$mail->Subject = "Here is the subject";$mail->Body    = "This is the HTML message body in bold!";$mail->AltBody = "This is the body in plain text for non-HTML mail clients";if(!$mail->Send()){echo "Mailer Error: ".$mail->ErrorInfo;return false;}else {return true;}                       } catch (phpmailerException $e) {echo "Send mail failed: ".$e->errorMessage();return false;}


回複討論(解決方案)

單次成功的話程式是沒有問題的,因為你用的是126的郵件伺服器那它肯定不會讓你不間斷的迴圈發送的,所以你可以再發送完成一封之後讓程式sleep幾秒鐘

一般來說,像qq、163、126等郵箱,他們不會允許你連續發送的,所以如果你要迴圈發送的話,可以sleep 幾秒,但每發一封郵件sleep幾秒,效率肯定不高,也可以同時給多個使用者發送,然後sleep幾秒

加了sleep後,測試也是沒有起作用,麻煩哪位大神能給個迴圈發送測試通過的例子,急用

for($i=0; $i<10; $i++){SendEmail();sleep(20);}

CharSet = "utf-8";$mailer->ContentType = 'text/html';$mailer->IsSMTP();$mailer->SMTPDebug  = 0;$mailer->SMTPAuth = true;$mailer->SMTPSecure = 'ssl';$mailer->Host = 'smtp.163.com';$mailer->Port = '465';$mailer->Username = '';//寄件者郵箱$mailer->Password = 'xxx';//寄件者密碼$mailer->SetFrom('','');$mailer->AddAddress($sendmail);$mailer->Subject =$title;$mailer->MsgHTML($remark);for($i = 0; $i< 10; $i++){$mailer->send();sleep(3);    }?>

我試過是沒有問題的。

不好意思,這個是我沒有表述清楚。
我想實現的是:當使用者點擊時才發送郵件,發送的郵件始終是同一個,但是收件者的郵箱地址是不一樣的。
(1)當使用者點擊給"張三"發送郵件,程式開始自動發送,並將發送是否成功返回
(2)使用者再次點擊"李四"發送郵件,同上。
我測試時,發送失敗的幾率很大,調試結果是:SMTP -> ERROR: AUTH not accepted from server: 503 Error: already authenticated,(原因是寄件匣始終是一個,可能上次已經驗證過了)
求解決辦法。。。。。

不好意思,這個是我沒有表述清楚。
我想實現的是:當使用者點擊時才發送郵件,發送的郵件始終是同一個,但是收件者的郵箱地址是不一樣的。
(1)當使用者點擊給"張三"發送郵件,程式開始自動發送,並將發送是否成功返回
(2)使用者再次點擊"李四"發送郵件,同上。
我測試時,發送失敗的幾率很大,調試結果是:SMTP -> ERROR: AUTH not accepted from server: 503 Error: already authenticated,(原因是寄件匣始終是一個,可能上次已經驗證過了)
求解決辦法。。。。。


給誰發,就傳對應參數就行,寄件者是固定的,就是更改收件者即可,
難道給你一個phpemail類,不知道做事?
 $sendmail = '';//收件者 張三,李四,王二,麻子    $title='我要發郵件';    $remark='這是郵件內容';    $mailer=new PHPMailer();    $mailer->CharSet = "utf-8";    $mailer->ContentType = 'text/html';    $mailer->IsSMTP();    $mailer->SMTPDebug  = 0;    $mailer->SMTPAuth = true;    $mailer->SMTPSecure = 'ssl';    $mailer->Host = 'smtp.163.com';    $mailer->Port = '465';    $mailer->Username = '';//寄件者郵箱 (固定)    $mailer->Password = 'xxx';//寄件者密碼(固定)    $mailer->SetFrom('','');收件者 張三,李四,王二,麻子    $mailer->AddAddress($sendmail);    $mailer->Subject =$title;    $mailer->MsgHTML($remark);

我編寫的是傳參數進來,然後再發送的。。。。
(1)我將發送郵件寫成是一個函數的,假設為SendEmail($address);
(2)外部調用假設為

for($i = 0; $i< 10; $i++){        SendEmail($address);        sleep(3);    }

結果只有第一封能發出去。。。。。

那你SendEmail()怎麼定義?如下:function SendEmail($sendmail,$title,$remark){    include "phpemail/phpemail.class.php";    $sendmail = '';//收件者 張三,李四,王二,麻子    $title='我要發郵件';    $remark='這是郵件內容';    $mailer=new PHPMailer();    $mailer->CharSet = "utf-8";    $mailer->ContentType = 'text/html';    $mailer->IsSMTP();    $mailer->SMTPDebug  = 0;    $mailer->SMTPAuth = true;    $mailer->SMTPSecure = 'ssl';    $mailer->Host = 'smtp.163.com';    $mailer->Port = '465';    $mailer->Username = 'xxx';//寄件者郵箱 (固定)    $mailer->Password = 'xxx';//寄件者密碼(固定)    $mailer->SetFrom($sendemail,$sendemail);收件者 張三,李四,王二,麻子    $mailer->AddAddress($sendmail);    $mailer->Subject =$title;    $mailer->MsgHTML($remark);    for($i = 0; $i< 10; $i++){        $mailer->send();        sleep(3);    }}

具體是這樣的

function SendEmail($address,$toname,$info){try {$mail = new PHPMailer();$mail->IsSMTP();   // set mailer to use SMTP$mail->SMTPAuth = true;     // turn on SMTP authentication$mail->SMTPDebug  = 0;$mail->Host = "smtp.126.com";  // specify main and backup server$mail->Port = 25;$mail->Username = "sent@126.com";  // SMTP username$mail->Password = "******"; // SMTP password$mail->From = $mail->Username;$mail->FromName = "myname";$mail->AddAddress($address, $toname);$mail->WordWrap = 50;         // set word wrap to 50 characters$mail->IsHTML(true);          // set email format to HTML$mail->Subject = "Here is the subject";$mail->Body    = $info;$mail->AltBody = "This is the body in plain text for non-HTML mail clients";if(!$mail->Send()){echo "Mailer Error: ".$mail->ErrorInfo;return false;}else {return true;}                       } catch (phpmailerException $e) {echo "Send mail failed: ".$e->errorMessage();return false;}}


在另外一個檔案會迴圈調用它進行發送:
for($i = 0; $i< 10; $i++){        //這裡會擷取到郵箱地址$address,收件者姓名$toname,發送的內容$info        SendEmail($address,$toname,$info);        sleep(3);    }


結果就會只有第一封發送成功,後邊的都通不過驗證

你是想這麼做?
發給張三,郵件發送10次?
發送李四,郵件發送10次?
你如果要這麼做,幹嘛不按照我上面寫的方法,直接傳遞參數呢?

function SendEmail($sendmail,$title,$remark){    include "phpemail/phpemail.class.php";    $sendmail = '';//收件者 張三,李四,王二,麻子    $title='我要發郵件';    $remark='這是郵件內容';    $mailer=new PHPMailer();    $mailer->CharSet = "utf-8";    $mailer->ContentType = 'text/html';    $mailer->IsSMTP();    $mailer->SMTPDebug  = 0;    $mailer->SMTPAuth = true;    $mailer->SMTPSecure = 'ssl';    $mailer->Host = 'smtp.163.com';    $mailer->Port = '465';    $mailer->Username = 'xxx';//寄件者郵箱 (固定)    $mailer->Password = 'xxx';//寄件者密碼(固定)    $mailer->SetFrom($sendemail,$sendemail);收件者 張三,李四,王二,麻子    $mailer->AddAddress($sendmail);    $mailer->Subject =$title;    $mailer->MsgHTML($remark);    for($i = 0; $i< 10; $i++){        $mailer->send();        sleep(3);    } }


調用:
SendEmail($sendmail,$title,$remark);

不是的,SendEmail函數中只發送一次的
是外面調用SendEmail,調用了10次

即:給張三發一封,給李四發一封,……,總共發了10封的

不是的,SendEmail函數中只發送一次的
是外面調用SendEmail,調用了10次

即:給張三發一封,給李四發一封,……,總共發了10封的



(1)當使用者點擊給"張三"發送郵件,程式開始自動發送,並將發送是否成功返回
(2)使用者再次點擊"李四"發送郵件,同上。


按照你的需求,你是點擊誰,就給誰發郵件,那你要for迴圈10次幹嘛?
直接調用sendemail(xx,xx,xx)封裝的方法不就是的。

對是的。就是點擊誰,就給誰發郵件,但是點擊上三四個人就發送失敗了。

我是為了測試發送失敗的原因,自己寫了個迴圈調用,看看是哪裡出錯了。結果迴圈中只能第一次成功,後面的都失敗了。。。。。

你是想這麼做?
發給張三,郵件發送10次?
發送李四,郵件發送10次?
你如果要這麼做,幹嘛不按照我上面寫的方法,直接傳遞參數呢?

function SendEmail($sendmail,$title,$remark){    include "phpemail/phpemail.class.php";    $sendmail = '';//收件者 張三,李四,王二,麻子    $title='我要發郵件';    $remark='這是郵件內容';    $mailer=new PHPMailer();    $mailer->CharSet = "utf-8";    $mailer->ContentType = 'text/html';    $mailer->IsSMTP();    $mailer->SMTPDebug  = 0;    $mailer->SMTPAuth = true;    $mailer->SMTPSecure = 'ssl';    $mailer->Host = 'smtp.163.com';    $mailer->Port = '465';    $mailer->Username = 'xxx';//寄件者郵箱 (固定)    $mailer->Password = 'xxx';//寄件者密碼(固定)    $mailer->SetFrom($sendemail,$sendemail);收件者 張三,李四,王二,麻子    $mailer->AddAddress($sendmail);    $mailer->Subject =$title;    $mailer->MsgHTML($remark);    for($i = 0; $i< 10; $i++){        $mailer->send();        sleep(3);    } }


調用:
SendEmail($sendmail,$title,$remark);



布局好介面,按照我說的這個,你測試下。

(1)我用你的代碼,注釋掉$mailer->SMTPSecure = 'ssl';這句才能串連郵箱伺服器成功
(2)同樣的問題,結果:
點擊給李三發送,返回成功;
繼續點擊給張三,返回成功;
……
第四次失敗
第五次失敗
……

平均發送5封有2封失敗,原因和我之前的一樣通不過驗證

一般的,應處理一下可能出現的錯誤

if(!$mailer->Send()){    echo "郵件發送失敗. 

"; echo "錯誤原因: " . $mail->ErrorInfo; exit; //如果這裡不是退出,而是條件重入呢?}

調試代碼要有耐心!
別人只能給你一個思路,對不對,得由你驗證

(1)我用你的代碼,注釋掉$mailer->SMTPSecure = 'ssl';這句才能串連郵箱伺服器成功
(2)同樣的問題,結果:
點擊給李三發送,返回成功;
繼續點擊給張三,返回成功;
……
第四次失敗
第五次失敗
……

平均發送5封有2封失敗,原因和我之前的一樣通不過驗證


列印出錯誤資訊,自己分析下。

每次發送完一次,關閉一次。
查看phpmailer屬性。
使用 Smtpclose();方法就可以了。

每次發送完一次,關閉一次。
查看phpmailer屬性。
使用 Smtpclose();方法就可以了。



OK,解決


每次發送完一次,關閉一次。
查看phpmailer屬性。
使用 Smtpclose();方法就可以了。



OK,解決


還有可能是重複包含了郵件類
迴圈函數 SendEmail 中 包含語句include 改為 include_once
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.