日本語でのメール送信

140 views
Skip to first unread message

kazuto

unread,
Sep 20, 2008, 12:27:35 PM9/20/08
to Google-App-Engine-Japan
皆さん初めまして、GAE・Pythonほぼ初心者のkazutoと申します。

GAEとsmtp2web(http://www.smtp2web.com/)を使って、
GAE(厳密にはsmtp2web)宛に送ったメールを転送(すなわちGAEから送信)しようとしているのですが、
本文が日本語のメールを送った場合、文字コードが適切に設定されないようで、
転送されたメールの本文が文字化けしてしまっています。

ソースは以下のような感じです。

mail.send_mail(sender = "sen...@hoge.com",
to = "reci...@fuga.net",
subject = "test",
body =
email.message_from_string(self.request.body).get_payload()
)

set_charset('ISO-2022-JP') 等も試してみましたが、どうもうまくできません。

何か解決策、またはちょっとしたヒントでも構いません、
ご教授いただけないでしょうか。

どうかよろしくお願いいたします。

Atsushi Odagiri

unread,
Sep 20, 2008, 1:32:03 PM9/20/08
to google-app-...@googlegroups.com
小田切です。

bodyにutf-8で渡せばいいみたいですね。
日本語が入っている場合に、内部で自動的にiso-2022-jpのメールとするようです。
subjectに日本語が入っている場合もBエンコーディングしてくれました。


2008/9/21 kazuto <gka...@gmail.com>:

--
/*
Atsushi Odagiri
http://blog.aodag.jp
mailto:aod...@gmail.com
*/

kazuto

unread,
Sep 20, 2008, 7:16:53 PM9/20/08
to Google-App-Engine-Japan
kazutoです、

>小田切さま、返信ありがとうございます。

> bodyにutf-8で渡せばいいみたいですね。
そうなんです、ですがそれをどうやっていいのか分からなくて四苦八苦してました・・・
が、先ほどなんとか解決の糸口が見えました!

これまでは

msg = email.message_from_string(self.request.body).get_payload()
body = unicode(msg, 'iso2022_jp').encode('utf_8')

などとしていて失敗ばかりしていたのですが、試行錯誤の結果、

body = db.Text(unicode(msg,'iso2022_jp'))

とすれば ISO-2022-JP でのメール送信が可能になりました。
これから UTF-8 等でも試してみます。

差し支えなければ引き続き、
・もっと簡潔な方法はあるのでしょうか?
・今回私は根本的に何が理解できていなかったのでしょうか?
お教えいただければ幸いです。


On Sep 21, 2:32 am, "Atsushi Odagiri" <aod...@gmail.com> wrote:
> 小田切です。
>
> bodyにutf-8で渡せばいいみたいですね。
> 日本語が入っている場合に、内部で自動的にiso-2022-jpのメールとするようです。
> subjectに日本語が入っている場合もBエンコーディングしてくれました。
>
> 2008/9/21 kazuto <gkaz...@gmail.com>:
>
>
>
>
>
> > 皆さん初めまして、GAE・Pythonほぼ初心者のkazutoと申します。
>
> > GAEとsmtp2web(http://www.smtp2web.com/)を使って、
> > GAE(厳密にはsmtp2web)宛に送ったメールを転送(すなわちGAEから送信)しようとしているのですが、
> > 本文が日本語のメールを送った場合、文字コードが適切に設定されないようで、
> > 転送されたメールの本文が文字化けしてしまっています。
>
> > ソースは以下のような感じです。
>
> > mail.send_mail(sender = "sen...@hoge.com",
> > to = "recipi...@fuga.net",

Atsushi Odagiri

unread,
Sep 21, 2008, 1:51:48 AM9/21/08
to google-app-...@googlegroups.com
小田切です。

> body = db.Text(unicode(msg,'iso2022_jp'))

これでも、utf-8になるんですね:-)

pythonは、通常の文字列と、ユニコード文字列が明確に区別されています。
ユニコード文字列は、unicodeコンストラクタを使って作ります。
unicode(msg,'iso2022_jp')というのは、iso-2022-jpでエンコードされているバイト列からユニコードを作成しています。
ここから逆にutf-8の文字列を取得するには、encodeメソッドを使います。
kazuto様の場合は、以下のようにすればよいと思います。

body = unicode(msg, 'iso-2022-jp').encode('utf-8')

ただし、上記のようにすると、iso-2022-jp専用になってしまうので、emailモジュールを使って、メッセージをパースして、文字コードを取得した方がより汎用的だと思います。

pythonでも日本語の取り扱いについては、以下が参考になると思います。
http://www.python.jp/Zope/articles/japanese/Python4Japanese-2


以上。

2008/9/21 kazuto <gka...@gmail.com>:

--

Reply all
Reply to author
Forward
0 new messages