Python中Django發(fā)送帶圖片和附件的郵件
最近需要做集團的SRC系統(tǒng)。暫無安全研發(fā),所以只能找我這個小菜兼職開發(fā)。系統(tǒng)使用Django框架,在整個過程中,有許多奇特的需求。在某項需求中,需要給廠商用戶發(fā)送富文本郵件,漏洞詳情,這個折騰了一下,感覺略有收獲,所以記一篇隨筆。
首先我在網(wǎng)上搜索了一些資料,發(fā)現(xiàn)都是python通過smtplib發(fā)送,使用MIME格式來生成富文本郵件:傳送門
我想的是,使用Django框架,框架帶了郵件模塊,沒必要引入smtplib吧。我就想,向上文傳送門那樣,生成一個MIME文件,然后通過
from django.core import mail mail.send_mail
這種方式把MIMEMultipart對象使用as_string()方法生成的文件當做message發(fā)出去不就好了嗎。呃,有興趣的可以試一下。。我發(fā)出去了一堆字符串。。
好吧,失敗了,難道真的要把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'] = subject msgRoot['From'] = strFrom msgRoot['To'] = strTo msgText = MIMEText(plainText, 'plain', 'utf-8') msgAlternative.attach(msgText) #設定HTML信息 msgText = MIMEText(htmlText, 'html', 'utf-8') msgAlternative.attach(msgText)
然后我們對比一下message.py里面的代碼:
def message(self): encoding = self.encoding or settings.DEFAULT_CHARSET msg = SafeMIMEText(self.body, self.content_subtype, encoding) msg = self._create_message(msg) msg['Subject'] = self.subject msg['From'] = self.extra_headers.get('From', self.from_email) msg['To'] = self.extra_headers.get('To', ', '.join(map(force_text, self.to)))
篇幅所限不粘貼太多,有興趣可以自己去研讀。我們發(fā)現(xiàn),他們是不是很像,其實讀完整個message.py我們會發(fā)現(xiàn)一件事。原來EmailMessage這個類的對象,可以看做是MIMEMultipart對象加上了smtplib的發(fā)送功能。而且它也有attach方法,可以像MIMEMultipart對象那樣拼接富文本郵件內(nèi)容,好,這就有辦法了!我們通過EmailMessage來發(fā)送富文本郵件!
# -*- coding: utf-8 -*- # =============================================================================== # @ Creator:首席小學生 # @ Date:2017-03-28 # 構造富文本郵件內(nèi)容 # =============================================================================== import os from email.mime.image import MIMEImage from django.conf import settings from django.core import mail def add_img(src, img_id): """ 在富文本郵件模板里添加圖片 :param src: :param img_id: :return: """ fp = open(src, 'rb') msg_image = MIMEImage(fp.read()) fp.close() msg_image.add_header('Content-ID', '<'+img_id+'>') return msg_image def send_util(): path = os.getcwd() path_use = path.replace('\\', '/') html = ''' <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 小伙子,你成功了 <img src="cid:test_cid"/> </body> </html> ''' recipient_list = ['xxxx@xxxx.com'] from_mail = settings.EMAIL_HOST_USER msg = mail.EmailMessage('富文本郵件測試', html, from_mail, recipient_list) msg.content_subtype = 'html' msg.encoding = 'utf-8' image = add_img(path_use+'/mail_util/test.png', 'test_cid') msg.attach(image) if msg.send(): return True else: return False
我們在views中設置視圖函數(shù),調(diào)用上面這些測試方法嘗試一下:
from django.shortcuts import render from html_to_mail import send_util def send_mail(request): if send_util(): return render(request, 'ok.html') else: return render(request, 'error.html')
在urls里面隨意配置一個映射指向這個視圖函數(shù),把Django工程run起來,直接在瀏覽器get這個映射。發(fā)現(xiàn)郵件發(fā)送成功!
工程目錄如上圖。我不想上傳代碼,我覺得直接下載源碼用來用的話很難學會
就是這樣,我完成了Django的富文本郵件發(fā)送。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
教你用Python+selenium搭建自動化測試環(huán)境
今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著如何用Python+selenium搭建自動化測試環(huán)境展開,文中有非常詳細的介紹,需要的朋友可以參考下2021-06-06Python2實現(xiàn)的LED大數(shù)字顯示效果示例
這篇文章主要介紹了Python2實現(xiàn)的LED大數(shù)字顯示效果,涉及Python的簡單交互與列表相關使用技巧,需要的朋友可以參考下2017-09-09python中struct模塊之字節(jié)型數(shù)據(jù)的處理方法
今天小編就為大家分享一篇python中struct模塊之字節(jié)型數(shù)據(jù)的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python 出現(xiàn)錯誤TypeError: ‘NoneType’ object is not iterable解決辦法
這篇文章主要介紹了Python 出現(xiàn)錯誤TypeError: ‘NoneType’ object is not iterable解決辦法的相關資料,需要的朋友可以參考下2017-01-01