Python实现邮件发送:从基础到HTML与附件的完整指南

小石头
小石头
发布时间:2026-10-13| 4人浏览过
原创

本文详解如何使用Python通过SMTP协议发送电子邮件。涵盖POP3、IMAP与SMTP概念,以163邮箱为例演示授权码配置。提供纯文本、HTML格式及图片内嵌、文件附件发送的完整代码示例,基于smtplib和email库实现稳定可靠的邮件自动化功能。

邮件协议基础:POP3、SMTP与IMAP解析

在深入代码之前,首先需要了解邮件传输中涉及的三个核心协议:POP3、SMTP和IMAP。

POP3全称为Post Office Protocol 3(邮局协议第三版),是互联网电子邮件离线访问的标准协议。它允许用户将邮件服务器上的邮件下载到本地计算机,并可选择在服务器端删除副本。POP3服务器负责接收来自用户的连接请求并处理邮件下载。

SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),属于TCP/IP协议簇。它定义了从源地址到目的地址传输邮件的规范,控制邮件的中转路径,确保每台计算机在发送或中转信件时能准确找到下一跳目的地。遵循该协议的服务器称为SMTP服务器,专门用于发送邮件。

SMTP认证是一种安全机制,要求用户在连接SMTP服务器时提供有效的账户名和密码,验证通过后方可执行邮件发送操作。

IMAP全称为Internet Mail Access Protocol(交互式邮件存取协议),是与POP3类似的在线邮件访问标准。与POP3不同,IMAP保持客户端与服务器端的同步:在客户端进行的删除、标记等操作会实时反馈至服务器,确保无论通过浏览器还是客户端访问,邮件状态和视图保持一致。

163邮箱配置与授权码获取

为了使用网易163邮箱发送邮件,必须先在邮箱设置中开启POP3、SMTP和IMAP服务。

具体操作路径为:设置 -> POP3/SMTP/IMAP -> 开启POP3/SMTP/IMAP。开启时系统会要求设置授权码,请务必妥善保存该授权码,后续代码登录时将使用此码代替原始密码。配置完成后,即可开始编写Python代码。

Python发送纯文本邮件实现

首先,导入实现邮件发送功能所需的Python库和模块。


import smtplib
import email
# MIME 多邮件扩充协议
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

接下来,配置邮箱服务器的域名、端口号、发送者邮箱地址、授权码以及接收者邮箱地址。


host = 'smtp.163.com' # 使用163邮箱
port = '465' # 163邮箱服务器的端口号
sender = 'xxxxxx@163.com' # 发送者的邮箱
password = 'xxxxxx' # 授权码
receiver = 'xxxxxx' # 接收者的邮箱,可以为其他类型的邮箱,如果是多个接收者请传入列表

随后,构建邮件的主体内容,包括定义邮件标题和正文文本。


​body = 'xxx' # 你要发送的邮件的内容
subject = 'xxx' # 你要发送的邮件的标题
 
# plain表示邮件内容的类型,文本类型默认是plain。utf-8表示内容的编码格式。
message = MIMEText(body, 'plain', 'utf-8')
message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题

获取SMTP协议的安全证书,使用授权码登录邮箱服务器并执行发送指令。


# 获取SMTP协议证书
email_clint = smtplib.SMTP_SSL(host, port)
# 登陆邮箱,这里也是用授权码登陆邮箱的
login_result = email_clint.login(sender, password)
# 发送邮件
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
# 关闭邮件发送客户端
email_client.close()

可以通过打印`login_result`来验证登录状态,若返回的状态码为235,则表明登录成功,邮件发送流程正常。

以下是发送纯文本邮件的完整Python代码实现。


import email
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
 
class SendEmail(object):
 def __init__(self):
 self.host = 'smtp.163.com'
 self.port = '465'
 self.sender = 'xxxxxx@163.com'
 self.password = 'xxxxxx'
 
 def send_email(self, receiver, subject='', body=''):
 message = MIMEText(body, 'plain', 'utf-8')
 message['From'] = self.sender
 message['To'] = receiver
 message['Subject'] = subject
 
 try:
  email_clint = smtplib.SMTP_SSL(self.host, self.port)
  print('获取证书成功')
  login_result = email_clint.login(self.sender, self.password)
  print('开始登陆')
  if login_result[0] == 235:
  print('登陆成功')
  email_clint.sendmail(self.sender, receiver, message.as_string())
  print('邮件发送成功')
  else:
  print('登陆失败')
 except Exception as e:
  print('发生错误', e)

HTML邮件与图片内嵌技巧

接下来介绍如何发送HTML格式的邮件,并向邮件内容中嵌入图片。

发送HTML邮件的关键在于将内容格式指定为html,示例如下。


message = MIMEText('<h2 style="color">学习使我快乐</h2>', 'html', 'utf-8')

此外,可以使用内嵌资源的方式向邮件中添加文本或图片,以丰富邮件内容。


# related 表示使用内嵌资源的形式,将邮件发送给对方
message = MIMEMultipart('related')

在HTML内容中嵌入图片时,通过`src="cid:x"`引用图片资源,其中x为图片的唯一标识符,可以是数字或字符串。


# ---------------发送文本-----------------
message_html = MIMEText('<h2 style="color:red;font-size:100px">学习使我快乐</h2><img src="cid:small">','html','utf-8')
# 将邮件内容 装入到邮件信息当中去
message.attach(message_html)
# ---------------发送图片-----------------
# rb 读取二进制文件(图片是二进制文件)
image_data = open('1.gif','rb')
# 设置读取获取的二进制数据
message_image = MIMEImage(image_data.read())
# 关闭刚才打开的文件
image_data.close()
message_image.add_header('Content-ID','small')
# 添加图片文件到邮件信息当中去
message.attach(message_image)

构建好包含HTML和图片的邮件主体后,即可调用发送接口完成邮件投递。


message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题
​
email_clint = smtplib.SMTP_SSL(host, port)
login_result = email_clint.login(sender, password)
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
email_client.close()

邮件附件添加方法

在实际应用中,经常需要向邮件添加附件。下面介绍添加附件的具体方法。

添加附件同样采用内嵌资源的方式,将二进制文件编码后附加到邮件中。


# 对二进制文件需要设置默认的编码形式
# 对于MIMEText()来说 默认的编码形式就是base64
# 如果对于二进制文件来说 没有设置base64进行编码 则附件的就会呈现乱码
# --------------------添加图片附件----------------------
message_image = MIMEText(open('1.gif','rb').read(),'base64','utf-8')
# 设置附件在邮件中的名字
message_image['Content-disposition'] = 'attachment;filename="happy.gif"'
message.attach(message_image)
 
# --------------------添加xlsx表格附件---------------
message_xlsx = MIMEText(open('table.xlsx','rb').read(),'base64','utf-8')
# 设置附件在邮件当中的名字
message_xlsx['Content-Disposition'] = 'attachment;filename="test.xlsx"'
message.attach(message_xlsx)

配置好附件后,执行发送命令即可完成带有附件的邮件发送。

本文涵盖了Python发送邮件的核心技术与代码示例,希望能为读者提供实用的参考。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。