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

      最近須要作集團的SRC系統。暫無安全研發,因此只能找我這個小菜兼職開發。系統使用Django框架,在整個過程當中,有許多奇特的需求。在某項需求中,須要給廠商用戶發送富文本郵件,漏洞詳情,這個折騰了一下,感受略有收穫,因此記一篇隨筆。html

  首先我在網上搜索了一些資料,發現都是python經過smtplib發送,使用MIME格式來生成富文本郵件:傳送門python

  我想的是,使用Django框架,框架帶了郵件模塊,不必引入smtplib吧。我就想,向上文傳送門那樣,生成一個MIME文件,而後經過django

  

1 from django.core import mail
2 mail.send_mail

這種方式把MIMEMultipart對象使用as_string()方法生成的文件當作message發出去不就行了嗎。呃,有興趣的能夠試一下。。我發出去了一堆字符串。。瀏覽器

    好吧,失敗了,難道真的要把smtplib引進來?安全

    天無絕人之路,這個時候我看到了一句話:EmailMessage是Django封裝好的smtp。哦?還有這回事?好吧,嘗試一下看看源碼?跳轉至message.py框架

 1 class EmailMessage(object):
 2     """
 3     A container for email information.
 4     """
 5     content_subtype = 'plain'
 6     mixed_subtype = 'mixed'
 7     encoding = None     # None => use settings default
 8 
 9     def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
10                  connection=None, attachments=None, headers=None, cc=None,
11                  reply_to=None):
12         """
13         Initialize a single email message (which can be sent to multiple
14         recipients).
15 
16         All strings used to create the message can be unicode strings
17         (or UTF-8 bytestrings). The SafeMIMEText class will handle any
18         necessary encoding conversions.
19         """

 

  恩!大致知道了用法。函數

1 msg = mail.EmailMessage('富文本郵件測試', html, from_mail, recipient_list)

    就是這樣了。並且看message.py文件測試

1         if to:
2             if isinstance(to, six.string_types):
3                 raise TypeError('"to" argument must be a list or tuple')
4             self.to = list(to)

  看到raise的信息,明白了,咱們傳給他的recipient_list應該是元組或者列表url

self.from_email = from_email or settings.DEFAULT_FROM_EMAIL

  咱們傳給他的就是Django settings.py文件裏配置的郵箱,就是如下格式的:spa

1 # email config
2 # 這是咱們工程目錄下settings文件的配置
3 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
4 
5 EMAIL_HOST_PASSWORD = 'xxxxxxxx'
6 EMAIL_HOST_USER = 'xxxx@xxxx.xxxx'
7 EMAIL_HOST = 'smtp.xxxx.com'
8 EMAIL_PORT = port

  好,到此爲止,咱們知道了這個類怎麼用。咱們看傳送門裏的代碼,挑選比較重要的

 1 msgRoot = MIMEMultipart('related')
 2 msgRoot['Subject'] = subject
 3 msgRoot['From'] = strFrom
 4 msgRoot['To'] = strTo
 5 msgText = MIMEText(plainText, 'plain', 'utf-8')
 6 msgAlternative.attach(msgText)
 7 
 8 #設定HTML信息
 9 msgText = MIMEText(htmlText, 'html', 'utf-8')
10 msgAlternative.attach(msgText)

而後咱們對比一下message.py裏面的代碼:

1     def message(self):
2         encoding = self.encoding or settings.DEFAULT_CHARSET
3         msg = SafeMIMEText(self.body, self.content_subtype, encoding)
4         msg = self._create_message(msg)
5         msg['Subject'] = self.subject
6         msg['From'] = self.extra_headers.get('From', self.from_email)
7         msg['To'] = self.extra_headers.get('To', ', '.join(map(force_text, self.to)))

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

 1 # -*- coding: utf-8 -*-
 2 # ===============================================================================
 3 # @ Creator:首席小學生
 4 # @ Date:2017-03-28
 5 # 構造富文本郵件內容
 6 # ===============================================================================
 7 import os
 8 from email.mime.image import MIMEImage
 9 from django.conf import settings
10 from django.core import mail
11 
12 
13 def add_img(src, img_id):
14     """
15     在富文本郵件模板裏添加圖片
16     :param src:
17     :param img_id:
18     :return:
19     """
20     fp = open(src, 'rb')
21     msg_image = MIMEImage(fp.read())
22     fp.close()
23     msg_image.add_header('Content-ID', '<'+img_id+'>')
24     return msg_image
25 
26 
27 def send_util():
28     path = os.getcwd()
29     path_use = path.replace('\\', '/')
30     html = '''
31     <!DOCTYPE html>
32     <html lang="en">
33     <head>
34         <meta charset="UTF-8">
35         <title>Title</title>
36     </head>
37     <body>
38     牛逼呀小夥子,你成功了
39     <img src="cid:test_cid"/>
40     </body>
41     </html>
42     '''
43     recipient_list = ['xxxx@xxxx.com']
44     from_mail = settings.EMAIL_HOST_USER
45     msg = mail.EmailMessage('富文本郵件測試', html, from_mail, recipient_list)
46     msg.content_subtype = 'html'
47     msg.encoding = 'utf-8'
48     image = add_img(path_use+'/mail_util/test.png', 'test_cid')
49     msg.attach(image)
50     if msg.send():
51         return True
52     else:
53         return False

  咱們在views中設置視圖函數,調用上面這些測試方法嘗試一下:

1 from django.shortcuts import render
2 from html_to_mail import send_util
3 
4 
5 def send_mail(request):
6     if send_util():
7         return render(request, 'ok.html')
8     else:
9         return render(request, 'error.html')

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

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

 

就是這樣,我完成了Django的富文本郵件發送。畢竟是兼職開發,哪裏有問題的話,歡迎各位前輩不吝賜教,謝謝。

相關文章
相關標籤/搜索