ちら帳

喉元を過ぎると熱さを忘れる自分の為の、ちら裏メモ帳ブログです。

Laravel5.5でAmazon SESのMessage-IDをロギングする

※過去に自分が他の媒体で書いていた記事を移動してきたものなので、情報が古い可能性があります。ご注意ください。

SESのMessage-IDとは

Amazon SES へのリクエストが成功すると、Amazon SES は成功のレスポンスを送信者に返します。このメッセージには、リクエストを一意に識別する文字列であるメッセージ ID が含まれます。メッセージ ID を使用すると、送信した E メールの識別や、送信中に発生した問題の追跡を行うことができます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/sending-email-with-ses.html

※送信中に発生した問題の追跡については、バウンスメールをSNSに転送して内容を確認する方法もあります。

LaravelでSESのMessage-IDをロギングする

メール送信イベントをフックし、メールのヘッダーからMessage-IDを取得してロギングします。

<?php
 
namespace App\Listeners;
 
use Illuminate\Mail\Events\MessageSent;
use Log;
 
class LogSentMessageId
{
    /**
     * Handle the event.
     *
     * @param  MessageSent  $event
     * @return void
     */
    public function handle(MessageSent $event)
    {
        $message = $event->message;
        $messageId = optional($message->getHeaders()->get('X-SES-Message-ID'))->getFieldBody();
 
        foreach ($message->getTo() as $toEmail => $toName) {
            Log::info('To: '.$toEmail.', ID: '.$messageId);
        }
    }
}
<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
 
class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Mail\Events\MessageSent' => [
            'App\Listeners\LogSentMessageId',
        ],
    ];
 
    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
 
        //
    }
}

SESのMessage-IDにはこういう問題もありますが、送信後に取得しているのでたぶん大丈夫なはず…です。 SES SMTP インターフェイスで Message-ID が上書きされる問題と対応 - Qiita

SESを使っていない時はIDがnullになります。