2012-05-04 10 views
0

PHPMailerを使用して、データベース内のメールリストからニュースレターを送信しています。スクリプトはデータベースを照会し、whileループを使用してデータを配列に入れ、whileループで電子メールを作成して送信します。PHPMailerは約175件のメールを送信した後、ランダムにメールの送信を停止します

150以上の電子メールが送信されるまでうまくいき、ランダムに停止します。例として、161件の電子メールを送信した後、電子メールの爆発#1は失敗し、165件の電子メールを送信した後、電子メールの爆発2は失敗し、182の電子メールを送信した後、電子メールの爆発#3は失敗しました。

私は研究して研究しており、原因を見つけることができません。今私は各電子メールを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 = "[email protected]"; 
$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 = "[email protected]"; 
$mail->FromName = "Newsletter"; 
$mail->AddAddress($to); 
$mail->AddReplyTo("[email protected]", "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 
} 
+0

PHPやウェブサーバーのタイムアウトに遭っていませんか? – Nate

+0

私が知る限り、どちらも。ランダムに停止しています。スクリプトの実行時間を1時間に設定し、15分後に停止します。 –

+0

ループ内にメッセージをエコーし​​ますか? – Nate

答えて

2

これはあなたのローカルメールサーバーによって引き起こされていませんか?短い時間内に150のメールを送信している場合は、スパムであると想定されていて、一定の金額に達すると停止します。

各メールを送信した後にsleep()を使用して速度を落とすことができますか?それが原因であれば、ちょうど1,2秒で十分です。

なぜBCCの使用を避けたいのですか?複数の受信者に電子メールを送信したり、送信する電子メールの数を減らすことができますが、送信する電子メールの数を減らすことができます。

+0

私はBCCを試しても何の問題もなく、私はそれを行うためにスパムが増えるように感じています。私はSPFレコードを追加することでそれが助けになることは知っていますが、まだ試してみるのはちょっと難しいです。 私もsleepコマンドを試していません。私はそれを行い、それがどのように機能するかを見ていくと思います。 –

0

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

0

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