ホームページ > バックエンド開発 > PHPチュートリアル > phpmailer ループでメールの送信に失敗する

phpmailer ループでメールの送信に失敗する

WBOY
リリース: 2016-06-23 13:46:29
オリジナル
1543 人が閲覧しました

phpmailer を使用しています。アカウントとパスワードは正しく、テストに合格しました。
1. 1 回の送信は成功します
2. しかし、電子メールを送信するループを作成すると、最初の送信のみが成功し、後続の送信はすべて失敗します。ログを確認すると、「認証できず、検証に失敗しました。」と表示されます。
その理由は何ですか?

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 メール サーバーを使用しているため、中断のないループで送信することは絶対にできません。別のメールを送信した後、プログラムを数秒間スリープさせることができます

一般的に、qq、163、126 などのメールボックスでは連続送信ができないため、ループで送信したい場合は、数秒間スリープすることもできますが、メールを送信するたびに数秒間スリープするのは効率が高くありません。同時に複数のユーザーに送信してから数秒間スリープすることもできます。

スリープを追加した後、テストが機能しませんでした。誰か送信用のループを教えてください。テストに成功した例、緊急使用

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) ユーザーがクリックして「Zhang San」にメールを送信すると、プログラムは自動的にメールの送信を開始し、送信が成功したかどうかを返します
(2) ユーザーがもう一度「Li Si」をクリックしてメールを送信します。同上。
テストしたところ、送信失敗の可能性が非常に高かった。デバッグ結果は次のとおりでした。SMTP -> エラー: サーバーからの認証が受け入れられませんでした: 503 エラー: すでに認証されました (理由は、送信ボックスが常に 1 つあるためです。前回検証されました)
解決策を探しています。 。 。 。 。

申し訳ありませんが、明確に表現できませんでした。

私が達成したいのは、ユーザーがクリックしたときにメールを送信することです。送信されるメールは常に同じですが、受信者のメールアドレスは異なります。
(1) ユーザーがクリックして「Zhang San」にメールを送信すると、プログラムは自動的にメールの送信を開始し、送信が成功したかどうかを返します
(2) ユーザーがもう一度「Li Si」をクリックしてメールを送信します。同上。
テストしたところ、送信が失敗する可能性が非常に高かった。デバッグ結果は次のとおりでした。SMTP -> エラー: サーバーからの認証が受け入れられませんでした: 503 エラー: すでに認証されています (理由は、送信ボックスが常に 1 つあるためです。前回検証されました)
解決策を探しています。 。 。 。 。

送信者は固定されており、受信者を変更するだけです。
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);    }
ログイン後にコピー


その結果、最初のメールのみが正常に送信され、それ以降のメールは送信されます検証に合格しません

これはあなたが望むことですか?

Zhang San にメールを 10 回送信しますか?
John Doe にメールを 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 関数は 1 回のみ送信します

は SendEmail への外部呼び出しであり、10 回呼び出されます

つまり、メールを送信しますZhang San に 1 通、Li Si に 1 通、...、合計 10 通のメールが送信されました

いいえ、SendEmail 関数は 1 回しか送信されません

は SendEmail への外部呼び出しであり、10 回呼び出されました

つまり: 1 通を Zhang San に送信し、1 通を Li Si に送信、...、合計 10 通のメールが送信されました


(1) ユーザーが「Zhang San」にメールを送信するためにクリックすると、プログラムが送信を開始します自動的に送信され、送信が成功したかどうかが返されます
(2) ユーザーは「Li Si」をクリックして再度メールを送信します。上記と同じです。


必要に応じて、クリックした相手にメールを送信できるのに、なぜ 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 
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート