今天我们来聊一聊如何使用python实现邮件的发送功能.
邮件发送原理
邮件发送是互联网中最基础的通信方式之一。在技术层面,邮件发送主要依赖SMTP(简单邮件传输协议)来实现。当我们发送一封邮件时,实际上是通过SMTP客户端连接到SMTP服务器,然后将邮件内容传输给服务器,由服务器负责将邮件投递到收件人的邮箱。 在Python中实现邮件发送,主要涉及以下几个步骤:
- 创建SMTP客户端连接
- 进行身份认证
- 构建邮件内容
- 发送邮件
- 关闭连接 下面是邮件发送的流程图:
接下来,让我们详细了解如何使用Python来实现这一功能。
获取邮箱授权码和服务器地址
以163邮箱为例(其它邮箱逻辑类似),首先我们需要确保邮箱开启了POP3/SMTP服务和IMAP/SMTP服务。这些服务是邮箱对外提供的标准邮件收发接口,使得第三方应用程序可以连接到邮箱服务器。 请按照以下步骤操作:
- 进入并登录163邮箱网页版
- 按下图所示操作依次点击,开启POP3/SMTP服务和IMAP/SMTP服务:
- 向下滑动页面,找到授权密码管理,点击新增授权密码获取自己的授权码。
注意:授权码只会显示一次,请妥善保存,无法重复查看。同时记住邮箱的SMTP服务器地址(对于163邮箱是smtp.163.com)。
python代码实现邮件发送
- 导入邮件发送所需库
首先,我们需要导入Python中处理邮件发送的核心库:
python
import smtplib # 提供了SMTP客户端会话对象,用于向SMTP服务器发送邮件
from email.mime.text import MIMEText # 用于创建文本类型的邮件内容
from email.header import Header # 用于设置邮件头信息,支持非ASCII字符的编码
- 配置邮件服务器信息
接下来,我们需要配置与邮件服务器连接所需的基本信息:
python
# 邮件服务器配置
smtp_server = "smtp.example.com" # SMTP服务器地址,例如:smtp.gmail.com,smtp.163.com等
port = 25 # SMTP服务器端口,标准端口25,SSL端口465,TLS端口587
sender = "sender@example.com" # 发件人邮箱地址
password = "your_password" # 发件人邮箱密码或授权码(很多邮箱服务商需要使用专门的授权码而非登录密码)
receivers = ["receiver@example.com"] # 收件人邮箱列表,可以包含多个收件人
- 创建邮件内容
构建邮件内容是发送邮件的核心部分,包括正文、发件人、收件人和主题等信息:
python
# 创建邮件内容
# 第一个参数:邮件正文内容
# 第二个参数:内容类型,'plain'表示纯文本,'html'表示HTML格式
# 第三个参数:内容编码方式
message = MIMEText('这是Python发送的邮件测试内容', 'plain', 'utf-8')
# Header参数解释:第一个参数是内容,第二个参数是编码方式(可选)
message['From'] = Header(sender) # 设置发件人信息
message['To'] = Header(','.join(receivers)) # 设置收件人信息,多个收件人用逗号分隔
message['Subject'] = Header('Python邮件测试', 'utf-8') # 设置邮件主题
- 连接SMTP服务器并发送邮件
完成邮件内容的构建后,我们需要连接到SMTP服务器并发送邮件:
python
# 连接到SMTP服务器
smtp_obj = smtplib.SMTP(smtp_server, port) # 第一个是服务器地址,第二个是端口号
# 登录SMTP服务器
smtp_obj.login(sender, password)
# 发送邮件
smtp_obj.sendmail(sender, receivers, message.as_string())
# 关闭SMTP连接
# quit()方法用于结束SMTP会话并关闭连接
smtp_obj.quit()
- 异常处理
邮件发送过程中可能会遇到各种问题,因此加入异常处理非常重要:
python
try:
# 连接到SMTP服务器
smtp_obj = smtplib.SMTP(smtp_server, port)
# 登录SMTP服务器
smtp_obj.login(sender, password)
# 发送邮件
# as_string()方法将MIMEText对象转换为字符串,包含所有头信息和内容
smtp_obj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
# 关闭连接
smtp_obj.quit()
except smtplib.SMTPException as e:
# 捕获SMTP异常,常见的有:
# SMTPAuthenticationError:认证失败
# SMTPConnectError:连接失败
# SMTPServerDisconnected:服务器断开连接
# SMTPSenderRefused:发件人被拒绝
# SMTPRecipientsRefused:收件人被拒绝
print(f"邮件发送失败: {e}")
运行代码测试
执行上述代码后,如果一切正常,控制台将输出成功信息: 同时,收件人邮箱将收到一封标题为Python邮件测试 的邮件,表明我们的邮件发送功能已成功实现:
完整Python代码
python
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件服务器配置
smtp_server = "smtp.example.com" # SMTP服务器地址
sender = "sender@example.com" # 发件人邮箱
password = "your_password" # 发件人邮箱密码或授权码
receivers = ["receiver@example.com"] # 收件人邮箱列表
port = 25 # SMTP服务器端口
# 创建邮件内容
message = MIMEText('这是Python发送的邮件测试内容', 'plain', 'utf-8') # 邮件的内容,其中第一个参数为邮件的内容,第二个参数为邮件的类型,第三个参数为邮件的编码
message['From'] = Header(sender) # 邮件的发件人
message['To'] = Header(','.join(receivers)) # 邮件的收件人
message['Subject'] = Header('Python邮件测试', 'utf-8') # 邮件的主题
# 连接到SMTP服务器
smtpObj = smtplib.SMTP()
smtpObj.connect(smtp_server, port)
smtpObj.login(sender, password)
smtpObj.sendmail(sender, receivers, message.as_string())
smtpObj.quit()
try:
# 连接到SMTP服务器
smtp_obj = smtplib.SMTP(smtp_server, port)
# 登录
smtp_obj.login(sender, password)
# 发送邮件
smtp_obj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
# 关闭连接
smtp_obj.quit()
except smtplib.SMTPException as e:
print(f"邮件发送失败: {e}")
进阶功能扩展
完成基本的邮件发送功能后,我们还可以探索更多高级功能:
- 发送HTML格式邮件:将MIMEText的第二个参数改为'html'
- 添加附件:使用email.mime.multipart和email.mime.application模块
python
# 导入模块
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
#其余代码相同
# 添加附件
with open('文件路径/文件名.pdf', 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename='文件名.pdf')
message.attach(attachment)
#其余代码相同
- 群发邮件:扩展receivers列表
python
receivers = ["receiver@example.com","receiver@example.com","receiver1@example.com","receiver2@example.com",......] # 收件人邮箱列表,可以包含多个收件人
# 这里我们还可以实现将群发的联系人邮箱从文件中读取等一系列diy的骚操作😂
- 邮件加密:使用SSL/TLS加密传输,提高安全性
Tip: 只需要在代码中添加下面一行即可
smtp_obj.starttls() # 启用TLS加密
通过Python的强大功能,您可以轻松实现各种复杂的邮件发送需求,甚至可以将其集成到自动化脚本、定时任务或Web应用程序中。