PHP中Amazon SES API个性化邮件含自定义头/附件的问题排查
问题分析与解决方案
你的代码核心问题
sendBulkTemplatedEmail不支持在Destinations中定义自定义Headers
AWS SES的sendBulkTemplatedEmailAPI里,Destinations数组的每个元素仅接受Destination、ReplacementTemplateData、ReplacementTags三个字段,你添加的Headers参数不在官方定义范围内,会被直接忽略。sendBulkTemplatedEmail本身不支持附件
该方法是为纯模板化批量邮件设计的,仅提供模板变量替换能力,没有任何用于添加附件的参数入口。
实现需求的可行方案
要同时实现收件人专属内容、自定义邮件头、附件这三个需求,最稳妥的方式是:为每个收件人生成包含专属内容、自定义头、附件的MIME格式原始邮件,再通过SendRawEmail发送。
示例代码(使用PHPMailer简化MIME构建)
use Aws\Ses\SesClient; use Aws\Credentials\Credentials; use PHPMailer\PHPMailer\PHPMailer; // 初始化SES客户端 $credentials = new \Aws\Credentials\Credentials('access', 'secret_key'); $SesClient = new \Aws\Ses\SesClient([ 'version' => '2010-12-01', 'region' => 'us-west-2', 'credentials' => $credentials ]); // 遍历收件人生成并发送专属邮件 foreach($data['receivers'] as $key => $value){ // 生成当前收件人的专属内容 $subject = 'Test Subject for ' . $value['mail']; $htmlContent = 'Test Html for ' . $value['mail']; $textContent = 'Test Text for ' . $value['mail']; // 用PHPMailer构建符合MIME标准的邮件 $mail = new PHPMailer(true); $mail->CharSet = 'UTF-8'; $mail->setFrom('sender@test.com'); $mail->addAddress($value['mail']); $mail->addReplyTo('reply@test.com'); $mail->Subject = $subject; $mail->Body = $htmlContent; $mail->AltBody = $textContent; // 添加自定义邮件头 $mail->addCustomHeader('X-MyHeader', '123'); // 添加附件(替换为你的文件路径) $mail->addAttachment('/path/to/your/attachment.pdf'); // 生成原始邮件字符串 $mail->preSend(); $rawEmail = $mail->getSentMIMEMessage(); // 调用SES的SendRawEmail发送 try { $result = $SesClient->sendRawEmail([ 'RawMessage' => [ 'Data' => base64_encode($rawEmail) ] ]); echo("邮件发送成功至 {$value['mail']}! 消息ID: {$result['MessageId']}\n"); } catch (\Aws\Exception\AwsException $e) { echo("发送至 {$value['mail']} 失败: " . $e->getAwsErrorMessage() . "\n"); } }
补充说明
- 如果你担心循环调用的速率限制,可以结合SES的批量发送功能,但每个批量请求的收件人数量有限制,且由于每个收件人内容专属,实际还是单独生成发送更灵活。
- 若有部分统一的头信息,可以通过SES的**配置集(Configuration Sets)**管理,但收件人专属的自定义头仍需在原始邮件中设置。
内容的提问来源于stack exchange,提问作者ashbringer
相关产品推荐
相关产品推荐

