国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中Django發送帶圖片和附件的郵件

2019-11-25 16:16:34
字體:
來源:轉載
供稿:網友

最近需要做集團的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)

然后我們對比一下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)))

篇幅所限不粘貼太多,有興趣可以自己去研讀。我們發現,他們是不是很像,其實讀完整個message.py我們會發現一件事。原來EmailMessage這個類的對象,可以看做是MIMEMultipart對象加上了smtplib的發送功能。而且它也有attach方法,可以像MIMEMultipart對象那樣拼接富文本郵件內容,好,這就有辦法了!我們通過EmailMessage來發送富文本郵件!

# -*- coding: utf-8 -*-# ===============================================================================# @ Creator:首席小學生# @ Date:2017-03-28# 構造富文本郵件內容# ===============================================================================import osfrom email.mime.image import MIMEImagefrom django.conf import settingsfrom django.core import maildef 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_imagedef 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中設置視圖函數,調用上面這些測試方法嘗試一下:

from django.shortcuts import renderfrom html_to_mail import send_utildef send_mail(request):  if send_util():    return render(request, 'ok.html')  else:    return render(request, 'error.html')

在urls里面隨意配置一個映射指向這個視圖函數,把Django工程run起來,直接在瀏覽器get這個映射。發現郵件發送成功!

工程目錄如上圖。我不想上傳代碼,我覺得直接下載源碼用來用的話很難學會

 就是這樣,我完成了Django的富文本郵件發送。希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉安市| 阳曲县| 凌云县| 农安县| 漳平市| 荥阳市| 满城县| 台南市| 台山市| 惠东县| 称多县| 金塔县| 新营市| 龙胜| 新津县| 阿瓦提县| 武安市| 文水县| 象州县| 望奎县| 栾城县| 五莲县| 富宁县| 菏泽市| 苍梧县| 容城县| 门源| 安新县| 北票市| 天等县| 岫岩| 衡阳市| 独山县| 都江堰市| 广宗县| 长岛县| 吉首市| 凯里市| 合水县| 桂阳县| 南雄市|