Python で日本語メールを送信する方法

環境にもよるのか、日本語でメールを送信したい際にウェブで関連情報を見つけても、動かなかったりして過去のソースを漁ったりしていたので、自分用のまとめ

とても参考になるのがウノウラボさんのこの記事
Pythonでメールを送信したい人のためのサンプル集

この記事にある『日本語を含んだメール』部分のコードが使えそうだと思い、私の環境でで実行してみたところ。。。下記のエラーが。。

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)

「あぁ・・・またこれか」とつぶやきつつ、この原因はプログラムの冒頭で

import sys
print sys.getdefaultencoding()

などとすると

ascii

と返ってくるので、デフォルトエンコーディングが ascii がになっていることなのだと理解しているのですが、今回はここで

utf-8

が返ってくるようにしたい。。。

なので、

sys.setdefaultencoding('utf-8')

としてみたくなるのですが、プログラムの中でやると

AttributeError: ‘module’ object has no attribute ‘setdefaultencoding’

などと言われてしまい、実行中にデフォルトエンコーディングを変更させてもらえません。。ただ、プログラム実行前に予め設定しておくことはでき、その為には

/usr/lib/python2.6/site-packages/sitecustomize.py

というファイル(パスは環境次第、ファイル名はこの名前であること)を作って、その中身を下記のようにすれば良いのですが

import sys
sys.setdefaultencoding('utf-8')

site-packages の中を触りたくないというワガママを言いたい時があります。
そんな時に python を -Sオプションをつけて実行させることで site モジュールを自動で読み込まなくなる代わりに、自分で sys.setdefaultencoding() がプログラム中で使えることを知りました。

そしてたどり着いたコードが下記となるのですが、ここでエラーが・・

#!/usr/bin/python -S
# -*- coding: utf-8 -*-

import sys
sys.setdefaultencoding('utf-8')
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def send(from_addr, to_addr, msg):
    s = smtplib.SMTP()
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

def create_message2(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

if __name__ == '__main__':
    from_addr = 'foo@example.com'
    to_addr = 'bar@example.com'
    msg = create_message2(from_addr, to_addr, u'テスト', u'本文', 'ISO-2022-JP')
    send(from_addr, to_addr, msg)

上記のコードを私の環境で実行すると

smtplib.SMTPServerDisconnected: please run connect() first

がでたので、send() の中に s.connect() を入れました。

最終的には、下記のようなコードで日本語メールが送信できるようになりました。
# 下記コードは、冒頭で触れたウノウラボさんのコードをベースにしています

#!/usr/bin/python -S
# -*- coding: utf-8 -*-

import sys
sys.setdefaultencoding('utf-8')
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def send(from_addr, to_addr, msg):
    s = smtplib.SMTP()
    s.connect()
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

def create_message2(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

if __name__ == '__main__':
    from_addr = 'foo@example.com'
    to_addr = 'bar@example.com'
    msg = create_message2(from_addr, to_addr, u'テスト', u'本文', 'ISO-2022-JP')
    send(from_addr, to_addr, msg)
カテゴリー: Uncategorized   パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携済み