[Django 0-1] Core.Email 模块

Mail 源码分析

模块文件结构

.
├── __init__.py
├── backends
│   ├── __init__.py
│   ├── base.py
│   ├── console.py
│   ├── dummy.py
│   ├── filebased.py
│   ├── locmem.py
│   └── smtp.py
├── message.py
└── utils.py

模块结构

  • backends: 邮件后端,包括 console,dummy,filebased,localmem,smtp
  • message: 主要是消息的抽象,分为 plaintext,html 两类

ConsoleEmailBackend 类

属性
  1. stream: 输出流
方法
  1. send_messages(email_messages): 发送邮件
def write_message(self, message):msg = message.message()msg_data = msg.as_bytes()charset = (msg.get_charset().get_output_charset() if msg.get_charset() else "utf-8")msg_data = msg_data.decode(charset)self.stream.write("%s\n" % msg_data)self.stream.write("-" * 79)self.stream.write("\n")def send_messages(self, email_messages):"""Write all messages to the stream in a thread-safe way."""if not email_messages:returnmsg_count = 0with self._lock:try:stream_created = self.open()for message in email_messages:self.write_message(message)self.stream.flush()  # flush after each messagemsg_count += 1if stream_created:self.close()except Exception:if not self.fail_silently:raisereturn msg_count

DummyEmailBackend 类

可以用于本地测试,验证方法调用是否成功

方法
  1. send_messages(email_messages): 发送邮件
def send_messages(self, email_messages):return len(list(email_messages))

FileBasedEmailBackend 类

文件流,将邮件消息写入文件流中

方法
  1. send_messages(email_messages): 发送邮件
def write_message(self, message):self.stream.write(message.message().as_bytes() + b"\n")self.stream.write(b"-" * 79)self.stream.write(b"\n")

LocmemEmailBackend 类

内存中存储邮件消息,可以用于测试或开发

方法
  1. send_messages(email_messages): 发送邮件
def send_messages(self, messages):"""Redirect messages to the dummy outbox"""msg_count = 0for message in messages:  # .message() triggers header validationmessage.message()mail.outbox.append(copy.deepcopy(message))msg_count += 1return msg_count

SMTPEmailBackend 类

SMTP 邮件后端,通过 SMTP 协议发送邮件

方法
  1. send_messages(email_messages): 发送邮件
def send_messages(self, email_messages):"""Send one or more EmailMessage objects and return the number of emailmessages sent."""if not email_messages:return 0with self._lock:new_conn_created = self.open()if not self.connection or new_conn_created is None:# We failed silently on open().# Trying to send would be pointless.return 0num_sent = 0try:for message in email_messages:sent = self._send(message)if sent:num_sent += 1finally:if new_conn_created:self.close()return num_sent

EmailMessage 类

属性
  1. subject:邮件主题
  2. body:邮件正文
  3. from_email:发件人地址
  4. to:收件人地址列表
  5. cc:抄送人地址列表
  6. bcc: 密送人地址列表
  7. reply_to:回复地址列表
  8. headers:自定义邮件头
  9. attachments:附件列表
  10. connection: 邮件服务器
方法
  1. attach(): 添加附件

邮件附件如果已经是 mime.MIMEBase 的话,直接加入到附件列表中。
如果不是,先猜测 mimetype 类型,然后以(filename, content, mimetype)加入到附件列表中。

filename=None, mimetype=None 的情况,会出错。


def attach(self, filename=None, content=None, mimetype=None):"""Attach a file with the given filename and content. The filename canbe omitted and the mimetype is guessed, if not provided.If the first parameter is a MIMEBase subclass, insert it directlyinto the resulting message attachments.For a text/* mimetype (guessed or specified), when a bytes object isspecified as content, decode it as UTF-8. If that fails, set themimetype to DEFAULT_ATTACHMENT_MIME_TYPE and don't decode the content."""if isinstance(filename, MIMEBase):if content is not None or mimetype is not None:raise ValueError("content and mimetype must not be given when a MIMEBase ""instance is provided.")self.attachments.append(filename)elif content is None:raise ValueError("content must be provided.")else:mimetype = (mimetypeor mimetypes.guess_type(filename)[0]or DEFAULT_ATTACHMENT_MIME_TYPE)basetype, subtype = mimetype.split("/", 1)if basetype == "text":if isinstance(content, bytes):try:content = content.decode()except UnicodeDecodeError:# If mimetype suggests the file is text but it's# actually binary, read() raises a UnicodeDecodeError.mimetype = DEFAULT_ATTACHMENT_MIME_TYPEself.attachments.append((filename, content, mimetype))
  1. message(): 生成 MIMEText 对象
def message(self):encoding = self.encoding or settings.DEFAULT_CHARSETmsg = SafeMIMEText(self.body, self.content_subtype, encoding)msg = self._create_message(msg)msg["Subject"] = self.subjectmsg["From"] = self.extra_headers.get("From", self.from_email)self._set_list_header_if_not_empty(msg, "To", self.to)self._set_list_header_if_not_empty(msg, "Cc", self.cc)self._set_list_header_if_not_empty(msg, "Reply-To", self.reply_to)# Email header names are case-insensitive (RFC 2045), so we have to# accommodate that when doing comparisons.header_names = [key.lower() for key in self.extra_headers]if "date" not in header_names:# formatdate() uses stdlib methods to format the date, which use# the stdlib/OS concept of a timezone, however, Django sets the# TZ environment variable based on the TIME_ZONE setting which# will get picked up by formatdate().msg["Date"] = formatdate(localtime=settings.EMAIL_USE_LOCALTIME)if "message-id" not in header_names:# Use cached DNS_NAME for performancemsg["Message-ID"] = make_msgid(domain=DNS_NAME)for name, value in self.extra_headers.items():if name.lower() != "from":  # From is already handledmsg[name] = valuereturn msg

EmailMultiAlternatives 类

EmailMultiAlternatives 类继承自 EmailMessage 类,增加了对 HTML 格式的支持。

总结

Django 的邮件模块提供了多种邮件后端,可以根据需要选择不同的后端。留有 dummy,console,locmem,filebased,smtp 多种类型后端。
通过 Django 邮件模块,避免重复编码,针对各类邮件服务器的特定规则只需自己实现发送后端逻辑,不需要重头编写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS详细教程

文章目录 前言一、CSS应用方式1.在标签上2.在head标签的style上3.写在文件中 二、选择器1.ID选择器2.类选择器3.标签选择器4.属性选择器5.后代选择器6.样式覆盖 三、CSS样式1.高度和宽度2.块级标签和行内标签转换3.字体颜色/大小/粗细/样式/对齐/边框4.浮动5.背景色6.内边距7.边…

[数据集][目标检测]番茄成熟度检测数据集VOC+YOLO格式277张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):277 标注数量(xml文件个数):277 标注数量(txt文件个数):277 标注类别…

IDEA上的Scala环境搭建

Scala环境搭建 一、搭建Scala开发环境 安装Scala编译器 安装scala-2.12.10.msi 检查scala安装情况 在dos窗口输入scala,检查是否能够进入编译器。进行简单的scala命令计算 在IDEA中进行scala编码 File - Settings - Plugins - MarketPlace中搜索scala插件 安…

总结mac下解决matplotlib中文显示问题的几种方法

一、前言: 使⽤matplotlib画图时,由于matplotlib默认没有中⽂,显⽰中文时会出现空⽩⼩⽅块。 二、方法: 2.1 matplotlib中使用SimHei字体 1)进入终端后查看matplotlib的字体路径: $ python >>&g…

Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error

我之前发了一篇讲Mac电脑玩Steam热门新游《幻兽帕鲁》的文章(没看过的点这里),后来也看到很多朋友去尝试了,遇到了一些问题,无法进入《幻兽帕鲁》游戏,或者是玩的时候卡顿以及出现黑屏,通过我的…

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码,源码由HTMLCSSJS组成,双击html文件可以本地运行效果,也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码

mac os 配置两个github账号

1. 清空git全局配置的username和email git config --global --unset user.name git config --global --unset user.emailgit config --list 可以查看是否清空了 2. 定义两个标识符,这两个标识符以后会被用来代替“github.com”来使用。 假设两个账号的邮箱地址分别是a@gmai…

计算机视觉之三维重建(1)---摄像机几何

文章目录 一、针孔模型和透镜1.1 针孔摄像机1.2 近轴折射模型1.3 透镜问题 二、摄像机几何2.1 像平面和像素平面2.2 齐次坐标下的投影变换2.3 摄像机倾斜2.4 规范化摄像机2.5 世界坐标系2.6 Faugeras定理2.7 投影变换性质: 三、其他投影摄像机模型3.1 弱透视投影摄像…

深入解析:在 Node.js 中删除文件的正确姿势

引言 在 Node.js 中处理文件尤其是移除文件,对于维护高效应用程序至关重要。储存和秩序当道的今天,删除不必要或冗余的文件能力显得尤为关键。本文深入探讨你会想要使用这个强大功能的时刻和原因,并通过各种案例展示了这个概念,同…

明远创意生活引领经典家纺品牌“大朴”走向新生

十二年前,有一个初创的国产家纺品牌,大胆地向消费者喊出领先于行业的标准——“无甲醛、无荧光增白剂、无致癌物”。凭借这样极致的健康承诺,“大朴”国内销售规模迅速超过一亿人民币,成功引领行业风气,收获了众多忠实粉丝。 2023年,因资金链断裂,“大朴”原公司破产清算,这个…

滴答拍摄影项目|基于Spring Boot框架+ Mysql+Java+ Tomcat的滴答拍摄影项目设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

使用 stable-diffusion 入门级教程【Mac】

最近一直在短视频平台刷到AI生成的图片,质量也非常不错。术哥也跟我讲解了下如何安装使用。于是周末试了试。 也差点变成从入门到放弃了,所以也把过程中遇到的问题记录一下。 目前基本上运行正常,只是内存稍微小了点,把质量调低即…

创建一个electron-vite项目

前置条件:非常重要!!! npm: npm create quick-start/electronlatest yarn: yarn create quick-start/electron 然后进入目录,下载包文件,运行项目 到以上步骤,你已经成功运行起来一个 electr…

全球变暖(蓝桥杯,acwing每日一题)

题目描述: 你有一张某海域 NN 像素的照片,”.”表示海洋、”#”表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就…

网络实名制接口-GO语言身份核验接口代码-身份证实名认证

互联网时代,人工识别身份证信息的方式已不适用于当下社会的发展需求,更需要高效精准的科技程序来支持,在线身份证实名认证接口必不可少。翔云身份证实名认证接口,可助力线上平台与消费者信用相关联,建立完善的客户资源…

nextjs 使用 lru-cache 进行缓存,在api里访问不到page中的缓存

因为Next.js中的页面和API路由是两个不同的执行上下文,它们之间的数据共享并不直接。 解决这个问题的一种常见方法是将缓存实例化为一个单独的模块,并在页面和API路由中共享这个模块。这样,无论是页面还是API路由,它们都可以访问…

爬虫技术实战案例解析

目录 前言 案例背景 案例实现 案例总结 结语 前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊爬虫技术实战案例解析,希望大家能觉得实用! 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!&#x1…

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时,支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知,就是在界面中可以支持…

机器学习-04-分类算法-04-支持向量机SVM

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与SVM算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程: 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…

插件电阻的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,引脚设计3.2,电阻体3.3,封装4,工艺流程4.1,材料准备4.2,电阻体制作4.3,引脚焊接4.4,绝缘处理4.5,测试与筛选4.6,包装与存储