djangoのdjango.core.mail を再利用して、単体で動くdjangomailパッケージを作ってみた

発端 : pythonでmail関連のコード書いてたら、マルチパートとかめんどくさくなってきて、こんなん書いてたら、ぱねえ と思ったから、定評あるDjangoのmailコードから必要な部分を拝借してきた。

というわけでレッツ!!3分クッキング。
チャラ、チャッチャッチャ〜♪ チャラ、チャッチャッチャ〜♪
チャラ、チャッチャッチャ〜♪ チャララララ〜〜〜♪

献立材料

以下のコードを落としてきます


それぞれ、以下のように保存します


djangoMail/
|
|-- conf
| |-- __init__.py
|
|-- mail.py
|
`-- utils
|-- __init__.py
|-- encoding.py
`-- functional.py

このままだとdjangoのパスで書かれているのでエラーが出て使えないので、一部パスを変更します

mail.pyの18行目と19行目を変更

# from django.conf import settings
# from django.utils.encoding import smart_str, force_unicode
from conf import settings
from utils.encoding import smart_str, force_unicode

encoding.pyの4行目を変更

# from django.utils.functional import Promise
from utils.functional import Promise

conf/__init__.pyの11行目を変更

# from django.conf import global_settings
from conf import global_settings

要はdjangoってかいてあるパッケージのインポートPATHをdjangoを消して修正してるだけですね

次にdjangoMail直下に__init__.pyとconf直下にglobal_settings.pyというファイルを作成する。

中身はそれぞれ以下の通り。

__init__.py

from conf import settings
settings.configure()

global_settings.py

# People who get code error notifications.
# In the format (('Full Name', 'email@domain.com'), ('Full Name', 'anotheremail@domain.com'))
#ADMINS = ()

# Default content type and charset to use for all HttpResponse objects, if a
# MIME type isn't manually specified. These are used to construct the
# Content-Type header.
DEFAULT_CHARSET = 'utf-8'

# E-mail address that error messages come from.
SERVER_EMAIL = 'root@localhost'

# Whether to send broken-link e-mails.
# SEND_BROKEN_LINK_EMAILS = False

# Host for sending e-mail.
EMAIL_HOST = 'localhost'

# Port for sending e-mail.
EMAIL_PORT = 25

# Optional SMTP authentication information for EMAIL_HOST.
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False

# Default e-mail address to use for various automated correspondence from
# the site managers.
DEFAULT_FROM_EMAIL = 'webmaster@localhost'

# Subject-line prefix for email messages send with django.core.mail.mail_admins
# or ...mail_managers.  Make sure to include the trailing space.
#EMAIL_SUBJECT_PREFIX = '[Django] '

まあ、重要なのはglobal_settings.pyのほうですね。
設定の意味はこの辺を参考に。。。

これで、 EMAIL_HOST および EMAIL_PORT 設定で指定した SMTP ホストを介してメールを送信します。 EMAIL_HOST_USER および EMAIL_HOST_PASSWORD を指定していれば、 SMTP サーバの認証に使います。また、SMTP サーバとの接続に TLS を使うかどうかを EMAIL_USE_TLS で設定できます。
django.core.mail で送信される電子メールの文字セットは DEFAULT_CHARSET 設定の値に設定されます。

Django v1.0 documentation

最終的には以下のようなディレクトリ構成になってる

djangoMail/
|-- __init__.py
|-- conf
|   |-- __init__.py
|   `-- global_settings.py
|
|-- mail.py
`-- utils
    |-- __init__.py
    |-- encoding.py
    |-- functional.py

これで一応完成。

というわけでテストしてみます。

testDjangoMail.py

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

from  djangoMail.mail import send_mail

if __name__ == '__main__':
        send_mail('Subject here', 'Here is the message.', 'from@example.jp', ['to@example.jp'] , fail_silently=False )
        pass


日本語を含む場合だとこのようにします。
testDjangoMailJP.py

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

from djangoMail.mail import send_mail
from djangoMail.mail import EmailMessage

if __name__ == '__main__':
        email = EmailMessage(
                        u'件名はこんにちは', u'これは本文ですよ', u'わたしです<iam@example.jp>',
                        ['親愛なるあなたへ<you@example.jp>'],
        email.send()
        pass


メールが着ていれば、ばっちり!!

Djangoから取ってきて改変するのがメンドイ人のためにファイル置いておきます。
djangomail - Google Code