はじめに
Amazon SNS メール通知機能を使用した際、日本語が文字化けしました。
同じ事象に遭遇し困っている方の参考になれば幸いです。
構成
- CloudWatch Logs ロググループにサブスクリプションフィルタを設定し、文字列 "ERROR" を検知します。
- Lambda 関数をトリガーし、SNS を使用してログの内容をメール通知します。Lambda 関数では Boto3 の SNS.Client.publish を使用して SNS メール通知します。
発生した事象
通知されたメール本文が以下のように文字化けしました。
以下の例の場合、「清水」の「清」1文字だけ文字化けしており、メール本文に同様に存在する他の「清」の字は文字化けしていませんでした。
原因
Amazon SNS では、本文に UTF-8 エンコーディングを指定しており、かつ Content-Transfer-Encoding が 7bit という仕様となっています。
このため、経由するメール転送エージェントによっては、情報が欠落し文字化けが発生する場合があります。
Amazon SNS ではメールのエンコード方法が指定できないため、本事象が発生しうる挙動となります。
解決策
解決策1
Amazon SNS で通知する内容には 7bit の ASCII 文字列のみを使用する。
つまり日本語は使用せず英語のみ使用する。
解決策2
日本語を使用したい場合、Amazon SNS の代わりに Amazon SES を使用する。
Amazon SES では、以下のようにエンコーディングとして ISO-2022-JP を指定することができます。
ご参考:Boto3 SES/Client/send_email
response = client.send_email(
Source='送信元メールアドレス',
Destination={
'ToAddresses': [
'送信先メールアドレス',
]
},
Message={
'Subject': {
'Data': 'メール件名',
'Charset': 'ISO-2022-JP'
},
'Body': {
'Text': {
'Data': 'メール本文',
'Charset': 'ISO-2022-JP'
}
}
}
)
以下のように文字化けを解消することができました。