目录

一文搞懂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应用程序中。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
小杨4041 小时前
python入门系列十四(多进程)
人工智能·python·pycharm
用户277844910499316 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金18 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程55519 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
老歌老听老掉牙19 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀101519 小时前
Python入门(7):模块
python
无名之逆19 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20520 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙20 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
__lost21 小时前
Pysides6 Python3.10 Qt 画一个时钟
python·qt