タダです.
SendGrid を利用していると遭遇するのはバウンスメールだと思います.そこで,バウンスが発生しているメールアドレスがあったら検知する仕組みを検証したのでこの記事にまとめます.
バウンスメール発生検知の仕組み構成
今回の仕組みでは,Event Webhookを使ってもいいかと思ったんですが,即時性はそこまで必要ではなかったので EventBridge -> Lambda -> SendGrid API -> Slack 通知
を実行するようにしました. 検証では Lambda -> SendGrid API
部分を確認したかったため本記事もこの部分に焦点を当てます.
バウンスメールの取得
バウンスメールの取得は Bounce API で行うことができます.バウンスメールが存在すると,レスポンスが次のように返ってきます.引数で start_time
と end_time
があるので EventBridge
で指定した時間と前回実行の間で発生したバウンスメールを取得しようと考えました.
サンプルイベント
[ { "created": 1443651125, "email": "testemail1@test.com", "reason": "550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at https://support.google.com/mail/answer/6596 o186si2389584ioe.63 - gsmtp ", "status": "5.1.1" }, { "created": 1433800303, "email": "testemail2@testing.com", "reason": "550 5.1.1 <testemail2@testing.com>: Recipient address rejected: User unknown in virtual alias table ", "status": "5.1.1" } ]
バウンスメールの取得のコード
SendGrid API ドキュメントを見ると多くの言語がサポートされていましたが, NodeJS で検証してみました.
const client = require('@sendgrid/client'); client.setApiKey("YOUR_API_KEY"); let date = new Date(); const startTime = Math.floor( date.getTime()); const endTime = Math.floor( date.getTime() - 300000 ) const req = { method: "POST", url: "/v3/suppression/bounces", start_time: startTime, end_time: endTime } let bounceDetailText = "" try { const res = client.request(req) if (res.length === 0) { console.log('No Bounce mail.') } else { res.map( bounce,i => { bounceDetailText = "```\n対象email: " + bounce[i].email + "\nバウンスの原因: " + bounce[i].reason +"\n```" }) } console.log(bounceDetailText) console.log('Check Bounce mail sucessfully') } catch (error) { console.error('Failed to chek Bounce mail.') }
バウンスメールが無ければ,No Bounce mail.
と表示され,バウンスメールが有った場合,Slack に投稿するようメッセージ形式を整形している感じです.
まとめ
SendGrid のバウンスメールを取得するコードを検証したので,そのコードをまとめました.次は Slack への投稿まで運用に載せてみて記事にしたいと思います.