全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python中Django发送带图片和附件的邮件

最近需要做集团的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'] = 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)))

篇幅所限不粘贴太多,有兴趣可以自己去研读。我们发现,他们是不是很像,其实读完整个message.py我们会发现一件事。原来EmailMessage这个类的对象,可以看做是MIMEMultipart对象加上了smtplib的发送功能。而且它也有attach方法,可以像MIMEMultipart对象那样拼接富文本邮件内容,好,这就有办法了!我们通过EmailMessage来发送富文本邮件!

# -*- coding: utf-8 -*-
# ===============================================================================
# @ Creator:首席小学生
# @ Date:2017-03-28
# 构造富文本邮件内容
# ===============================================================================
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中设置视图函数,调用上面这些测试方法尝试一下:

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里面随意配置一个映射指向这个视图函数,把Django工程run起来,直接在浏览器get这个映射。发现邮件发送成功!

工程目录如上图。我不想上传代码,我觉得直接下载源码用来用的话很难学会

 就是这样,我完成了Django的富文本邮件发送。希望对大家的学习有所帮助,也希望大家多多支持。


# django 发送邮件  # python 发送邮件 附件  # 有兴趣  # 好吧  # 邮件发送  # 的是  # 都是  # 这是  # 知道了  # 我想  # 传送门  # 也有  # 我在  # 好了  # 暂无  # 太多  # 天无绝人之路  # 去了  # 我觉得  # 很难  # 上了  # 要把 


相关文章: 专业商城网站制作公司有哪些,pi商城官网是哪个?  jQuery 常见小例汇总  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在IIS7中新建站点?详细步骤解析  如何配置支付宝与微信支付功能?  如何在阿里云虚拟主机上快速搭建个人网站?  如何通过宝塔面板实现本地网站访问?  如何制作网站标识牌,动态网站如何制作(教程)?  如何在建站宝盒中设置产品搜索功能?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何在万网开始建站?分步指南解析  建站之星如何开启自定义404页面避免用户流失?  济南专业网站制作公司,济南信息工程学校怎么样?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何通过多用户协作模板快速搭建高效企业网站?  如何选择靠谱的建站公司加盟品牌?  如何在局域网内绑定自建网站域名?  如何选择建站程序?包含哪些必备功能与类型?  制作电商网页,电商供应链怎么做?  python的本地网站制作,如何创建本地站点?  ,网站推广常用方法?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  如何正确下载安装西数主机建站助手?  个人摄影网站制作流程,摄影爱好者都去什么网站?  建站主机是什么?如何选择适合的建站主机?  建站之星安装模板失败:服务器环境不兼容?  网站按钮制作软件,如何实现网页中按钮的自动点击?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在阿里云完成域名注册与建站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  网站设计制作企业有哪些,抖音官网主页怎么设置?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  PHP 500报错的快速解决方法  网站制作模板下载什么软件,ppt模板免费下载网站?  网站制作话术技巧,网站推广做的好怎么话术?  XML的“混合内容”是什么 怎么用DTD或XSD定义  制作表格网站有哪些,线上表格怎么弄?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何用免费手机建站系统零基础打造专业网站?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  长沙企业网站制作哪家好,长沙水业集团官方网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  网站制作企业,网站的banner和导航栏是指什么?  如何零基础开发自助建站系统?完整教程解析  已有域名能否直接搭建网站?  如何用PHP工具快速搭建高效网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。