phpmailer循环发送邮件失败

an5464684 2013-12-27 06:18:52
使用的是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;
}
...全文
618 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
php_sir 2016-09-07
  • 打赏
  • 举报
回复
引用 21 楼 kao10324 的回复:
[quote=引用 19 楼 an5464684 的回复:] [quote=引用 18 楼 u012727363 的回复:] 每次发送完一次,关闭一次。 查看phpmailer属性。 使用 Smtpclose();方法就可以了。
OK,解决[/quote] $mail->Send(); $mail->smtpClose(); 这样写不行.请问你怎么写的[/quote] 明显上面这种方式不行,设置$mail->SMTPDebug = 3; // Enable verbose debug output 就可以看到程序执行日志,看日志发送完一封邮件会自动关闭STMP链接。跟踪$mail->send()就会看到关闭STMP链接的代码了。正确的做法是清空发送队列 $mail->clearAddresses();,也可以把附件也清空$mail->clearAttachments();
鲸落JL 2015-02-10
  • 打赏
  • 举报
回复
引用 19 楼 an5464684 的回复:
[quote=引用 18 楼 u012727363 的回复:] 每次发送完一次,关闭一次。 查看phpmailer属性。 使用 Smtpclose();方法就可以了。
OK,解决[/quote] $mail->Send(); $mail->smtpClose(); 这样写不行.请问你怎么写的
sdjkhe 2014-10-31
  • 打赏
  • 举报
回复
引用 19 楼 an5464684 的回复:
[quote=引用 18 楼 u012727363 的回复:] 每次发送完一次,关闭一次。 查看phpmailer属性。 使用 Smtpclose();方法就可以了。
OK,解决[/quote] 还有可能是重复包含了邮件类 循环函数 SendEmail 中 包含语句include 改为 include_once
an5464684 2014-01-20
  • 打赏
  • 举报
回复
引用 18 楼 u012727363 的回复:
每次发送完一次,关闭一次。 查看phpmailer属性。 使用 Smtpclose();方法就可以了。
OK,解决
viper_pom 2014-01-17
  • 打赏
  • 举报
回复
每次发送完一次,关闭一次。 查看phpmailer属性。 使用 Smtpclose();方法就可以了。
an5464684 2013-12-31
  • 打赏
  • 举报
回复
(1)我用你的代码,注释掉$mailer->SMTPSecure = 'ssl';这句才能连接邮箱服务器成功 (2)同样的问题,结果: 点击给李三发送,返回成功; 继续点击给张三,返回成功; …… 第四次失败 第五次失败 …… 平均发送5封有2封失败,原因和我之前的一样通不过验证
码无边 2013-12-31
  • 打赏
  • 举报
回复
引用 10 楼 zy205817 的回复:
你是想这么做? 发给张三,邮件发送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);
布局好界面,按照我说的这个,你测试下。
an5464684 2013-12-31
  • 打赏
  • 举报
回复
对是的。就是点击谁,就给谁发邮件,但是点击上三四个人就发送失败了。 我是为了测试发送失败的原因,自己写了个循环调用,看看是哪里出错了。结果循环中只能第一次成功,后面的都失败了。。。。。
码无边 2013-12-31
  • 打赏
  • 举报
回复
引用 11 楼 an5464684 的回复:
不是的,SendEmail函数中只发送一次的 是外面调用SendEmail,调用了10次 即:给张三发一封,给李四发一封,……,总共发了10封的
(1)当用户点击给"张三"发送邮件,程序开始自动发送,并将发送是否成功返回 (2)用户再次点击"李四"发送邮件,同上。 按照你的需求,你是点击谁,就给谁发邮件,那你要for循环10次干嘛? 直接调用sendemail(xx,xx,xx)封装的方法不就是的。
an5464684 2013-12-31
  • 打赏
  • 举报
回复
不是的,SendEmail函数中只发送一次的 是外面调用SendEmail,调用了10次 即:给张三发一封,给李四发一封,……,总共发了10封的
码无边 2013-12-31
  • 打赏
  • 举报
回复
你是想这么做? 发给张三,邮件发送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);
an5464684 2013-12-31
  • 打赏
  • 举报
回复
具体是这样的

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);
    }

结果就会只有第一封发送成功,后边的都通不过验证
码无边 2013-12-31
  • 打赏
  • 举报
回复
引用 15 楼 an5464684 的回复:
(1)我用你的代码,注释掉$mailer->SMTPSecure = 'ssl';这句才能连接邮箱服务器成功 (2)同样的问题,结果: 点击给李三发送,返回成功; 继续点击给张三,返回成功; …… 第四次失败 第五次失败 …… 平均发送5封有2封失败,原因和我之前的一样通不过验证
打印出错误信息,自己分析下。
xuzuning 2013-12-31
  • 打赏
  • 举报
回复
一般的,应处理一下可能出现的错误
if(!$mailer->Send()){
    echo "邮件发送失败. <p>";
    echo "错误原因: " . $mail->ErrorInfo;
    exit; //如果这里不是退出,而是条件重入呢?
}
调试代码要有耐心! 别人只能给你一个思路,对不对,得由你验证
an5464684 2013-12-30
  • 打赏
  • 举报
回复
加了sleep后,测试也是没有起作用,麻烦哪位大神能给个循环发送测试通过的例子,急用

for($i=0; $i<10; $i++)
{
	SendEmail();
	sleep(20);
}
码无边 2013-12-30
  • 打赏
  • 举报
回复
那你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);
    }

}
an5464684 2013-12-30
  • 打赏
  • 举报
回复
我编写的是传参数进来,然后再发送的。。。。 (1)我将发送邮件写成是一个函数的,假设为SendEmail($address); (2)外部调用假设为

for($i = 0; $i< 10; $i++){
        SendEmail($address);
        sleep(3);
    }
结果只有第一封能发出去。。。。。
码无边 2013-12-30
  • 打赏
  • 举报
回复
引用 5 楼 an5464684 的回复:
不好意思,这个是我没有表述清楚。 我想实现的是:当用户点击时才发送邮件,发送的邮件始终是同一个,但是收件人的邮箱地址是不一样的。 (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);
an5464684 2013-12-30
  • 打赏
  • 举报
回复
不好意思,这个是我没有表述清楚。 我想实现的是:当用户点击时才发送邮件,发送的邮件始终是同一个,但是收件人的邮箱地址是不一样的。 (1)当用户点击给"张三"发送邮件,程序开始自动发送,并将发送是否成功返回 (2)用户再次点击"李四"发送邮件,同上。 我测试时,发送失败的几率很大,调试结果是:SMTP -> ERROR: AUTH not accepted from server: 503 Error: already authenticated,(原因是发件箱始终是一个,可能上次已经验证过了) 求解决办法。。。。。
码无边 2013-12-30
  • 打赏
  • 举报
回复

<?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);
}
?>

我试过是没有问题的。
加载更多回复(2)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧