3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon SNS メール通知で日本語が文字化けした話

Posted at

はじめに

Amazon SNS メール通知機能を使用した際、日本語が文字化けしました。
同じ事象に遭遇し困っている方の参考になれば幸いです。

構成

  1. CloudWatch Logs ロググループにサブスクリプションフィルタを設定し、文字列 "ERROR" を検知します。
  2. Lambda 関数をトリガーし、SNS を使用してログの内容をメール通知します。Lambda 関数では Boto3 の SNS.Client.publish を使用して SNS メール通知します。

キャプチャ.PNG

発生した事象

通知されたメール本文が以下のように文字化けしました。
以下の例の場合、「清水」の「清」1文字だけ文字化けしており、メール本文に同様に存在する他の「清」の字は文字化けしていませんでした。

キャプチャ1.PNG

原因

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'
            }
        }
    }
)

以下のように文字化けを解消することができました。

キャプチャ.2PNG.PNG

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?