0

PHPMailer を使用して、データベース内の電子メールのリストからニュースレターを送信しています。スクリプトはデータベースにクエリを実行し、データを while ループで配列に入れ、while ループでメールを作成して送信します。

150 通程度のメールが送信されるまでは正常に動作し、その後ランダムに停止します。例として、E メール ブラスト #1 は 161 通のメールを送信した後に失敗し、E メール ブラスト #2 は 165 通のメールを送信した後に失敗し、E メール ブラスト #3 は 182 通のメールを送信した後に失敗しました。

私は研究と研究を続けてきましたが、これの原因を見つけることができません。現在、私は各メールを To: メッセージで送信しており、BCC: ルートを使用して送信していません。私のサーバーの設定でしょうか?もしそうなら、私は何を探すべきですか?

デバッグ機能も少し組み込まれています。最後の SQL スクリプトは、送信された特定の時間とともに電子メールをデータベースに追加します。これにより、送信された電子メールの数、プロセスを停止する電子メールを正確に知ることができます。そしてそれはどのくらいかかります。

停止する電子メールにはパターンがなく (つまり、電子メール プロバイダーが異なることを意味します)、その数を送信するのに約 10 ~ 12 分しかかかりません。サーバーでのスクリプトのタイムアウトがそれよりもはるかに高いため、それが原因ではありません。

私のコードは次のとおりです。

$mail = new PHPMailer();
$mail->IsSMTP();                                      // set mailer to use SMTP
$mail->Host = "*server ip here*";  // specify main and backup server
$mail->SMTPKeepAlive = true;                  // SMTP connection will not close after each email sent
$mail->SMTPAuth = false;     // turn on SMTP authentication
$mail->Username = "*user*";  // SMTP username
$mail->Password = "*pass*"; // SMTP password

while($select2 = sqlsrv_fetch_array($select)) {
$email = $select2['email'];
$unid    = $select2['id'];
$unemail = $select2['email'];
$to = $email;
$from = "newsletter@site.com";
$new_date = date("n/j/y - g:i:s a");
$headers = "From: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message2 = "<html><body>";
$message2 .= $message;
$message2 .= "</body></html>";

$mail->From = "newsletter@site.com";
$mail->FromName = "Newsletter";
$mail->AddAddress($to);
$mail->AddReplyTo("newsletter@site.com", "Website.com");

$mail->IsHTML(true);                                  // set email format to HTML

$mail->Subject = $subject;
$mail->Body    = $message2;

if(!$mail->Send()) {
    die("mail() Failed to send email to $to.");
    echo "<br><br>Mailer Error: " . $mail->ErrorInfo;
    exit;
} else {
    $make_sent_query = "INSERT INTO emailssent (email_signup_id, email, datesent) VALUES (?, ?, ?)";
    $params_sent = array($unid, $to, $new_date);
    $add_to_sent = sqlsrv_query($conn, $make_sent_query, $params_sent);
    if($add_to_sent) {
        echo "Message sent for email $to<br>";
    } else {
        die("Mail sent, but failed to insert into Sent Emails database.");
    }
}

$mail->ClearAddresses();  //clear addresses for next loop
}
4

4 に答える 4

2

これは、ローカルのメール サーバーが原因である可能性がありますか? 短時間に 150 通のメールを送信している場合、スパムと見なされ、一定の量に達すると停止します。

各メールを送信した後、sleep() で速度を落としてみてはいかがでしょうか? それが原因なら1、2秒で十分なはず……。

BCC の使用を避けたい理由はありますか? 複数の受信者に電子メールを送信し、送信する電子メールの数を現在の数分の 1 に減らすことができますが、各電子メールを個別化できないという犠牲が伴います。

于 2012-05-04T20:28:18.243 に答える
0

考えられる理由の1つは、PHPがスクリプトをタイムアウトすることです。すべてのスクリプトは、限られた時間だけ実行されます。スクリプトにそれ以上の時間がかかる場合、PHPは単にスクリプトを強制終了します。通常、これによりエラーログにエラーが報告されます。apacheエラーログメッセージを確認してください-ヒントが含まれている可能性があります。

于 2013-02-27T22:12:31.237 に答える
0

タイムアウトの問題だと思います。また、crontab は問題を解決できますhttp://en.wikipedia.org/wiki/Cron。メールを送信するスクリプトを作成し、このスクリプトを毎分実行するように crontab を設定できます。その後、タイムアウトはありませんでした。

于 2012-05-04T20:28:57.920 に答える