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

news2025/1/3 2:21:33

目录

自动化发送邮件

流程:

步骤:

【重点】

【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 Header
     from email.mime.text import MIMEText
     from 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'] = subject
         msg['From'] = from_email
         msg['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 Header
     from email.mime.text import MIMEText
     from 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'] = subject
         msg['From'] = from_email
         msg['To'] = to_email
         file_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 Header
     from email.mime.text import MIMEText
     from 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'] = subject
         msg['From'] = from_email
         msg['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 MIMEMultipart
     from 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'] = subject
         msg['From'] = from_email
         msg['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.coloradmin.cn/o/1922048.html

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

相关文章

【web]-信息收集-空白页面

打开是一张图 查看源码&#xff0c;发现就一个链接是有用信息&#xff0c;用目录扫描工具&#xff0c;没有发现有价值的信息。 F12&#xff0c;查看请求和相应信息&#xff0c;在响应头中发现了信息。 还有一个小技巧&#xff1a;点击手机图标&#xff0c;可以切换到手机模式中…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

计组_总线

2024.06.21&#xff1a;计算机组成原理总线学习笔记 第23节 总线 3.1 总线的基本概念&#xff08;联想数据通路&#xff09;3.2 总线的分类3.2.1 片内总线&#xff08;CPU芯片内部的总线&#xff09;3.2.2 系统总线3.2.3 通信总线&#xff08;跨系统&#xff0c;408一般不考&am…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

十、(正点原子)Linux阻塞和非阻塞IO

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式&#xff0c;在编写驱动的时候一定要考虑到阻塞和非阻塞。这里的“IO”并不是我们学习 STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的 IO 指的是 Input/Output&#xff0c;也就是输入/输出&…

matlab支持向量机使用错误

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

使用Qt和mitmproxy开发一个抓取网页短视频的万能工具

目录 实现原理 mitmproxy介绍 功能简介 安装 脚本示例 如何使用 解释 注意事项 QT工具实现 其他资源 实现原理 使用WebView组件造一工具,工具可输入网页地址并显示网页内容及播放视频。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监…

MySql性能调优03-[SQL优化]

SQL优化 MySQL优化SQL优化-不要写select *SQL优化-小表驱动大表&#xff0c;而不是大表驱动小表SQL优化-连接查询代替子查询SQL优化-提升group by的效率 MySQL优化 trace工具 set session optimizer_traceenabledon,end_markers_in_json on; -- 开启trace select * From emplo…

指针详解(2)

指针详解(2) 对数组名的理解 在C语言里数组名还表示着数组首元素地址。 int arr[5] {1, 2, 3, 4, 5}; int* p &arr[0]; int* p arr;以上这两种&#xff0c;对指针p进行赋值的操作均是等价的&#xff0c;都将数组首元素的地址赋给指针p。 不妨&#xff0c;我们可以测…

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…

SpringBoot新手快速入门系列教程六:基于MyBatis的一个简单Mysql读写例子

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 MyBatis和JPA是两种不同的Java持久层框架&#xff0c;各有其优缺点。以下是它们的比较&#xff1a; MyBatis 优点 灵活性高&#xff1a;MyBatis允许手动编写SQL查询&#xf…

AWDAWFAAFAWAWFAWF

创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09; 创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称 创建视图v_dept_emp_count(dept…

Ubuntu: gitee免密

安装git sudo apt-get install git下载 git clone XXX SSH keys 第一步&#xff1a;检查本地是否有 SSH Key存在 ls -al ~/.ssh第二步&#xff1a;配置你注册的邮箱 ssh-keygen -t rsa -C "your_emailexample.com"输入命令后一直回车 第三步&#xff1a;获取公钥…

乐观锁原理

乐观锁是一种并发控制的方法&#xff0c;主要用于多线程环境下&#xff0c;用于保证数据的一致性。其核心思想是&#xff1a;"在多个事务中乐观地读取数据&#xff0c;在提交时再验证是否有冲突&#xff0c;如果没有&#xff0c;则提交&#xff1b;如果有&#xff0c;则回…

使用 Apache DolphinScheduler 构建和部署大数据平台,将任务提交至 AWS 的实践经验

作者介绍 李庆旺 - 软件开发工程师&#xff0c;思科 引言 大家好&#xff0c;我是李庆旺&#xff0c;来自思科的软件开发工程师。我们的团队已经使用Apache DolphinScheduler搭建我们自己的大数据调度平台近三年时间。从最初的2.0.3版本开始至今&#xff0c;我们与社区一同成…

基于FPGA的数字信号处理(15)--定点数的舍入模式(6)向0取整fix

前言 在之前的文章介绍了定点数为什么需要舍入和几种常见的舍入模式。今天我们再来看看另外一种舍入模式&#xff1a;向上取整fix。 10进制数的fix fix&#xff1a;也叫 向0取整。它的舍入方式是数据往0的方向&#xff0c;舍入到最近的整数&#xff0c;比如1.75 fix到2&#xf…

【操作系统】进程管理——管程(个人笔记)

学习日期&#xff1a;2024.7.12 内容摘要&#xff1a;管程的定义和基本特征 管程 管程存在的意义&#xff1a;在上一章节中&#xff0c;我们学习了利用信号量机制解决进程同步互斥问题的方法&#xff0c;信号量机制编写程序较为复杂困难&#xff0c;易出错。为了让程序员写程…

MySQL查询语句(DQL)

文章目录 查询语句&#xff08;DQL)简单查询查一个字段查多个字段查所有字段查询字段可以进行数学运算查询时字段可起别名 条件查询and (&&)or (||)between...and...is null 和 is not nullin 和 not inlike (模糊查询) 查询语句&#xff08;DQL) 简单查询 \c可以清空…

JavaScript中的拷贝技术探秘:浅拷贝与深拷贝的奥秘

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 JavaScript中的浅拷贝和深拷贝是非常重要的概念&#xff0c;它们在处理对象和数组时具有不同的作用。在编程中&#xff0c;经常需要复制数据以便进行各种操作&#xff0c;但必须注…

【python】Python报错分析:深入探索`IndexError`及其解决办法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…