一文搞懂python实现邮件发送的全流程

今天我们来聊一聊如何使用python实现邮件的发送功能.

邮件发送原理

邮件发送是互联网中最基础的通信方式之一。在技术层面,邮件发送主要依赖SMTP(简单邮件传输协议)来实现。当我们发送一封邮件时,实际上是通过SMTP客户端连接到SMTP服务器,然后将邮件内容传输给服务器,由服务器负责将邮件投递到收件人的邮箱。 在Python中实现邮件发送,主要涉及以下几个步骤:

  1. 创建SMTP客户端连接
  2. 进行身份认证
  3. 构建邮件内容
  4. 发送邮件
  5. 关闭连接 下面是邮件发送的流程图:

接下来,让我们详细了解如何使用Python来实现这一功能。

获取邮箱授权码和服务器地址

以163邮箱为例(其它邮箱逻辑类似),首先我们需要确保邮箱开启了POP3/SMTP服务和IMAP/SMTP服务。这些服务是邮箱对外提供的标准邮件收发接口,使得第三方应用程序可以连接到邮箱服务器。 请按照以下步骤操作:

  1. 进入并登录163邮箱网页版
  2. 按下图所示操作依次点击,开启POP3/SMTP服务和IMAP/SMTP服务:
  3. 向下滑动页面,找到授权密码管理,点击新增授权密码获取自己的授权码。

注意:授权码只会显示一次,请妥善保存,无法重复查看。同时记住邮箱的SMTP服务器地址(对于163邮箱是smtp.163.com)。

python代码实现邮件发送

  1. 导入邮件发送所需库

首先,我们需要导入Python中处理邮件发送的核心库:

python 复制代码
import smtplib  # 提供了SMTP客户端会话对象,用于向SMTP服务器发送邮件
from email.mime.text import MIMEText  # 用于创建文本类型的邮件内容
from email.header import Header  # 用于设置邮件头信息,支持非ASCII字符的编码
  1. 配置邮件服务器信息

接下来,我们需要配置与邮件服务器连接所需的基本信息:

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"]  # 收件人邮箱列表,可以包含多个收件人
  1. 创建邮件内容

构建邮件内容是发送邮件的核心部分,包括正文、发件人、收件人和主题等信息:

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')  # 设置邮件主题
  1. 连接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()
  1. 异常处理

邮件发送过程中可能会遇到各种问题,因此加入异常处理非常重要:

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应用程序中。

相关推荐
清水白石0082 分钟前
《深入 super() 的世界:MRO 与 C3 线性化算法的全景解析与实战指南》
python
大厂技术总监下海3 分钟前
Python 开发者的“新引擎”:Rust 编写的解释器,性能与安全兼得
python·开源
Swizard34 分钟前
别再硬编码配置了!5分钟带你用 PyYAML 让 Python 项目“活”起来
python
love530love1 小时前
Windows 下 Z-Image-Turbo 专业版 Gradio 生成器实战:功能增强全记录
人工智能·windows·python·大模型·gradio·博客之星·z-image
人工干智能1 小时前
Chat Completions API中的三种role:“system“,“user“,“assistant“
python·llm
Darenm1111 小时前
JWT鉴权的实现:从原理到 Django + Vue3
后端·python·django
Funny_AI_LAB1 小时前
Zcode:智谱AI推出的轻量级 AI IDE 编程利器
人工智能·python·算法·编辑器
2501_944452232 小时前
活动记录 Cordova 与 OpenHarmony 混合开发实战
python
子夜江寒2 小时前
基于 Python 使用 SVM、K-means与DBSCAN
python·支持向量机·kmeans
Blossom.1182 小时前
GPTQ量化实战:从零手写大模型权重量化与反量化引擎
人工智能·python·算法·chatgpt·ai作画·自动化·transformer