【进阶】利用python内置模块自动化发送邮件及邮件附件

目录

自动化发送邮件

流程:

步骤:

【重点】

【MIMEText--发送文本类型的邮件】

【MIMEImage-发送附件为图片的邮件】

【MIMEBase--发送附件为html报告的邮件】


自动化发送邮件

  • 以qq邮箱为例,提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服务,并获取授权码

    • 账号与安全--->安全设置--->POP3/IMAP/SMTP/Exchange/CardDAV 服务

    • 授权码不是qq密码

  • 163邮箱不需要授权码,账号和密码就ok

    • 密码失败的话,就换授权码^_^

  • 需要用到smtplib模块、email模块,python内置模块,不需要下载

    • smtplib用于发送邮件,email用于编写邮件内容

  • 邮箱登录后可以给任意邮箱发送邮件(qq可以发给163,qq等)

  • 抄送邮件(发送同一邮件到多人),传收件人参数时,用英文分号隔开,如:'xiaoming@xx.com;xiaohong@xx.com'

流程:
  1. 连接邮箱服务器

  2. 登录邮箱

  3. 准备邮件数据

  4. 添加邮件数据到邮件对象

  5. 发送邮件

步骤:
  1. 导包

  2. 定义发送邮件的方法,需传参数(发送人邮箱、授权码、收件人邮箱、标题/主题、主体内容、附件路径)

  3. 创建邮件(MIMEMultipart)对象

  4. 构建邮件头部显示样式

    1. 包括--标题/主题、发件人、收件人(时间是自动生成的,无需设置)

  5. 根据不同正文内容类型,构建不同email对象,设置文件主体内容(正文)

  6. 连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号

  7. 登录、发送邮件

【重点】
  • 根据发送的不同类型文件构建不同邮件对象

  • 掌握步骤后,发送任何形式的邮件,都可套用步骤,只需修改正文内容,也就是构建不同的邮件对象

【MIMEText--发送文本类型的邮件】
  • 语法:MIMEText(文字内容,文本类型,编码方式)

    • 文字内容:普通文本就是’文字内容‘,超链接文本三对双引号包裹起来的html语言,二进制文本则为路径

    • 文本类型:普通文本(plain),超文本(html),二进制文本--附件为txt,html,xlsx等(base64)

  • 连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号

    • 服务器地址:'smtp.qq.com' ,qq可替换为其他使用邮箱,如:'smtp.163.com'等 端口号:465/25,用于区分服务器下的不同服务 使用with...as可避免忘记关闭链接对象

  • 发送文本类型为普通文本的内容

  • # 第一步 :导包import smtplib​# 发文本类型的文件所用到的模块from email.mime.text import MIMEText# 创建邮件对象(真正被发送的对象)所需要的模块from email.mime.multipart import MIMEMultipart# 定义邮件主题所用到的模块from email.header import Header​​def send_email(from_email, pass_code, to_email, title, email_body):'''第二步 :定义发送邮件的方法:param from_email: 发件人邮箱:param pass_code: 发件人邮箱的授权码(163邮箱是密码):param to_email: 收件人邮箱:param title: 邮件标题:param email_body: 邮件正文:return: 无'''# 第三步 :创建邮件对象msg = MIMEMultipart()# 第四步 : 构建邮件头部显示样式#       设置邮件主题---语法:Header(主题/标题,编码格式)#       设置主题后,对其进行二进制编码subject = Header(title, 'utf-8').encode()msg['Subject'] = subject# 设置邮件发件人msg['From'] = from_email# 设置收件人msg['To'] = to_email# 第五步 : 设置邮件主体内容---文本类型#   语法:MIMEText(文字内容,文本类型,编码方式)#   文本类型:普通文本(plain),超文本(html),二进制文本(附件为文本文件.txt等 base64)body = MIMEText(email_body, 'plain', 'utf-8')# 将主体添加到邮件中msg.attach(body)​# 第六步 : 连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号#       服务器地址 :'smtp.qq.com' qq可替换为其他使用邮箱,如:'smtp.163.com'等#       端口号 :465/25,用于区分服务器下的不同服务# 使用with...as可避免忘记关闭连接对象with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:# 第七步 : 登录smtp.login(from_email, pass_code)# 发送邮件smtp.send_message(msg)if __name__ == '__main__':send_email('发件人邮箱','发件人邮箱授权码','收件人邮箱','主题','正文')

  • 发送文本类型为超链接的内容

  • # 发送文本类型为超链接的文本import smtplib​from email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart​def send_email(from_email, pass_code, to_email, title, email_body):'''第一步:定义发送邮件的方法:param from_email: 发件人邮箱:param pass_code: 发件人邮箱的授权码(163邮箱就是密码):param to_email: 收件人邮箱:param title: 邮件标题:param email_body: 邮件正文:return: 无'''msg = MIMEMultipart()​subject = Header(title, 'utf-8').encode()msg['Subject'] = subjectmsg['From'] = from_emailmsg['To'] = to_email​body = MIMEText(email_body, 'html', 'utf-8')msg.attach(body)​with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:smtp.login(from_email, pass_code)smtp.sendmail(from_email, to_email, msg.as_string())​​if __name__ == '__main__':send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件', """<img src="https://www.baidu.com/img/flexible/logo/pc/result.png"><a href="https://www.baidu.com/">点我去百度</a>""")

  • 效果如下图:

  • 发送文本类型为二进制的内容,以.html为例

  • 设置附件名称时,后缀要与源文件保持一致

  •  import smtplib​from email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart​​def send_email(from_email, pass_code, to_email, title, email_body):'''第一步:定义发送邮件的方法:param from_email: 发件人邮箱:param pass_code: 发件人邮箱的授权码(163邮箱就是密码):param to_email: 收件人邮箱:param title: 邮件标题:param email_body: 邮件正文:return: 无'''msg = MIMEMultipart()​subject = Header(title, 'utf-8').encode()msg['Subject'] = subjectmsg['From'] = from_emailmsg['To'] = to_emailfile_content = open(email_body, 'rb').read()body = MIMEText(file_content, 'base64', 'utf-8')# 设置附件名称---附件名称须为英文,中文会乱码body['Content-Disposition'] = 'attachment; filename="test.html"'msg.attach(body)​with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:smtp.login(from_email, pass_code)smtp.sendmail(from_email, to_email, msg.as_string())​​if __name__ == '__main__':send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件',r'路径\test.html')

【MIMEImage-发送附件为图片的邮件】
  • 与发送文本的流程、步骤均一致,构建邮件对象发生了变化

  • 获取图片内容,创建邮件图片对象---MIMEImage(),传参图片的二进制数据,通过open('path',mode='rb')获取图片二进制

  • 设置附件名称---除了文件名称外,其余都是固定名称,附件名称须为英文

  • 图片路径可加r转义符

  • 效果如下图:

  • import smtplib​from email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart​def send_email(from_email, pass_code, to_email, title, email_body):'''第一步:定义发送邮件的方法:param from_email: 发件人邮箱:param pass_code: 发件人邮箱的授权码(163邮箱就是密码):param to_email: 收件人邮箱:param title: 邮件标题:param email_body: 邮件正文:return: 无'''msg = MIMEMultipart()​subject = Header(title, 'utf-8').encode()msg['Subject'] = subjectmsg['From'] = from_emailmsg['To'] = to_email​body = MIMEImage(open(email_body, mode='rb').read())# 设置附件名称---附件名称须为英文,中文会乱码body['Content-Disposition'] = 'attachment; filename="englishName.png"'msg.attach(body)​with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:smtp.login(from_email, pass_code)smtp.sendmail(from_email, to_email, msg.as_string())​​if __name__ == '__main__':send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件',  r'路径\01.png')

【MIMEBase--发送附件为html报告的邮件】
  • 近似MIMEText的'base64'

  • 可发送.html/.xlsx/.doc等

  • body = MIMEBase('application', 'octet-stream')

  • import smtplib​from email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBase# 用于编码from email import encoders# 定义邮件主题from email.header import Header​def send_email(from_email, pass_code, to_email, title, email_body):'''定义发送邮件的方法:param from_email: 发件人邮箱:param pass_code: 发件人邮箱的授权码(163邮箱就是密码):param to_email: 收件人邮箱:param title: 邮件标题:param email_body: 邮件正文:return: 无'''msg = MIMEMultipart()subject = Header(title, 'utf-8').encode()msg['Subject'] = subjectmsg['From'] = from_emailmsg['To'] = to_email​body = MIMEBase('application', 'octet-stream')body.set_payload(open(email_body, mode='rb').read())encoders.encode_base64(body)# 附件名称须为英文body['Content-Disposition'] = 'attachment; filename="test.html"'# 将主体添加到邮件中msg.attach(body)​with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:smtp.login(from_email, pass_code)smtp.sendmail(from_email, to_email, msg.as_string())​​if __name__ == '__main__':send_email('发件人@qq.com', '发件人授权码', '收件人@qq.com', '发送html文件附件邮件', r'路径\test.html')

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

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

相关文章

【Redis】复制(Replica)

文章目录 一、复制是什么&#xff1f;二、 基本命令三、 配置&#xff08;分为配置文件和命令配置&#xff09;3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么&#xff1f; 主从复制 master&#xff…

GloVe: Global Vectors for Word Representation论文笔记解读

基本信息 作者Jeffrey Penningtondoi10.3115/v1/D14-1162发表时间2014期刊EMNLP网址https://aclanthology.org/D14-1162.pdf 研究背景 1. What’s known 既往研究已证实 全局矩阵分解方法&#xff1a;LSA&#xff0c;考虑整个语料库词频的统计信息得到共现矩阵&#xff0c;通…

根据视图矩阵, 恢复相机的世界空间的位置

根据视图矩阵, 恢复相机的世界空间的位置 一、方法1 glsl 实现: // 从本地局部坐标系(相机空间) 到 世界空间的旋转变换 mat3 getLocal2WorldRotation() {mat3 world2localRotation mat3(viewMatrix[0].xyz,viewMatrix[1].xyz,viewMatrix[2].xyz);return inverse(world2loca…

汽车零配件行业看板管理系统应用

生产制造已经走向了精益生产&#xff0c;计算时效产出、物料周转时间等问题&#xff0c;成为每一个制造企业要面临的问题&#xff0c;工厂更需要加快自动化&#xff0c;信息化&#xff0c;数字化的布局和应用。 之前的文章多次讲解了企业MES管理系统&#xff0c;本篇文章就为大…

论文er们,YOLO这口饭得趁热吃

不知道各位有没有看出来&#xff0c;从去年开始YOLO相关的论文就处于一个井喷式状态&#xff0c;SCI各区都能见到它的身影。 这是因为YOLO其实是个很好发论文的方向&#xff0c;需求量很大&#xff0c;热度高&#xff0c;并且好入门&#xff0c;能获取的资源也很多。写论文时一…

宾馆酒店电视信号高清改造-广电信号接入数字电视同轴高清传输系统应用

宾馆酒店电视信号高清改造-广电信号接入数字电视同轴高清传输系统应用 由北京海特伟业科技有限公司任洪卓发布于2024年7月12日 一、宾馆酒店广电信号接入数字电视同轴高清传输系统建设背景 在当今数字化快速发展的时代&#xff0c;宾馆酒店作为服务行业的重要组成部分&#x…

idea修改全局配置、idea中用aliyun的脚手架,解决配置文件中文乱码

idea修改全局配置 idea中用aliyun的脚手架&#xff0c;创建springBoot项目 解决配置文件中文乱码

解决fidder小黑怪倒出JMeter文件缺失域名、请求头

解决fidder小黑怪倒出JMeter文件缺失域名、请求头 1、目录结构&#xff1a; 2、代码 coding:utf-8 Software:PyCharm Time:2024/7/10 14:02 Author:Dr.zxyimport zipfile import os import xml.etree.ElementTree as ET import re#定义信息头 headers_to_extract [Host, Conn…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录&#xff1a; 一.Linux权限维持&#xff1a; 1.webshell&#xff1a; 2.定时任务&#xff1a; 3.SUID后门&#xff1a; 4.SSH Key免密登录后门&#xff1a; 5.添加用户后门&#xff1a; 二.Windows权限维持 1.计划任务后门&…

在 Java 中:为什么不能在 static 环境中访问非 static 变量?

在 Java 中&#xff1a;为什么不能在 static 环境中访问非 static 变量&#xff1f; 1、静态&#xff08;static&#xff09;变量2、非静态&#xff08;非static&#xff09;变量3、为什么不能访问&#xff1f;4、如何访问&#xff1f;5、总结 &#x1f496;The Begin&#x1f…

2024年用于在 Python 中构建 API 的 8 个开源框架

什么是API&#xff1f; API是一个软件解决方案&#xff0c;作为中介&#xff0c;使两个应用程序能够相互交互。以下一些特征让API变得更加有用和有价值&#xff1a; 遵守REST和HTTP等易于访问、广泛理解和开发人员友好的标准。API不仅仅是几行代码&#xff1b;这些是为移动开…

安装WindowsTerminal并设置默认以管理员身份运行启动终端

安装WindowsTerminal并设置默认以管理员身份运行启动终端 背景&#xff1a;Microsoft Store打不开&#xff0c;且WindowsTerminal没有默认以管理员身份运行。 下载msixbundle类型的安装包&#xff1a;https://github.com/microsoft/terminal/releases 使用管理员运行Windows …

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述 RK3308H 使用8路个模拟麦克风录音&#xff0c;2路用es7243e做回采 解决方案&#xff1a; 首先先调8路模拟麦克风&#xff0c;根据原理图确定使用的是哪路I2S。 以下为dts配置&#xff0c;acodec的属性注释附上。 &acodec {status "okay";rockchip,m…

springBoot(若依)集成camunda

1、下图为项目结构 2、最外层 pom引入依赖 <properties><!--camunda 标明版本&#xff0c;注意要个自己的Spring 版本匹配&#xff0c;匹配关系自行查询官网--><camunda.version>7.18.0</camunda.version> </properties> 3、common模块引入依赖 …

Python 开发植物大战僵尸杂交版辅助【全网最详细_查找 + 代码编写一体化零基础也能学会】

目录 辅助最终展示效果 一、文章介绍 二、工具介绍 三、基址搜索 3.1、寻找阳光基址 3.2、寻找卡槽冷却基址 3.3、寻找僵尸刷新时间基址 3.4、寻找大阳光刷新时间基址 3.5、寻找植物编号基址 3.6、寻找场上僵尸数量基址 3.7、寻找僵尸 X 坐标基址 3.8、通过找到的僵…

《昇思25天学习打卡营第1天|QuickStart》

说在前面 曾经接触过华为的910B服务级显卡&#xff0c;当时基于910B做了一些开发的工作&#xff0c;但是总感觉做的事情太低层&#xff0c;想要能自顶向下的了解下&#xff0c;因此开始了MindSpore的学习。另外也想给予提供的显卡&#xff0c;简单尝试下llm模型的训练&#xf…

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

SpringBootWeb 篇-入门了解 Swagger 的具体使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Swagger 介绍 1.1 Swagger 和 Yapi 的使用场景 2.0 Swagger 的使用方式 2.1 导入 knife4j 的 maven 坐标 2.2 在配置类中加入 knife4j 相关配置 2.3 设置静态资源…

oracle控制文件详解以及新增控制文件

文章目录 oracle控制文件1、 控制文件包含的主要信息如下&#xff1a;2、查看目前系统的控制文件信息&#xff0c;主要是查看相关的字典视图 oracle新增控制文件 oracle控制文件 控制文件是一个很小的二进制文件(10MB左右)&#xff0c;含有数据库结构信息&#xff0c;包括数据…

Open3D 点云Kmeans聚类算法

目录 一、概述 1.1算法介绍 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2聚类后点云 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 1.1算法介绍 聚类是一种将数据集分组的方…