aws-sdk-goを使ってAWS SESのSuppressionListからアドレスを消すのにちょっとハマったので、一応記録として残しておく。

SESからメールを送るのに、宛先が無効だったりするとSuppressionListに登録されて、以降送信が行われないようになります。 送信が行われるようにするにはSuppressionListから該当のアドレスを削除したり、保持期限が切れるのを待つ必要があります。

詳細は公式のドキュメントを参考ください。

で、SESを使ったサービスを作っているんですが、AWSアーキテクトに相談したところ、バウンスメールの処理はちゃんとしておかないとメール送れなくなるので注意してくださいと言われたので、対応するためにGo言語で作ったものを修正することにしました。

GoDocで確認したところ、service/sesにはSupressionListの操作に関するものは見つからなかったんですが、 service/sesv2の方にはDeleteSuppressedDestinationなるものがあったので、これで消せるのかなーと利用することにしました。

存在しないメールアドレスにSESからメールを送ってみて、メーラーデーモンから帰ってきたメールをLambdaで処理して送信に失敗した送り先をDeleteSuppressedDestinationに渡すようにしてたんですが、NotFoundExceptionが返ってくるんですね。Lambdaの処理が間違ってて渡してるメールアドレスが違うのかなーとか色々調べたんですが、DeleteSuppressedDestinationの使い方は間違ってない・・・。

で、GoDocでDeleteSuppressedDestinationの説明を再度確認してみたら、

Removes an email address from the suppression list for your account.

と書いてあって。

AWSのドキュメントの方を確認してみると2019/11/25以降からアカウントレベルでSuppressionListが使われるようになっていて、sesv2はそっちのリストから削除しに行ってるようです。 グローバルのSuppressionListから削除する関数は用意されていないようなので、SESの設定を変えることにしました。

aws --region $SES_REGION sesv2 put-account-suppression-attributes --suppressed-reasons BOUNCE COMPLAINT

これでアカウントレベルのSuppressionListに不達のメールアドレスが登録されるようになったので、 DeleteSuppressedDestinationを使ってリストから削除できるようになりました。

「なんか使えそうだな」で使わないでちゃんと周辺を調べておかないといけませんね。