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

如何通过API或其他方式创建Amazon SES邮件?PHP网站用户注册场景实现

实现PHP网站注册用户使用Amazon SES的方案

核心思路

要让每个注册用户都能用SES发邮件,核心是验证用户的发件人身份(SES要求所有发件邮箱/域名必须验证,避免垃圾邮件),同时用你的SES账户代发(若引导用户关联自己的SES账户复杂度更高,这里优先讲代发方案)。

具体操作步骤

1. 集成AWS SDK for PHP

先通过Composer安装官方SDK:

composer require aws/aws-sdk-php

2. 用户注册时添加发件人验证流程

用户注册完成后,自动触发SES的邮箱验证请求:

require 'vendor/autoload.php';

use Aws\Ses\SesClient;

// 初始化SES客户端
$sesClient = new SesClient([
    'version' => 'latest',
    'region'  => 'us-east-1', // 替换成你的SES区域
    'credentials' => [
        'key'    => 'YOUR_AWS_ACCESS_KEY',
        'secret' => 'YOUR_AWS_SECRET_KEY',
    ],
]);

// 用户注册时的邮箱
$userEmail = 'user@example.com';

// 发送验证邮件
try {
    $result = $sesClient->verifyEmailIdentity([
        'EmailAddress' => $userEmail,
    ]);
    // 记录验证请求到数据库,标记状态为"待验证"
} catch (Exception $e) {
    // 处理错误,比如提示用户稍后重试
}

用户点击验证邮件里的链接后,SES会自动标记该邮箱为已验证,你可以通过调用getIdentityVerificationAttributes方法查询状态,更新数据库里的用户验证状态。

3. 存储用户SES身份状态

在用户表中添加字段:

  • ses_email_verified:布尔值,标记邮箱是否通过SES验证
  • ses_identity_status:字符串,记录SES返回的状态(如Pending/Success)

4. 代发邮件的权限与逻辑

用户发邮件时,先检查其邮箱是否已验证,再调用SES接口发送:

// 检查用户邮箱是否已验证(从数据库获取)
if ($user->ses_email_verified) {
    try {
        $result = $sesClient->sendEmail([
            'Source' => $userEmail, // 必须是已验证的邮箱
            'Destination' => [
                'ToAddresses' => ['recipient@example.com'],
            ],
            'Message' => [
                'Subject' => [
                    'Data' => '测试邮件',
                    'Charset' => 'UTF-8',
                ],
                'Body' => [
                    'Text' => [
                        'Data' => '这是用户通过SES发送的邮件',
                        'Charset' => 'UTF-8',
                    ],
                    // 可选HTML内容
                    'Html' => [
                        'Data' => '<p>这是用户通过SES发送的HTML邮件</p>',
                        'Charset' => 'UTF-8',
                    ],
                ],
            ],
        ]);
        // 邮件发送成功,记录日志
    } catch (Exception $e) {
        // 处理发送错误,比如配额不足、收件人无效等
    }
} else {
    // 提示用户先完成邮箱验证
}
通过API创建Amazon SES邮件的方法

1. 使用AWS SDK for PHP(推荐)

除了上面的sendEmail方法,还可以用sendRawEmail发送带附件或自定义MIME头部的邮件:

// 构造原始MIME邮件内容
$rawEmail = "From: {$userEmail}\r\n";
$rawEmail .= "To: recipient@example.com\r\n";
$rawEmail .= "Subject: 带附件的邮件\r\n";
$rawEmail .= "MIME-Version: 1.0\r\n";
$rawEmail .= "Content-Type: multipart/mixed; boundary=\"boundary123\"\r\n\r\n";
$rawEmail .= "--boundary123\r\n";
$rawEmail .= "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
$rawEmail .= "邮件正文\r\n\r\n";
$rawEmail .= "--boundary123\r\n";
$rawEmail .= "Content-Type: application/pdf; name=\"document.pdf\"\r\n";
$rawEmail .= "Content-Disposition: attachment; filename=\"document.pdf\"\r\n";
$rawEmail .= "Content-Transfer-Encoding: base64\r\n\r\n";
$rawEmail .= base64_encode(file_get_contents('document.pdf')) . "\r\n\r\n";
$rawEmail .= "--boundary123--";

try {
    $result = $sesClient->sendRawEmail([
        'RawMessage' => [
            'Data' => $rawEmail,
        ],
    ]);
} catch (Exception $e) {
    // 处理错误
}

2. 直接调用REST API(不推荐,需手动签名)

如果不想用SDK,需要构造符合AWS Signature Version 4的HTTP请求,示例请求参数(POST):

Action=SendEmail
&Version=2010-12-01
&Source=user%40example.com
&Destination.ToAddresses.member.1=recipient%40example.com
&Message.Subject.Data=测试邮件
&Message.Body.Text.Data=邮件正文

请求需要添加签名头部,具体签名逻辑可参考AWS官方文档的Signature Version 4说明,不过手动实现容易出错,优先用SDK。

参考文档
  • Amazon SES开发者指南:重点看「验证邮件身份」「使用SES发送邮件」章节
  • AWS SDK for PHP官方文档:查看SES客户端的所有方法参数和示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:53:08