如何通过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
相关产品推荐
相关产品推荐

