2012-04-12 52 views
1

這是我的smtp代碼可以發送電子郵件:檢查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有他們自己的價值。

我想檢查電子郵件是否被髮送,如果沒有發送,我想再次發送。

我該怎麼做?

回答

1

首先,你應該檢查連接作出確定:

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

fsockopen返回false如果連接失敗。因此,添加以下提到的代碼

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

每個命令發出的SMTP服務器會給出一個數字響應 - 你應該檢查的反應是繼續下一個命令之前正確的 - 一旦你讀了最後的評論,一切都還行 - 這是確認電子郵件發送.. see this link這也解釋了,你應該從每個命令

因此,例如

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; 
} 

同樣,你將需要爲每個發送的命令執行此操作。我相信你明白了......