在本文中,我将介绍如何使用Python通过QQ邮箱发送电子邮件。我们将使用smtplib
和email
库来实现这一目标。这篇文章将包含以下步骤:
- 设置QQ邮箱的SMTP服务
- 编写Python代码发送电子邮件
一、设置QQ邮箱的SMTP服务
在使用QQ邮箱发送电子邮件之前,我们需要先开启QQ邮箱的SMTP服务并获取授权码。具体步骤如下:
1、登录QQ邮箱
打开QQ邮箱并登录。
2、进入设置
点击右上角的“设置”齿轮图标,然后选择“账户”。
3、开启SMTP服务
在“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”下,开启“SMTP服务”。
4、获取授权码
开启SMTP服务后,系统会提示您生成一个授权码。记住这个授权码,它将用作密码在Python代码中使用。
二、库简介
在开始编写代码之前,我们先简单介绍一下将要使用的两个Python标准库:smtplib
和email
。
1、smtplib库
smtplib
是Python的一个内置库,用于发送电子邮件。它实现了简单邮件传输协议(SMTP),允许用户通过Python程序与邮件服务器进行通信并发送邮件。
主要功能包括:
- 连接到SMTP服务器
- 登录邮箱账户
- 发送邮件
2、email库
email
库是Python的一个内置库,用于构建和解析电子邮件消息。它提供了创建邮件内容和头字段的各种工具和类。
主要功能包括:
- 创建邮件内容(文本、HTML、附件等)
- 设置邮件头字段(如
From
、To
、Subject
) - 解析电子邮件消息
三、编写Python代码发送电子邮件
1、导入所需库
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
2、连接邮箱服务器
使用smtplib模块的SMTP_SSL类创建一个实例,并为这个实例传入两个参数。
第一个参数是服务器地址。简单来说,我们需要使用该地址帮我们代收发邮件。该地址以字符串形式传入。
第二个参数是端口号,每个服务器有多个端口,只有通过对应的端口,程序才能访问到该服务器。QQ邮箱的SMTP的端口号是465或者587。
smtpobj = smtplib.SMTP_SSL('smtp.qq.com')
smtpobj.connect(smtp_server, 465)
3、登陆邮箱
接下来,我们定义用户名、密码两个变量,用户和密码使用自己的QQ邮箱和第一步得到的授权码,就可以通过login()
方法,来登陆自己的邮箱。
from_addr = 'xxx'
password = 'xxx'
smtpobj.login(from_addr, password)
4、编辑收发件人
登录邮箱后,我们通常要先设置好邮件的主题、发件人和收件人等信息。要构建以上信息,还需要用到另外一个内置模块email。email模块主要负责构造邮件页面的布局,比如发件人,收件人,主题,正文,附件等。
email模块的类MIMEMultipart,可以整合邮件头、正文和附件等信息。所以,当我们要发送带附件的组合型邮件时,需要从email.mime.multipart中导入MIMEMultipart类。
email模块的类Header,用于设置邮件头,即邮件的主题,收发件人。所以,当我们要设置邮件的主题,收发件人时,就需要从email.header中导入Header类。
msg = MIMEMultipart()
msg['From'] = '"John Doe" <xxx>' # 发送者
msg['To'] = Header('到点就困告') # 接收者
subject = 'steam今日促销'
msg['Subject'] = Header(subject, 'utf-8') # 邮件主题
5、构建正文
使用MIMEText类创建一个实例对象,为这个实例传入三个参数。
第一个参数是文本内容,即我们需要发送邮件的正文内容。
第二个参数是文本格式,表示我们的正文内容以何种格式展示。"html"表示网页链接的格式。
第三个参数是编码。示例中的"utf-8"编码,能防止中文乱码。
html_msg = """
<p>Steam 今日游戏促销...</p>
<p><a href="https://store.steampowered.com/specials/">这是一个链接</a></p>
"""
# 邮件正文内容
msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
6、发送邮件
最后,调用对象qqMail的sendmail()
方法来发送邮件,需要传入发件人、收件人、邮件内容,邮件内容需要为字符串类型,所以在示例中,使用as_string()
方法将对象message变为字符串类型。
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
总结
完整代码:
# smtplib 用于邮件的发信动作
import smtplib
# email 用于构建邮件内容
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 构建邮件头
from email.header import Header
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxx'
password = 'xxx'
# 收信方邮箱
to_addr = 'xxx'
# 发信服务器
smtp_server = 'smtp.qq.com'
html_msg = """
<p>Steam 今日游戏促销...</p>
<p><a href="https://store.steampowered.com/specials/">这是一个链接</a></p>
"""
# 创建一个实例msg
msg = MIMEMultipart()
msg['From'] = '"John Doe" <xxx>' # 发送者
msg['To'] = Header('到点就困告') # 接收者
subject = 'steam今日促销'
msg['Subject'] = Header(subject, 'utf-8') # 邮件主题
# 邮件正文内容
msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
try:
smtpobj = smtplib.SMTP_SSL(smtp_server)
smtpobj.connect(smtp_server, 465) # 建立连接--qq邮箱服务和端口号
smtpobj.login(from_addr, password) # 登录--发送者账号和口令
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("无法发送邮件:", e)
finally:
# 关闭服务器
smtpobj.quit()
效果如下: