Python中Django发送带图片和附件的邮件
发布时间 - 2026-01-11 00:27:20 点击率:次最近需要做集团的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 发送邮件 附件
# 有兴趣
# 好吧
# 邮件发送
# 的是
# 都是
# 这是
# 知道了
# 我想
# 传送门
# 也有
# 我在
# 好了
# 暂无
# 太多
# 天无绝人之路
# 去了
# 我觉得
# 很难
# 上了
# 要把
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建安全的FTP站点?
Laravel如何实现模型的全局作用域?(Global Scope示例)
中山网站推广排名,中山信息港登录入口?
Python制作简易注册登录系统
韩国服务器如何优化跨境访问实现高效连接?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
JavaScript模板引擎Template.js使用详解
如何用西部建站助手快速创建专业网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何为不同团队 ID 动态生成多个“认领值班”按钮
高防服务器:AI智能防御DDoS攻击与数据安全保障
微信公众帐号开发教程之图文消息全攻略
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
canvas 画布在主流浏览器中的尺寸限制详细介绍
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
无锡营销型网站制作公司,无锡网选车牌流程?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
利用JavaScript实现拖拽改变元素大小
网站制作壁纸教程视频,电脑壁纸网站?
WEB开发之注册页面验证码倒计时代码的实现
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
高端网站建设与定制开发一站式解决方案 中企动力
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel如何记录自定义日志?(Log频道配置)
公司门户网站制作流程,华为官网怎么做?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何用PHP工具快速搭建高效网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
如何快速搭建高效WAP手机网站?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何利用DOS批处理实现定时关机操作详解
如何快速生成专业多端适配建站电话?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
郑州企业网站制作公司,郑州招聘网站有哪些?
高端云建站费用究竟需要多少预算?

