5

私はこれにかなり困惑しています。

//SMTP servers details
$mail->IsSMTP(); 
$mail->Host = "mail.hostserver.com";  
$mail->SMTPAuth = false;     
$mail->Username = $myEmail;  // SMTP usr
$mail->Password = "****";    // SMTP pass
$mail->SMTPKeepAlive = true;   
$mail->From = $patrickEmail; 
$mail->FromName = "***";    
$mail->AddAddress($email, $firstName . " " . $lastName); 
$mail->WordWrap = 50;                                 
$mail->IsHTML(true);                                  
$mail->Subject = $client_subject;
$mail->Body    = $client_msg;

if($mail->Send())
{

$mail->ClearAllRecipients(); 
$mail->ClearReplyTos();
$mail->ClearCustomHeaders();
...
$mail->From = "DO_NOT_REPLY@..."; 
$mail->FromName = "****";    
$mail->AddAddress($ToEmail1, "***"); //To: (recipients).
$mail->AddAddress($ToEmail2, "***"); //To: (recipients).
$mail->WordWrap = 50;            
$mail->IsHTML(true);             
$mail->Subject = $notification_subject;
$mail->Body    = $notification_msg;
if($mail->Send())
{
...

最初のメールは問題なく送信されます。2番目のものはそうではありません。その行動の理由は何ですか?ある種のリセットがありませんか?


更新: 別のメール サーバーを使用するとうまくいくように見えるので、明らかにその特定のメール サーバーの設定が問題を引き起こしているようです。それが何であるか考えていますか?

4

8 に答える 8

9

一部のプロバイダーは、特定の期間内に送信できるメッセージの数に制限を課しています。問題がプロバイダーの「レート制限」に依存しているかどうかを判断するには、最初の送信の後に一時停止を追加してみてください。例えば:

if ($mail->Send()) {
    sleep(10);  // Seconds
    ...
    if ($mail->Send()) {
        ...
    }
}

次に、スリープ時間を徐々に下げることで、どれがレート制限であるかを判断できるはずです。

于 2012-11-29T21:10:50.393 に答える
3

私見では、送信された電子メールごとに新しい PHPMailer オブジェクトを作成する必要があります。共通のセットアップを共有したい場合は、次のようなものを使用します。

$mail = new PHPMailer();
/* Configure common settings */

while ($row = mysql_fetch_array ($result)) {
    $mail2 = clone $mail;
    $mail2->MsgHTML("Dear ".$row["fname"].",<br>".$cbody);
    $mail2->AddAddress($row["email"], $row["fname"]);
    $mail2->send();
}
于 2012-11-30T09:34:46.933 に答える
3

これを試してください:@ Felipe Alameda Aが言及したようにRemove $mail->SMTPKeepAlive = true;

// for every mail
if(!$mail->Send())
{
    echo 'There was a problem sending this mail!';
}
else
{
    echo 'Mail sent!';        
}
$mail->SmtpClose();
于 2012-12-04T20:24:12.893 に答える
2

あなたの問題は$mail->SMTPAuth = false;

たとえ無料であっても、認証を必要としないISPまたはSMTPプロバイダーがあるとは信じがたいです。

send()trueのチェックの代わりに、またはそれに加えて、これを試してエラーをチェックすることができます。

  if ( $mail->IsError() ) { // 
    echo ERROR;
  }
  else {
    echo NO ERRORS;
  }

 //Try adding this too, for debugging:
  $mail->SMTPDebug  = 2;  // enables SMTP debug information

コード内の他のすべては正常に見えます。PHPMailerを頻繁に使用しており、問題は発生していません。

于 2012-12-03T21:36:51.977 に答える
1

私は個人的に、同じメールを送信するなどの小さなステップを作成しようとします..受信者をクリアして、同じメールを送信してみてください(このコードは私にとってはうまくいきます)。このコードが成功した場合は、前の行を追加し直し、失敗した場所をデバッグできます。

そして多分$mail->ClearCustomHeaders();問題をやっている

//SMTP servers details
$mail->IsSMTP(); 
$mail->Host = "mail.hostserver.com";  
$mail->SMTPAuth = false;     
$mail->Username = $myEmail;  // SMTP usr
$mail->Password = "****";    // SMTP pass
$mail->SMTPKeepAlive = true;   
$mail->From = $patrickEmail; 
$mail->FromName = "***";    
$mail->AddAddress($email, $firstName . " " . $lastName); 
$mail->WordWrap = 50;                                 
$mail->IsHTML(true);                                  
$mail->Subject = $client_subject;
$mail->Body    = $client_msg;
// all above is copied
if($mail->Send()) {
  sleep(5);
  $mail->ClearAllRecipients(); 
  $mail->AddAddress('another@email.com'); //some another email

}
...
于 2012-12-04T09:47:23.623 に答える
1

省略した部分に鍵があるかもしれません。両方のメールの送信者のドメインは同じですか? そうしないと、SMTP ホストはこれをリレーの試みと見なす可能性があります。SMTP サーバーのログにアクセスできる場合は、これらを確認してください。彼らは手がかりを提供するかもしれません。

また、内容を確認してください$mail->ErrorInfo...問題が何であるかがわかります。

于 2012-11-29T14:38:25.193 に答える
1

次の例を試してください。

<?php

//error_reporting(E_ALL);
error_reporting(E_STRICT);

date_default_timezone_set('America/Toronto');

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = file_get_contents('contents.html');
$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host       = "mail.yourdomain.com"; // SMTP server
$mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port       = 26;                    // set the SMTP port for the GMAIL server
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

$mail->SetFrom('name@yourdomain.com', 'First Last');

$mail->AddReplyTo("name@yourdomain.com","First Last");

$mail->Subject    = "PHPMailer Test Subject via smtp, basic with authentication";

$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address1 = "whoto@otherdomain.com";
$address2 = "whoto@otherdomain.com";

$mail->AddAddress($address1, "John Doe");
$mail->AddAddress($address2, "John Peter");

$mail->AddAttachment("images/phpmailer.gif");      // attachment if any
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment if any

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}
?>

注:次のように、複数のユーザーの電子メールと名前を配列として作成することをお勧めします

<?php

    $recipients = array(
       'person1@domain.com' => 'Person One',
       'person2@domain.com' => 'Person Two',
       // ..
    );

    foreach($recipients as $email => $name)
    {
       $mail->AddCC($email, $name);
    }

    (or)

    foreach($recipients as $email => $name)
    {
       $mail->AddAddress($email, $name);
    }
?>

これはあなたの問題を解決するのに役立つと思います。

于 2012-12-05T06:11:55.270 に答える
1

ここに組織上の問題があると思います。

私はお勧め:

  1. 設定を行います (SMTP、ユーザー、パス)
  2. メッセージを保持する配列からの情報とアドレスへの情報を使用して、新しい電子メール オブジェクトを作成します。
  3. メールを送る
  4. ステップ 2 に進む
于 2012-12-04T17:29:33.320 に答える