Django Mail配信

出典: UeblogWiki

目次

Tips

GmailのSMTPを使って送信

settings.py に以下の設定をします。

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'youremail@gmail.com'
EMAIL_HOST_PASSWORD = 'yourpassword'
EMAIL_PORT = 587

以下のコードで送信できます。

>>> from django.core.mail import EmailMessage
>>> email = EmailMessage('Hello', 'World', to = ['youremail@somewhere.com'])
>>> email.send()

今後変更になるTips

文字コードISO-2022-JPでメールの配信をする

django.core.mail.EmailMessageは

>>> from django.core.mail import EmailMessage
>>> email = EmailMessage(u'日本語件名', '本文', to = ['youremail@somewhere.com'])
>>> email.encoding = 'ISO-2022-JP'
>>> email.send()

でISO-2022-JPでメールの送信が可能なはずですが現状のDjangoでは上手くいきません。 現在、Django-jaの方でpatchを作って報告する予定ですがそれまでは

from django.core.mail import EmailMessage, SafeMIMEText, make_msgid
from django.conf import settings
from django.utils.encoding import smart_str, force_unicode
from email.Header import Header
from email.Utils import formatdate, parseaddr, formataddr
from email.MIMEText import MIMEText

class JapaneseEmailMessage(EmailMessage):
    def message(self):
        encoding = 'ISO-2022-JP'
        msg = MIMEText(smart_str(self.body, encoding), self.content_subtype, encoding)
        if self.attachments:
            body_msg = msg
            msg = MIMEMultipart(_subtype=self.multipart_subtype)
            if self.body:
                msg.attach(body_msg)
            for attachment in self.attachments:
                if isinstance(attachment, MIMEBase):
                    msg.attach(attachment)
                else:
                    msg.attach(self._create_attachment(*attachment))
        msg['Subject'] = Header(self.subject, encoding)
        msg['From'] = self.from_email
        msg['To'] = ', '.join(self.to)
        msg['Date'] = formatdate()
        msg['Message-ID'] = make_msgid()
        if self.bcc:
            msg['Bcc'] = ', '.join(self.bcc)
        for name, value in self.extra_headers.items():
            msg[name] = value
        return msg

のようなコードを作ればとりあえずは送れます。

>>> email = JapaneseEmailMessage(u'日本語件名', '本文', to = ['youremail@somewhere.com'])
>>> email.send()

しかし添付ファイルは文字化けするかもしれません。

UTF-8ならばこのコードを書かないでも問題なく送れます。

参考