最近需要做集團的SRC系統。暫無安全研發,所以只能找我這個小菜兼職開發。系統使用Django框架,在整個過程中,有許多奇特的需求。在某項需求中,需要給廠商用戶發送富文本郵件,漏洞詳情,這個折騰了一下,感覺略有收獲,所以記一篇隨筆。
首先我在網上搜索了一些資料,發現都是python通過smtplib發送,使用MIME格式來生成富文本郵件:傳送門
我想的是,使用Django框架,框架帶了郵件模塊,沒必要引入smtplib吧。我就想,向上文傳送門那樣,生成一個MIME文件,然后通過
from django.core import mail mail.send_mail
這種方式把MIMEMultipart對象使用as_string()方法生成的文件當做message發出去不就好了嗎。呃,有興趣的可以試一下。。我發出去了一堆字符串。。
好吧,失敗了,難道真的要把smtplib引進來?
天無絕人之路,這個時候我看到了一句話:EmailMessage是Django封裝好的smtp。哦?還有這回事?好吧,嘗試一下看看源碼?跳轉至message.py
class EmailMessage(object): """ A container for email information. """ content_subtype = 'plain' mixed_subtype = 'mixed' encoding = None # None => use settings default def __init__(self, subject='', body='', from_email=None, to=None, bcc=None, connection=None, attachments=None, headers=None, cc=None, reply_to=None): """ Initialize a single email message (which can be sent to multiple recipients). All strings used to create the message can be unicode strings (or UTF-8 bytestrings). The SafeMIMEText class will handle any necessary encoding conversions. """
恩!大體知道了用法。
msg = mail.EmailMessage('富文本郵件測試', html, from_mail, recipient_list)
就是這樣了。而且看message.py文件
if to: if isinstance(to, six.string_types): raise TypeError('"to" argument must be a list or tuple') self.to = list(to)
看到raise的信息,明白了,我們傳給他的recipient_list應該是元組或者列表
self.from_email = from_email or settings.DEFAULT_FROM_EMAIL
我們傳給他的就是Django settings.py文件里配置的郵箱,就是以下格式的:
# email config# 這是我們工程目錄下settings文件的配置EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_HOST_PASSWORD = 'xxxxxxxx'EMAIL_HOST_USER = 'xxxx@xxxx.xxxx'EMAIL_HOST = 'smtp.xxxx.com'EMAIL_PORT = port
好,到此為止,我們知道了這個類怎么用。我們看傳送門里的代碼,挑選比較重要的
msgRoot = MIMEMultipart('related')msgRoot['Subject'] = subjectmsgRoot['From'] = strFrommsgRoot['To'] = strTomsgText = MIMEText(plainText, 'plain', 'utf-8')msgAlternative.attach(msgText)#設定HTML信息msgText = MIMEText(htmlText, 'html', 'utf-8')msgAlternative.attach(msgText)
新聞熱點
疑難解答