搜索
首页后端开发php教程phpmailer循环发送邮件失败

使用的是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
PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

自定义/扩展框架:如何添加自定义功能。自定义/扩展框架:如何添加自定义功能。Mar 28, 2025 pm 05:12 PM

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境