利用Python实现邮件发送

邮件的规则,由它来控制信件的中转⽅方式。python的smtplib提供了了⼀一种很⽅方便便的途径发
首页 新闻资讯 行业资讯 利用Python实现邮件发送

06660a877d727f80a8f4063d3fcb0a43a5858b.jpg

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是⼀一组⽤用于由源地址到⽬目的地址传送

邮件的规则,由它来控制信件的中转⽅方式。python的smtplib提供了了⼀一种很⽅方便便的途径发送电⼦子邮件。它对smtp协议进⾏行行了了简单的封装。

一. 准备用来发送邮件的邮箱账号

准备好邮箱账号和邮箱登录授权码。不同类型邮箱获取授权码的方式大同小异,这儿以QQ邮箱为例演示获取授权码步骤:

第一步:用网页登录QQ邮箱,找到帮助中心

15c7fe616a7d8d28b8c209a1a35249572e1650.jpg

第二步:在帮助中心中选择"客户端设置"中的第2个问题:

8457f3b70e969a60fe3257fb58cd6a3a5d21e3.jpg

然后按照对应的要求操作,得到授权码并且保存。

二. 发送邮件的基本步骤

代码发送邮件的步骤,和人工发送邮件步骤基本一致:登录邮箱  -> 准备邮件内容   ->  发送邮件。

2.1 登录邮箱

复制

import smtplib1. 连接邮箱服务器连接对象 = smtplib.SMTP_SSL(服务器地址, 邮箱服务端口)- 服务器地址:smtp.163.com(163邮箱)、smtp.qq.com(qq邮箱) - 邮箱服务端口:465或者252. 登录邮箱 连接对象.login(邮箱账号, 授权码)
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

2.2 准备数据

数据指的需要发送的内容。邮件内容的构建需要涉及到另外一个库email,它可以⽤来构建邮件主题以及各种形式的邮件内容(包括文字内容、图片内容、html内容、附件)等,这⼉先简单说一下邮件主题和⽂本内容,其他形式的内容在后⾯面邮件内容部分详细讲解。

复制

from email.mime.multipart import MIMEMultipart  from email.mime.text import MIMETextfrom email.header import Header1. 创建邮件对象邮件对象 = MIMEMultipart()2. 设置邮件主题主题对象 = Header(邮件标题, 编码方式).encode()  
邮件对象['Subject'] = 主题对象3.设置邮件发送者邮件对象['From'] = '用户名 <用户名>'4.设置邮件接受者邮件对象['To'] = '收件⼈1;收件⼈2;收件人3...'5. 添加文字内容文字内容对象 = MIMEText(内容, 类型, 编码方式)  
- 内容:就是文字字符串- 类型:plain(简单的⽂字内容)、html(超文本) 邮件对象.attach(文字对象)
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

2.3 发送邮件


三.各种类型邮件发送实例

复制

连接对象.sendmail(发件⼈, 收件人, 邮件对象.as_string())  
连接对象.quit()
  • 1.

  • 2.

3.1普通文字内容邮件

这类邮件的邮件正文只有普通文字信息,没有超文本也没有图片,并且没有附件:

复制

import smtplibfrom email.mime.multipart import MIMEMultipart  from email.mime.text import MIMETextfrom email.header import Header# 1. 连接邮箱服务器con = smtplib.SMTP_SSL('smtp.163.com', 465)# 2. 登录邮箱  con.login('XXXX@163.com', 'XXXXX')# 2. 准备数据# 创建邮件对象msg = MIMEMultipart()# 设置邮件主题subject = Header('找回密码', 'utf-8').encode() msg['Subject'] = subject# 设置邮件发送者msg['From'] = 'XXXX@163.com <XXXX@163.com>'# 设置邮件接受者msg['To'] = '726550822@qq.com'# 添加⽂文字内容text = MIMEText('忘记密码需要找回密码', 'plain', 'utf-8')  
msg.attach(text)# 3.发送邮件con.sendmail('xxxx@163.com', '726550822@qq.com', msg.as_string())  
con.quit()
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

c3fa37d75a01297705864842b0e72f3015a806.jpg

3.2 超文本文件内容

正文更加丰富和有趣的一种邮件,生活中我们接收到的来自各大平台发送的邮件都是这类邮件,核心代码格式如下:

复制

from email.mime.text import MIMETexthtml⽂本对象 = MIMEText(html内容字符串, 'html', 编码方式) 邮件对象.attach(html⽂本对象)
  • 1.

  • 2.

具体代码:

复制

import smtplibfrom email.mime.multipart import MIMEMultipart  from email.mime.text import MIMETextfrom email.header import Headercon = smtplib.SMTP_SSL('smtp.163.com', 465)con.login('xxxx@163.com', 'xxxxxx')msg = MIMEMultipart()subject = Header('找回密码', 'utf-8').encode()  
msg['Subject'] = subjectmsg['From'] = 'xxxx@163.com <xxxx@163.com>'msg['To'] = '726550822@qq.com'# 添加html内容content = """<h2>我是正⽂中的标题</h2><p>邮件正文描述性文字1</p><p>邮件正⽂描述性文字2</p><img src='https://www.baidu.com/img/bd_logo1.png'> <center>百度图片</center><a href='https://www.baidu.com'>百度⼀下</a>"""html = MIMEText(content, 'html', 'utf-8')  
msg.attach(html)# 发送邮件con.sendmail('xxxx@163.com', '726550822@qq.com', msg.as_string())  
con.quit()
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

32039423066143c7953402b7aa1cdd1b19d2b6.jpg

3.3 发送附件

邮件内容除了正文内容,有的时候还需要将各种文件以附件的形式单独发送,发送附件的核心代码如下:

复制

from email.mime.text import MIMEText⽂文件对象 = MIMEText(⽂件二进制数据, 'base64', 编码⽅式)  
文件对象["Content-Disposition"] = 'attachment; filename="⽂件名"'  邮件对象.attach(⽂件对象)
  • 1.

  • 2.

  • 3.

  • 4.

具体代码:

复制

import smtplibfrom email.mime.multipart import MIMEMultipart  from email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.header import Headerfrom email.mime.message import MIMEMessage from copy import deepcopycon = smtplib.SMTP_SSL('smtp.163.com', 465)con.login('xxxx@163.com', 'xxxxxx')msg = MIMEMultipart()subject = Header('⽂文件附件发送', 'utf-8').encode() msg['Subject'] = subjectmsg['From'] = 'xxxx@163.com <xxxx@163.com>'msg['To'] = '726550822@qq.com'# 添加⽂文件附件file1 = MIMEText(open('files/test.txt', 'rb').read(), 'base64', 'utf-8')  
file1["Content-Disposition"] = 'attachment; filename="test.txt"'  msg.attach(file1)file2 = MIMEText(open('files/pyecharts的使⽤用.pdf', 'rb').read(), 'base64', 'utf-8')file2["Content-Disposition"] = 'attachment; filename="test.pdf"'  msg.attach(file2)# 发送邮件con.sendmail('xxxx@163.com', '726550822@qq.com', msg.as_string())  
con.quit()
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

c2fd241481a837a9b327574117bcc7be9c9093.jpg

40    2022-09-02 15:08:02    Python 邮件发送