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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:03:26