目錄
回复讨论(解决方案)
首頁 後端開發 php教程 phpmailer循环发送邮件失败

phpmailer循环发送邮件失败

Jun 23, 2016 pm 01:46 PM

使用的是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 <b>in bold!</b>";	$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);}
登入後複製

<?php    set_time_limit(0);    ini_set("max_execution_time", "18000000");    include 'PHPMailer/class.phpmailer.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 = '';//发件人邮箱	$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 "邮件发送失败. <p>";    echo "错误原因: " . $mail->ErrorInfo;    exit; //如果这里不是退出,而是条件重入呢?}
登入後複製
调试代码要有耐心!
别人只能给你一个思路,对不对,得由你验证

(1)我用你的代码,注释掉$mailer->SMTPSecure = 'ssl';这句才能连接邮箱服务器成功
(2)同样的问题,结果:
点击给李三发送,返回成功;
继续点击给张三,返回成功;
……
第四次失败
第五次失败
……

平均发送5封有2封失败,原因和我之前的一样通不过验证


打印出错误信息,自己分析下。

每次发送完一次,关闭一次。
查看phpmailer属性。
使用 Smtpclose();方法就可以了。

每次发送完一次,关闭一次。
查看phpmailer属性。
使用 Smtpclose();方法就可以了。



OK,解决


每次发送完一次,关闭一次。
查看phpmailer属性。
使用 Smtpclose();方法就可以了。



OK,解决
还有可能是重复包含了邮件类
循环函数 SendEmail 中 包含语句include 改为 include_once 
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles