StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

Python3でのメール送信時に日本語の差出人名を使う

以前のエントリで、Pythonからのメールの送信を試しましたが、


www.statsbeginner.net


この時は文中にも書いているとおり、差出人名を日本語表示するのがうまく出来ませんでした。
ところがその問題は、下記の方法で解決しました。


teratail.com


要するに、'差出人名 <アドレス>'という文字列を用意する時に、まるごとMIMEエンコードしてはダメで、「差出人名」のところだけがエンコードされるようにしなければならない。
それは前回のエントリ時点でも分かっていたんですが、なんか書き方が間違ってたようです。
どうやら、まず差出人名の文字列を.encode()メソッドでエンコードした上で、それをHeader()関数に与える際もHeader()関数の引数にエンコードを指定し、さらに、Headerオブジェクトそのものに.encode()メソッドを書き加えるということをしなければならなかったようです。
ただ、1個めの.encode()は要するに、Header()関数の引数としてエンコードされたバイト文字列を渡しているわけですが、べつにここにstr型で渡しても問題なく作動しました。
最後の.encode()は、これをつけることでRFCに沿ってMIMEエンコードされた文字列をstr型で受け取ることができるということのようです(説明)。これをつけないとこの部分がemail.header.Headerクラスのままになるので、あとで%sするときに不都合が起きるようです。


ということで、下記のように、

sender = '%s <%s>'%(Header('差出人名'.encode('iso-2022-jp'),'iso-2022-jp').encode(), メアド)


というように書いて、これをMIMEオブジェクトに与えて送信したら、ちゃんと表示されました。
一件落着です。


あと、何回か使ってみて、送信エラーが起きる理由は大きくわけて、

  1. 本文や名前(文中に宛名を差し込みする時)の日本語文字に'iso-2022-jp'でエンコードできないテキストが含まれている場合
  2. 送信途中でネットの回線が切れた場合

ですね。
なんかもうべつにUTF8で良い気はしてきました。