2014-02-13 30 views
1

我試圖通過使用PHP的AmazonSES發送帶有圖片附件的原始郵件。當我將電子郵件發送到Gmail帳戶但Hotmail帳戶正在接收空的附加圖像時,它效果很好。換句話說,hotmail似乎認識到有附件,這些附件具有我指定的正確名稱,只是它們總是空的,大小爲0字節。谷歌搜索沒有幫助...提前致謝!hotmail沒有收到圖片附件內容

$amazonSES = new AmazonSES(); 

// if (empty($attach)==0) { 
    // $response = $amazonSES->send_email(AWS_SES_FROM_EMAIL, 
     // array('ToAddresses' => array($to)), 
     // array('Subject.Data' => $subject,'Body.Text.Data' => $messagein,) 
    //); 
// } else { 
    $rstring = 'ajfas90lsjhntlen89y34oi598'; 

    $message= "To: ".$to."\n"; 
    $message.= "From: " . AWS_SES_FROM_EMAIL . "\n"; 
    $message.= "Subject: " . $subject . "\n"; 
    $message.= "MIME-Version: 1.0\n"; 
    $message.= 'Content-Type: multipart/mixed; boundary="ARandomString'.$rstring.'"'; 
    $message.= "\n\n"; 
    $message.= "--ARandomString$rstring\n"; 
    $message.= 'Content-Type: text/plain; charset="utf-8"'; 
    $message.= "\n"; 
    $message.= "Content-Transfer-Encoding: 7bit\n"; 
    $message.= "Content-Disposition: inline\n"; 
    $message.= "\n"; 
    $message.= $messagein; 
    $message.= "\n\n"; 
    $message.= "--ARandomString$rstring\n"; 

    foreach ($attach as $attachment) { 
     // $message.= "Content-ID: \<[email protected]_IS_ADDED\>\n"; 
     $message.= "Content-ID: \<". md5(uniqid(rand(), true)) ."@biomechanico.com\>\n"; 
     $message.= 'Content-Type: application/zip; name="shell.zip"'; 
     $message.= "\n"; 
     $message.= "Content-Transfer-Encoding: base64\n"; 
     $message.= 'Content-Disposition: attachment; filename="' . $attachment["name"] . '"'; 
     $message.= "\n" . base64_encode(file_get_contents($attachment["file"])) . "\n"; 
     $message.= "--ARandomString$rstring\n"; 
    } 

    $response = $amazonSES->send_raw_email(array(
        'Data'=> base64_encode($message)), 
         array('Source'=>AWS_SES_FROM_EMAIL, 'Destinations'=> $to)); 

回答

2

您正在生成格式不正確的消息。

考慮使用合適的庫來生成郵件消息,而不是將它們與原始字符串拼接在一起。

否則,這裏是我馬上注意到的。

  1. 最終多邊界必須通過額外的--被終止,即,最後一行必須是:

    --ARandomStringajfas90lsjhntlen89y34oi598--

    而非

    --ARandomStringajfas90lsjhntlen89y34oi598

  2. 在附接部分,您在之間沒有空行標題線和身體。

  3. 消息行不得超過998個字符,但Base64編碼的附件數據無論多長,都始終在一行上。

  4. 據我瞭解PHP,你在接部分Content-ID語法是錯誤的,因爲它產生Content-ID: \<whatever\>但應該產生Content-ID: <whatever>

  5. 線必須由CR LF(\r\n),但你被終止有LF(\n)。

一個好方法調試消息的問題是採取實際完全生成的消息源($message),並通過Message Lint運行它。如果上述建議不起作用,請發佈生成的消息源而不是PHP代碼。請參考RFC 5322。有關多部分消息語法,請參閱RFC 2046

+0

這些解決了我的問題,謝謝。我試圖使用PHPmailer,但無法弄清楚如何讓它與亞馬遜工作。再次感謝 – nbunderson

+1

@nbunderson您可能需要調用類似於['getSentMIMEMessage'](http://phpmailer.github.io/PHPMailer/classes/PHPMailer.html#method_getSentMIMEMessage)的東西,並將結果字符串分配給'$ message'。 –

相關問題