使用Amazon SES发送原始邮件的电子邮件编码

4

我正在尝试使用SES SDK 2.7中的sendRawEmail方法发送以下由PHPMailer 5.2.9生成的原始电子邮件消息:

Date: Tue, 28 Oct 2014 03:34:18 +0000
From: someemail@gmail.com
Reply-To: someemail@gmail.com
Message-ID: <c738074625a476ed8e2793323ad0b3b2@*.dev>
X-Priority: 3
X-Mailer: PHPMailer
MIME-Version: 1.0
Content-Type: multipart/alternative;
    boundary="b1_c738074625a476ed8e2793323ad0b3b2"
Content-Transfer-Encoding: 8bit
To: someperson@gmail.com
Subject: Test subject (TID #1, SID #2)

--b1_c738074625a476ed8e2793323ad0b3b2
Content-Type: text/plain; charset=us-ascii

Test email for _Some One_!


--b1_c738074625a476ed8e2793323ad0b3b2
Content-Type: text/html; charset=us-ascii

Test email for <i>Some One</i>!


--b1_c738074625a476ed8e2793323ad0b3b2--

以下是用于生成原始电子邮件并发送的代码:

以下是用于生成原始电子邮件并发送的代码:

$mail = new PHPMailer();

$mail->addAddress($to);
$mail->setFrom($from);
$mail->Subject = $subject;
$mail->CharSet = $char_set;
$mail->AltBody = $text;
$mail->Body = $html;
$mail->isHTML(true);
$mail->addAttachment($attachment);

$mail->preSend();

$args = [
    'Source'       => $from,
    'Destinations' => [$to],
    'RawMessage'   => [
        'Data' => $mail->getSentMIMEMessage()
    ]
];

$aws = Aws\Common\Aws::factory(app_path() . '/config/aws.php');

$ses = $aws->get('ses');

$send_result = $ses->sendRawEmail($args);

我在$send_result中没有收到任何错误,只有一个标准的'MessageId'和'RequestId',就像成功发送一样(实际上确实已经发送了)。

我也尝试过带附件和不带附件,但它仍然将消息发送为混乱的信息。这是接收到的内容:http://prntscr.com/50ij42

我在这里做错了什么?


我一直在尝试通过SES发送带附件的电子邮件,手动创建电子邮件的MIME结构非常困难。使用PHPMailer自动创建MIME结构是个绝妙的主意。 - Matt
1个回答

3

您忘记对数据进行编码:

'RawMessage'   => [
    'Data' => base64_encode( $mail->getSentMIMEMessage() )
]

来自SDK文档: ... - 内容必须进行base64编码,如果MIME需要。


奇怪,我读到“base64编码(如果必要)”,所以我认为这并不适用于8位编码。我还以为它只适用于MIME块本身,而不是整个电子邮件,所以当我的附件本身被Base64编码时,我认为那就可以了。不过这样修复了问题! - eComEvo
我同意,措辞有点令人困惑。 - Valentin Rodygin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接