1

これは、メールを送信するためのSMTPコードです。

function smtp_mail($from, $to, $subject, $message, $headers="", $params=array()) {
$errno = "";
$errstr = "";
$smtpConnect = fsockopen("mail2.allramhosting.com", "25", $errno, $errstr, 20);


if (!empty($smtpConnect)) {

    if ($params['use_html']) {
        $extra_headers .= "MIME-Version: 1.0\nContent-Type: text/html; charset=\"utf-8\"\nContent-Transfer-Encoding: 7bit\n";
    }
    $headers = "To: " . $to . "\nFrom: " . $from . "\nSubject: " . $subject . "\nDate: " . date('r') . "\n" . $extra_headers . $headers;

    if (substr($headers, -1) == "\n") $headers = substr($headers, 0, -1); // The last character should not be newline


    fputs($smtpConnect, "HELO networkssms.com\r\n");
    fputs($smtpConnect, "MAIL FROM: " . $from . "\r\n");
    fputs($smtpConnect, "RCPT TO: " . $to . "\r\n");
    fputs($smtpConnect, "DATA\r\n");
    fputs($smtpConnect, $headers . "\r\n\r\n");
    fputs($smtpConnect, $message . "\r\n.\r\n"); // send message and finish
    fputs($smtpConnect,"QUIT" . $newLine);
    fclose($smtpConnect);
    return true;
}
return false;

}

これは、SMTPメール関数の呼び出しコードです。

smtp_mail($from, $user_to ,$user_subject, $user_message,"MIME-Version: 1.0\nContent-Type: text/html; charset=\"utf-8\"\nContent-Transfer-Encoding: 7bit\n");

には$from,$user_to ,$user_subject, $user_message独自の値があります。

メールが送信されたかどうかを確認したいのですが、送信されていない場合は再度送信したいと思います。

これどうやってするの ?

4

1 に答える 1

1

最初に、接続が正常に行われたことを確認する必要があります。

$smtpConnect = fsockopen("mail2.allramhosting.com", "25", $errno, $errstr, 20);

fsockopenfalse接続に失敗した場合に戻ります。したがって、以下のコードを追加します

if (!$smptConnect) {
   echo "ERROR: $errno - $errstr".PHP_EOL;
   return false;
} else {
   // send 
   return true;
}

SMTP サーバーに発行する各コマンドは、数値の応答を返します - 次のコマンドに進む前に、応答が正しいことを確認する必要があります - 最後のコメントを読んでも問題がなければ、これは電子メールが送信されたことの確認です..を参照してください各コマンドから得られる応答を説明するこのリンク

たとえば

fputs($smtpConnect, "HELO networkssms.com\r\n");

あなたができることを確認するためにコードで応答する250必要があります:

fputs($smtpConnect, "HELO networkssms.com\r\n");
$rcode = fgets($smtpConnect, 256);
if (substr($rcode, 0, 3)!= '250') {    // check the first 3 characters ie the response code
   echo "email sending failed" . PHP_EOL;
}

すべてのコマンドに対してこれを行う必要があります-応答コードのチェックは、各コマンドで期待どおりです。各応答を確認するための簡単な関数を作成できます

function check_response($smtpConnect,$expected_response) {
    $rcode = fgets($smtpConnect, 256);
    if (substr($rcode, 0, 3)!= $expected_response) {    // check the first 3 characters ie the response code
       echo "email sending failed" . PHP_EOL;
       return false;
    }
    return true;
}

次に、次のことができます。

fputs($smtpConnect, "HELO networkssms.com\r\n");
if (!check_reponse($smptConnect,'250')) {
   return false;
}

繰り返しますが、送信されるコマンドごとにこれを行う必要があります。私はあなたがその考えを理解すると確信しています....

于 2012-04-12T08:59:08.553 に答える