2014-02-13 4 views
1

Я пытаюсь отправить сырое электронное письмо с вложениями изображений через AmazonSES с использованием PHP. Он отлично работает, когда я отправляю электронное письмо на учетную запись 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. В приложении частей, у вас нет пустой линии между Content-Disposition и тело.

  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'. –

 Смежные вопросы

  • Нет связанных вопросов^_^