Laravel 9中使用AWS SES接收邮件及后续流程处理求助
解决方案
一、配置SES自动将邮件存入S3
无需编写代码,直接在AWS控制台完成配置:
- 进入SES控制台,切换到接收邮件页面,创建或选择接收规则集
- 新建规则,添加收件人匹配条件(比如指定你要接收的邮箱地址)
- 添加动作:选择将邮件保存到S3存储桶,选中你的
task-email-receive-bucket,可按需设置对象前缀(如emails/) - 配置S3权限:给存储桶添加桶策略,允许SES写入内容,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::task-email-receive-bucket/*", "Condition": { "StringEquals": { "aws:Referer": "你的AWS账号ID" } } } ] }
二、解析S3邮件内容并存储到数据库
1. 安装邮件解析库
使用Composer安装PHP邮件解析工具zbateson/mail-mime-parser,它能高效处理MIME格式的邮件:
composer require zbateson/mail-mime-parser
2. 完整代码示例
use ZBateson\MailMimeParser\MailMimeParser; use Aws\S3\S3Client; use Illuminate\Support\Facades\DB; // 若用Laravel框架,否则替换为原生DB操作 public function receiveEmailSES(Request $request) { // 建议从环境变量读取AWS凭证,禁止硬编码 $client = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), ], ]); $file_name = $request->input('fileName'); try { // 获取S3中的邮件对象 $object = $client->getObject([ 'Bucket' => 'task-email-receive-bucket', 'Key' => $file_name ]); $emailContent = $object['Body']->getContents(); // 解析邮件核心信息 $parser = new MailMimeParser(); $message = $parser->parse($emailContent); $from = $message->getHeaderValue('From'); $to = $message->getHeaderValue('To'); $subject = $message->getHeaderValue('Subject'); // 优先取HTML正文,无HTML则取纯文本 $body = !empty($message->getHtmlContent()) ? $message->getHtmlContent() : $message->getTextContent(); // 写入数据库(示例用Laravel DB门面,根据你的技术栈调整) DB::table('emails')->insert([ 'from' => $from, 'to' => $to, 'subject' => $subject, 'body' => $body, 's3_object_key' => $file_name, 'created_at' => date('Y-m-d H:i:s') ]); return response()->json(['status' => 'success', 'msg' => '邮件处理完成']); } catch (\Exception $e) { return response()->json(['status' => 'error', 'msg' => $e->getMessage()], 500); } }
3. 关键注意事项
- 凭证安全:禁止硬编码AWS密钥,推荐使用IAM角色(部署在EC2/ECS等AWS服务时)或环境变量管理凭证
- 触发优化:可配置S3事件通知,当新邮件存入桶时自动触发Lambda或你的API,无需手动传入
fileName - 扩展处理:如果需要解析附件,可参考
zbateson/mail-mime-parser的官方文档实现
内容的提问来源于stack exchange,提问作者Ankur Guha
相关产品推荐
相关产品推荐

