使用的是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