我正试图使用PHP通过AmazonSES发送一封带有图像附件的原始电子邮件。当我把电子邮件发送到gmail帐户时,效果很好,但hotmail帐户收到的是空的附加图像。换句话说,hotmail似乎能识别出有附件,并且这些附件的名称与我指定的名称正确,只是它们总是空的,大小为0字节。谷歌搜索没有帮助。。。提前感谢!
$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.0n";
$message.= 'Content-Type: multipart/mixed; boundary="ARandomString'.$rstring.'"';
$message.= "nn";
$message.= "--ARandomString$rstringn";
$message.= 'Content-Type: text/plain; charset="utf-8"';
$message.= "n";
$message.= "Content-Transfer-Encoding: 7bitn";
$message.= "Content-Disposition: inlinen";
$message.= "n";
$message.= $messagein;
$message.= "nn";
$message.= "--ARandomString$rstringn";
foreach ($attach as $attachment) {
// $message.= "Content-ID: <77987_SOME_WEIRD_TOKEN_BUT_UNIQUE_SO_SOMETIMES_A_@domain.com_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: base64n";
$message.= 'Content-Disposition: attachment; filename="' . $attachment["name"] . '"';
$message.= "n" . base64_encode(file_get_contents($attachment["file"])) . "n";
$message.= "--ARandomString$rstringn";
}
$response = $amazonSES->send_raw_email(array(
'Data'=> base64_encode($message)),
array('Source'=>AWS_SES_FROM_EMAIL, 'Destinations'=> $to));
您正在生成格式错误的消息。
考虑使用适当的库来生成邮件消息,而不是将它们从原始字符串拼接在一起。
否则,以下是我马上注意到的。
- 最终的多部分边界必须由一个额外的
--
终止,即最后一行必须是:
--ARandomStringajfas90lsjhntlen89y34oi598--
而不是
--ARandomStringajfas90lsjhntlen89y34oi598
-
在附件中,
Content-Disposition
标题行和正文之间没有空行。 -
消息行的长度不能超过998个字符,但Base64编码的附件数据无论多么长,都始终在一行上。
-
就我对PHP的理解而言,附件部分中
Content-ID
的语法是错误的,因为它产生Content-ID: <whatever>
,但应该产生Content-ID: <whatever>
-
行必须由CR LF(
rn
)终止,但您有LF(n
)。
调试消息问题的一个好方法是获取实际的完全生成的消息源($message
)并通过message Lint运行它。如果以上建议没有帮助,请发布生成的消息源,而不是PHP代码。
有关Internet消息格式,请参阅RFC 5322。有关多部分消息语法,请参阅RFC 2046。