0

PHPメーラーをいじっているので、少し助けてもらえないかと思っています。このコードを変更しましたが、ここからhttp://www.askapache.com/php/phpfreaks-eric-rosebrocks-phpmailer-tutorial.html

単一の電子メールの送信は、PHP メーラー (別のスクリプトを使用) を介して正常に機能していますが、データベースから以下のスクリプトを使用して複数の電子メールを送信しようとすると、現在機能していません..何が問題なのかを見つけることができますか? データベースからの電子メールで実際に何かを行っているかどうかは疑問ですが..少し混乱しています。

スクリプトは成功して名前を出力しますが、メールは送信しません! 少なくとも何も受信されません..(スパムでもありません)何か助けはありますか?これが非常に明白である場合は申し訳ありません!

 <?php
 // Grab our config settings
 require_once($_SERVER['DOCUMENT_ROOT'].'/mail/config.php');

 // Grab the FreakMailer class
 require_once($_SERVER['DOCUMENT_ROOT'].'/mail/lib/MailClass.inc');

 //set execution time limit to 5 minutes 

 $safeMode = ( @ini_get("safe_mode") == 'On' || @ini_get("safe_mode") === 1 ) ? TRUE : FALSE;
 if ( $safeMode === FALSE ) {
  set_time_limit(300); // Sets maximum execution time to 5 minutes (300 seconds)
   // ini_set("max_execution_time", "300"); // this does the same as "set_time_limit(300)"
 }

 echo "max_execution_time " . ini_get('max_execution_time') . "<br>";


       //db connection
  $con = mysql_connect("xx","xx","xx");
 if (!$con)
   {
   die('Could not connect: ' . mysql_error());
   }

 mysql_select_db("xx", $con);

 // Setup body
 $textBody = "Dear {MEMBER_NAME},\n\nTEST";
 $htmlBody = "Dear {MEMBER_NAME},<br /><br />TEST";

 // instantiate the class
 $mailer = new FreakMailer();

 // Get the user's Email
 $sql = mysql_query("SELECT displayname,email FROM engine4_users2")or die(mysql_error());


 //lets reset the time limit of the server everytime an email is sent to bypass maximum
  while (1==1) {
   set_time_limit(30); // sets (or resets) maximum  execution time to 30 seconds)
   // .... put code to process in here


    while($row = mysql_fetch_object($sql))
    {
    // Send the emails in this loop.
    $member_name = $row->displayname;

    if($row->MailType == 'html')
    {
    $mailer->Body = str_replace('{MEMBER_NAME}', $member_name, $htmlBody);
    $mailer->IsHTML(true);
    $mailer->AltBody = str_replace('{MEMBER_NAME}', $member_name, $textBody);
    }
    else
    {   
    $mailer->Body = str_replace('{MEMBER_NAME}', $member_name, $textBody);
    $mailer->isHTML(false);
    }
    $mailer->Send();
    $mailer->ClearAddresses();
    $mailer->ClearAttachments();
    $mailer->IsHTML(false);
    echo "Mail sent to: " . $member_name . "<br />";
    }




   usleep(1000000); // sleep for 1 million micro seconds - will not work with Windows servers / PHP4
   // sleep(1); // sleep for 1 seconds (use with Windows servers / PHP4
        if (1!=1) {
     break;
   }
 }



 ?>
4

2 に答える 2

1

phpmailer を使用していない理由はありますか? phpmailer の .php ファイルをダウンロードして、このコードを使用すると、魅力的に機能します。

<?php
 $sql = mysql_query("SELECT displayname,email FROM engine4_users2")or die(mysql_error());

//
//

require_once('../../mailer/class.phpgmailer.php');
require_once ('../../mailer/class.smtp.php');
require_once('../../mailer/phpmailer.lang-en.php');

$debug = new SMTP();
$debug->do_debug = 2;

while ($record = mysql_fetch_array ($sql)) {
$mail = new PHPGMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "mail.zzxxyyhost.com"; // SMTP server
$mail->Port = 26; //designated port, could be different, check your host
$mail->SMTPAuth = TRUE; //smtp authentication may be false, check your host
$mail->Username = "username"; //username
$mail->Password = "password"; //password

$mail->From = "from@someone.com"; 
$mail->FromName = "fromsomeone";

$mail->AddBCC($record['email'], $record["displayname"]); //use bcc for hidden emails    
$mail->Subject = "$record["displayname"]";
$mail->Body = "Your body";


            if(!$mail->Send())
            {
               echo 'Message was not sent.';
               echo 'Mailer error: ' . $mail->ErrorInfo;
            }
    // Clear all addresses and attachments for next loop
    $mail->ClearAddresses();
    $mail->ClearAttachments();
}

?>
于 2012-07-06T00:20:23.087 に答える
0

ユーザーのアドレスをメーラーに設定することはありません。

$mailer->AddAddress($row->email);

send()に呼び出されます。ループ内でメールを送信しているため、すべてのユーザーが 1 つのメールを受け取り、他のアドレスは表示されません。

(以下のコメントが開示しているため、リンクしたドキュメントの例は完全ではありません)

代わりに、

$mail->AddBCC($row->email);

ループとループ後のメーラーのコードの残りの部分で、1つのメールをすべての人に送信しますが、メールを送信するには、bccアドレスのほかに受信者として1つの(ダミー)アドレスが必要です。

if($row->MailType == 'html')

クエリで MailType を選択していません。エラー報告を有効にしていますか?

于 2012-07-06T00:38:12.987 に答える