You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中Amazon SES API个性化邮件含自定义头/附件的问题排查

问题分析与解决方案

你的代码核心问题

  1. sendBulkTemplatedEmail不支持在Destinations中定义自定义Headers
    AWS SES的sendBulkTemplatedEmail API里,Destinations数组的每个元素仅接受Destination、ReplacementTemplateData、ReplacementTags三个字段,你添加的Headers参数不在官方定义范围内,会被直接忽略。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:52