【进阶】利用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可避免忘记关闭链接对象
  • 发送文本类型为普通文本的内容

python 复制代码
# 第一步 :导包
 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('发件人邮箱','发件人邮箱授权码','收件人邮箱','主题','正文')
  • 发送文本类型为超链接的内容

python 复制代码
# 发送文本类型为超链接的文本
 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为例

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

python 复制代码
 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转义符

  • 效果如下图:

python 复制代码
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')

python 复制代码
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')
相关推荐
尘浮生6 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo6 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse12 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24920 分钟前
JDBC编程---Java
java·开发语言·sql
肥猪猪爸30 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
色空大师33 分钟前
23种设计模式
java·开发语言·设计模式
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热1 小时前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
LZXCyrus1 小时前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm