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 つあるためです。前回検証されました)
解決策を探しています。 。 。 。 。
$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 への外部呼び出しであり、10 回呼び出されます
つまり、メールを送信しますZhang San に 1 通、Li Si に 1 通、...、合計 10 通のメールが送信されました
いいえ、SendEmail 関数は 1 回しか送信されません
は SendEmail への外部呼び出しであり、10 回呼び出されました
つまり: 1 通を Zhang San に送信し、1 通を Li Si に送信、...、合計 10 通のメールが送信されました
对是的。就是点击谁,就给谁发邮件,但是点击上三四个人就发送失败了。
我是为了测试发送失败的原因,自己写了个循环调用,看看是哪里出错了。结果循环中只能第一次成功,后面的都失败了。。。。。
你是想这么做?
发给张三,邮件发送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); } }
(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();方法就可以了。
每次发送完一次,关闭一次。
查看phpmailer属性。
使用 Smtpclose();方法就可以了。