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

使用PHPMailer与SES通过IAM角色发邮件的SMTP认证问题

解决EC2容器中PHP通过SES基于IAM角色发邮件的SMTP认证问题

问题根源

你当前使用PHPMailer通过SMTP协议连接SES,但SES的SMTP服务强制要求认证,且SMTP协议本身不支持IAM角色授权——IAM角色仅适用于AWS API调用,而非SMTP协议。这就是你收到530 Authentication required错误的核心原因。

解决方案

方案一:改用AWS SDK for PHP调用SES API(支持IAM角色)

这是完全符合你"基于角色权限、不用用户名密码"需求的正确方式,AWS SDK会自动从EC2实例/容器的IAM角色获取凭证,无需硬编码。

步骤1:配置IAM角色

给EC2实例(或容器所在的ECS/EKS任务)附加具有SES发送权限的IAM角色,策略示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*"
        }
    ]
}

步骤2:安装AWS SDK for PHP

执行Composer命令:

composer require aws/aws-sdk-php

步骤3:编写发送邮件的PHP代码

require 'vendor/autoload.php';

use Aws\Ses\SesClient;
use Aws\Exception\AwsException;

// 自动从实例/容器的IAM角色获取凭证,无需硬编码
$sesClient = new SesClient([
    'version' => 'latest',
    'region'  => 'us-east-1' // 替换为你的SES服务区域
]);

$sender = 'noreply@mydomain.com'; // 需在SES中完成验证(沙盒模式下)
$recipient = $strToMail;
$subject = 'SES Test Email';
$textBody = 'Test email body';
$htmlBody = '<h1>Test email body</h1>';

try {
    $result = $sesClient->sendEmail([
        'Destination' => [
            'ToAddresses' => [$recipient]
        ],
        'Message' => [
            'Body' => [
                'Html' => [
                    'Charset' => 'UTF-8',
                    'Data' => $htmlBody
                ],
                'Text' => [
                    'Charset' => 'UTF-8',
                    'Data' => $textBody
                ]
            ],
            'Subject' => [
                'Charset' => 'UTF-8',
                'Data' => $subject
            ]
        ],
        'Source' => $sender
    ]);
    echo "邮件发送成功!Message ID: " . $result['MessageId'];
} catch (AwsException $e) {
    echo "发送失败:" . $e->getMessage();
}

方案二:继续使用PHPMailer SMTP方式(需SES SMTP凭证)

如果坚持用SMTP协议发送,必须生成SES专属的SMTP凭证,无法直接通过IAM角色授权SMTP连接。

步骤1:生成SES SMTP凭证

在AWS控制台进入SES服务,点击左侧「SMTP设置」→「创建我的SMTP凭证」,按照指引生成SMTP用户名和密码(这不是IAM用户的密码,是SES专属的SMTP认证凭证)。

步骤2:修改PHPMailer代码

开启SMTP认证并填入生成的SMTP凭证:

require 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->isSMTP();
    $mail->SMTPDebug  = 3;
    $mail->Host       = $strSesHostName; // 如email-smtp.us-east-1.amazonaws.com
    $mail->SMTPAuth   = true; // 必须开启认证
    $mail->Username   = '你的SES SMTP用户名';
    $mail->Password   = '你的SES SMTP密码';
    $mail->SMTPSecure = 'ssl';
    $mail->SMTPAutoTLS = false;
    $mail->Port       = 465;

    //Recipients
    $mail->setFrom($strFromMail, 'Prifulnath');
    $mail->addAddress($strToMail);

    //Content
    $mail->isHTML(true);
    $mail->Subject = 'SES Test Email';
    $mail->Body    = 'Test email body';

    $mail->send();
    echo '邮件已发送';
} catch (Exception $e) {
    echo "邮件发送失败:{$mail->ErrorInfo}";
}

通用注意事项

  • 沙盒模式下,发件邮箱和收件邮箱都需在SES中完成验证;若已移出沙盒,仅需验证发件邮箱。
  • 若使用容器部署(如ECS),需给任务配置IAM角色,而非仅给EC2实例配置角色,确保容器能正常获取角色凭证。

内容的提问来源于stack exchange,提问作者Prifulnath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:34