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

如何使用Laravel 5从SQS接收Amazon SNS消息?处理SES邮件响应

嘿,我来帮你搞定Laravel 5.5监听SQS获取SES/SNS消息的事儿!

处理Laravel 5.5监听SQS获取SES的SNS消息

1. 先确认队列配置的正确性

首先得确保config/queue.php里的SQS配置完全匹配AWS控制台的信息,重点检查key、secret、prefix、queue和region这些参数:

'sqs' => [
    'driver' => 'sqs',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/你的AWS账号ID'),
    'queue' => env('SQS_QUEUE', '你的SES通知队列名'),
    'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],

记得把.env文件里对应的环境变量填准确哦。

2. 处理SNS消息的嵌套结构

SNS推送到SQS的消息是嵌套封装的,直接var_dump只能看到SNS的外层信息,拿不到实际的SES通知内容。你需要先解析Message字段,它是一个JSON字符串。

给你写个实用的任务处理器示例:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class ProcessSesNotification implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $sqsMessage;

    /**
     * 创建任务实例
     *
     * @param array $sqsMessage
     * @return void
     */
    public function __construct(array $sqsMessage)
    {
        $this->sqsMessage = $sqsMessage;
    }

    /**
     * 执行任务
     *
     * @return void
     */
    public function handle()
    {
        // 解析SNS封装的Message字段(JSON格式)
        if (isset($this->sqsMessage['Message'])) {
            $sesNotification = json_decode($this->sqsMessage['Message'], true);
            
            // 现在就能看到真实的SES通知内容了
            var_dump($sesNotification);
            
            // 还能根据类型区分处理逻辑
            switch ($sesNotification['notificationType']) {
                case 'Bounce':
                    // 处理退信逻辑
                    break;
                case 'Complaint':
                    // 处理投诉逻辑
                    break;
                case 'Delivery':
                    // 处理送达逻辑
                    break;
            }
        } else {
            // 处理非SNS格式的异常消息
            var_dump($this->sqsMessage);
        }
    }
}

3. 正确启动队列监听器

用指定SQS驱动的命令启动监听器,测试环境可以用:

php artisan queue:listen sqs

生产环境更推荐用queue:work,它性能更高:

php artisan queue:work sqs --daemon

(Laravel 5.5里--daemon参数是有效的,后续版本有调整但5.5没问题)

4. 快速测试小技巧

如果想手动验证逻辑,可以从SQS控制台复制一条消息内容,写个Artisan命令手动分发任务:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Jobs\ProcessSesNotification;

class TestSesNotification extends Command
{
    protected $signature = 'test:ses-notification';
    protected $description = '测试处理SES通知消息';

    public function handle()
    {
        // 把从SQS控制台复制的消息内容粘贴到这里
        $sqsMessage = [
            'Type' => 'Notification',
            'MessageId' => 'xxx',
            'TopicArn' => 'xxx',
            'Message' => '{"notificationType":"Bounce", ...}', // 这里填真实的SES JSON内容
            // 其他SNS字段...
        ];

        ProcessSesNotification::dispatch($sqsMessage);
        $this->info('测试任务已分发!');
    }
}

运行php artisan test:ses-notification,就能在队列监听器的终端里看到输出结果了。

常见踩坑点

  • 别忘了解析Message字段:直接输出原始消息只能看到SNS的外层包装,看不到SES的真实通知。
  • AWS权限要到位:确保Laravel使用的AWS账号拥有sqs:ReceiveMessage、sqs:DeleteMessage等队列操作权限,不然监听器会报错。
  • 队列信息要完全匹配:队列名称、AWS区域必须和控制台里的完全一致,否则监听器连不上队列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:51