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

