3

解決済み:PHPMailerをインストールした後、動作するようになりました。


MIME Eメールを使用して、多数のメンバーにメールを送信しようとしています。私のウェブホストにはサーバー上で関数を実行できる期間に制限があるので、古い機能を調整する必要がありました。これが私がそれを機能させたい方法です:

  1. データベーステーブルからすべてのメンバーの電子メールアドレスを取得し、これらすべての電子メールアドレスを使用して新しいテーブルを作成します。
  2. 新しいテーブルでは、「送信済み」と「エラー」という2つの属性も作成します。
  3. この機能でCronを使用することを計画しています。そのため、電子メールアドレスのすべての行は、最終的にSent = True(1)またはError = True(1)に設定されます。

問題は1つだけです。これを4つのメールアドレスでテストしてみました。それらの1つがエラーを返すと、次のすべての電子メールアドレスに同じエラーが発生します。

エラーメッセージの例:

Error: 501 : malformed address: �> may not follow **Probably caused of ÆØÅ**
Error: 501 : domain missing or malformed  **Because @service.com is missing**

等..

出力例:

1: Before function. Error value: 
1: After function. Error value: 501 : domain missing or malformed
2012-10-10 20:07:46 : 1: MemberID: 1, Mail:testme
Error: 501 : domain missing or malformed 

2: Before function. Error value: 
2: After function. Error value: 501 : domain missing or malformed
2012-10-10 20:07:46 : 2: MemberID: 2, Mail:testme@gmail.com
Error: 501 : domain missing or malformed 

3: Before function. Error value: 
3: After function. Error value: 501 : domain missing or malformed
2012-10-10 20:07:46 : 3: MemberID: 3, Mail:testme@hotmail.com
Error: 501 : domain missing or malformed* 

なぜこれが起こるのか理解できません。

######################################
### START NEW MAIL FUNCTION   ####
######################################
##############################################
### Deletes table if already exists   ####
##############################################


$dropExistingTable = "DROP TABLE IF EXISTS $databaseTableNameContainingMembers";
mysql_query($dropExistingTable) or die(mysql_error());

####################################
### Creating new table  ####
####################################
$queryCreateTable = "CREATE TABLE $databaseTableNameContainingMembers(ID mediumint(6) NOT NULL AUTO_INCREMENT, Mail TEXT, MailSent BOOLEAN DEFAULT 0, Error BOOLEAN DEFAULT 0, PRIMARY KEY (ID))";
mysql_query($queryCreateTable) or die(mysql_error());

####################################
### Filling new table   ####
####################################
//Now we fill the new table with all our members (MemberID, Mail, Sendt = 0).

while ($medlem = mysql_fetch_array($query_medlem)) {
    //insert all member mails to new table
    $memberMail = $medlem["Epost"];
    $queryInsertMemberToNewTable = "INSERT INTO $databaseTableNameContainingMembers (`Mail`) VALUES ('" . $memberMail . "')";
    mysql_query($queryInsertMemberToNewTable) or die(mysql_error());
}

######################################
### Sending function      ####
######################################

function sendMail($table, $email_message) {
##########################################
###     Selecting the new table       ####
##########################################
    $querySelectAllMembersThatHasNotAlreadyBeenSentTo = "SELECT * FROM $table WHERE `MailSent` = 0 AND `Error` = 0";

//Selects all members that havent been sendt mail to yet.

    $allMembersThatHasNotAlreadyBeenSentTo = mysql_query($querySelectAllMembersThatHasNotAlreadyBeenSentTo) or die("Problem with selecting table. <br>" . mysql_error());

    $i = 1;
    while ($row = mysql_fetch_array($allMembersThatHasNotAlreadyBeenSentTo)) {

        $to_address = $row["Mail"];
        $memberId = $row["ID"];

       $email_message->SetEncodedEmailHeader("To", $to_address, ""); 

        $error = "";
        echo $i . ": Before function. Error value: " . $error . "</br></br>";
        $error = $email_message->Send();
        echo $i . ": After function. Error value: " . $error . "</br></br>";
        echo "</br>";

        if (strcmp($error, "") > 0) {
            ##########################################################
            ###      IF ERROR UPDATE MEMBER VARIABLE "Error"      ####
            ##########################################################
            updateErrorToMember($memberId, $table, 1);
            echo date("Y-m-d H:i:s") . " : " . $i . ": MemberID: " . $memberId . ", Mail:" . $to_address . "</br>Error: $error </br></br></br>";
        } else {
            ##################################################################
            ###    IF SENDING SUCCEEDS UPDATE MEMBER VARIABLE "Sent"      ####
            ##################################################################
            updateSentToMember($memberId, $table);
            echo date("Y-m-d H:i:s") . ": " . $i . " :  Message sent to $to_address<br></br>";
        }
        $i++;
    } //while
}//function

######################################
###    End of sending function    ####
######################################
######################################
###     Run sending function      ####
######################################
sendMail($databaseTableNameContainingMembers, $email_message);
4

2 に答える 2

2

$email_message送信するたびにオブジェクトをクリアするのではなく、同じ$email_messageオブジェクトを使用し、新しいアドレスを追加して送信するだけです。これらのアドレスの1つが正しくない場合は、次の受信者にエラーが発生します。

次のコードを置き換えてみてください。

$email_message->SetEncodedEmailHeader("To", $to_address, "");

これのために:

$email_message->ClearAddresses();
$email_message->AddAddress($to_address, $to_address);
于 2012-10-10T18:39:21.380 に答える
0
$headers = "MIME-Version: 1.0"."\r\n";
$headers .= "Content-type:text/html; charset=utf-8"."\r\n";
$headers .= "Reply-To: ". $from . "\r\n";
$headers .= "From: ".$from."\r\n";
$message = '<html><body>';
$message .= stripslashes($msg);
$message .= '</body></html>';

if(mail($to_address, $subject, $message, $headers)){
    updateSentToMember($memberId, $table);
    echo date("Y-m-d H:i:s") . ": " . $i . " :  Message sent to $to_address<br></br>";
}else{
    updateErrorToMember($memberId, $table, 1);
    echo date("Y-m-d H:i:s") . " : " . $i . ": MemberID: " . $memberId . ", Mail:" . $to_address . "</br>Error: $error </br></br></br>";
}

このPHPmail()関数のようにうまく機能する場合は、phpMailerクラスに問題があることを確認できます。

于 2012-10-10T18:22:25.613 に答える