北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

google.appengine.api.mail はなかなかやり手

始めは日本語は駄目かと思ったんですが。

The Mail APIを見ながら、GAEアプリからメールを飛ばしてみました。結論から言うと、このAPIのsend_mail()メソッドは、文字コードを自動認識するようです。

例えば、ASCIIだけのメールを送ると、Content-Type: ヘッダはこうなります。

MIME-Version: 1.0
Subject: new message!
Content-Type: text/plain; charset=ISO-8859-1; Format=Flowed
Content-Transfer-Encoding: 7bit

hira.tara posted:
this is ascii.

ところが、日本語を含むメールを送ると、こんな感じになるのです。

MIME-Version: 1.0
Subject: new message!
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

hira.tara posted:
こんどはにほんご

すげー。さらに韓国語だとこうなりました。(文字化けしてるのはメールのソースをそのまま張ったから)

MIME-Version: 1.0
Subject: new message!
Content-Type: text/plain; charset=EUC-KR
Content-Transfer-Encoding: 8bit

hira.tara posted:
Çѱ¹¾î·Î ¸ÞÀÏÀ» º¸³À´Ï´Ù

ひえー。


ちなみに、send_mail()関数の使い方でちょっとハマりました。ASCIIのメールは余裕だったんですが、日本語のメールを送る場合は注意が必要です。

まず、やっちゃ駄目なことです。

  • send_mail()関数にunicode文字列を渡す → エラーになる
  • send_mail()関数にiso-2022-jpにした文字列を渡す → 文字化ける*1

正しい使い方は、send_mail()関数にutf-8のstrを渡す、です。self.request.get()で得た値はunicode文字列なので、encode('utf-8')して利用しましょう。

*1:charsetが指定されないから