预期/得到;发送带有附件的 SES 电子邮件时出错

问题描述

使用 PHP 发送 SES 电子邮件时,无论我使用 SMTP 终端节点还是 AWS 开发工具包,我在发送带有附件的原始电子邮件时都会收到类似的错误AWS forumsWordpress plugin 中也报告了类似的错误。当我省略附件时,电子邮件每次发送都没有问题。

通过 SMTP 我收到以下错误

554 Transaction Failed: Expected '/',got null

使用 SDK ("aws/aws-sdk-PHP": "^3.178") 时,我收到以下信息:

exception 'Aws\Ses\Exception\SesException' with message 'Error executing "SendRawEmail" on "https://email.eu-west-2.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.eu-west-2.amazonaws.com` resulted in a `400 Bad Request` response:
 <ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
   <Error>
     <Type>Sender</Type>
     <Code>InvalidPara (truncated...)
  InvalidParameterValue (client): Expected '/',got ; - <ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
   <Error>
     <Type>Sender</Type>
     <Code>InvalidParameterValue</Code>
     <Message>Expected '/',got ;</Message>
   </Error>
   <RequestId>abc123-abc1-abc1-abc1-abc123acb123</RequestId>
 </ErrorResponse>

我正在使用 PHPMailer 发送消息:

// Prepare mime message
$mail = new PHPMailer();
$mail->setFrom($user['email'],$user['full_name']);
$mail->addAddress($recipient);
$mail->Subject = $entity['title'];
$mail->isHTML(true);
$mail->Body = $entity['body'];
$mail->addStringAttachment(
    'My DOMPDF content','attachment.pdf',PHPMailer::ENCODING_BASE64,'pdf'
);
$mail->preSend();
$raw = $mail->getSentMIMEMessage();

// Prepare SES client
$ses = new SesClient([
    'version' => '','region' => 'eu-west-2'
]);

// Send email
$ses->sendRawEmail([
    'RawMessage' => [
        'Data' => $raw,],]);

解决方法

应该使用application/pdf作为内容类型而不是pdf,否则附件添加为:

 --b1_IUbTPYYE0RFpfwGdeVX4Ggi2ErEKTd6JwKwjRJzEtE
 Content-Type: pdf; name=attachmentpdf
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename=attachment.pdf

代替:

 --b1_EPhqEYFUvxbgyaVbkH4eNDQXBxsXAJpRwTMMkcTY
 Content-Type: application/pdf; name=attachment.pdf
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename=attachment.pdf

验证错误出现在需要正斜杠的内容类型上:doh:。

$mail->addStringAttachment(
    'My DOMPDF content','attachment.pdf',PHPMailer::ENCODING_BASE64,'application/pdf'
);