0

0

如何用Python发送邮件?

紅蓮之龍

紅蓮之龍

发布时间:2025-09-04 09:11:01

|

195人浏览过

|

来源于php中文网

原创

答案:Python发送邮件需使用smtplib和email模块,通过SMTP服务器认证连接并构造邮件内容。首先配置发件人邮箱、授权码、收件人及服务器信息,利用MIMEText创建纯文本邮件,MIMEMultipart构建多部分邮件以添加附件或HTML内容,发送时启用TLS或SSL加密,并妥善处理异常。常见问题多为授权码错误、服务器端口配置不当或邮箱服务未开启,需逐一排查。

如何用python发送邮件?

用Python发送邮件,核心在于利用其内置的

smtplib
email
模块。
smtplib
负责连接邮件服务器并发送邮件,而
email
模块则用来构造邮件的各种内容,比如正文、附件、HTML格式等。理解这两者的协同工作,就能高效、灵活地实现邮件的自动化发送。

解决方案 发送一封最基础的纯文本邮件,我们需要几个关键步骤。这通常是我开始一个新邮件自动化项目时的起点,简单直接,能快速验证连接和认证是否成功。

首先,导入必要的模块:

smtplib
用于SMTP协议交互,
email.mime.text.MIMEText
用于创建文本邮件体。

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件配置
sender_email = 'your_email@example.com'  # 发件人邮箱
sender_password = 'your_app_password'    # 发件人邮箱的授权码(或密码,但不推荐直接使用主密码)
receiver_email = 'recipient@example.com' # 收件人邮箱
smtp_server = 'smtp.example.com'         # SMTP服务器地址,例如:smtp.gmail.com, smtp.qq.com
smtp_port = 587                          # SMTP服务器端口,SSL通常是465,TLS通常是587

# 邮件内容
subject = 'Python发送测试邮件'
body = '你好!这是一封由Python脚本发送的测试邮件。'

# 构建MIMEText对象
msg = MIMEText(body, 'plain', 'utf-8')
msg['From'] = Header(f'发件人名称 <{sender_email}>', 'utf-8')
msg['To'] = Header(f'收件人名称 <{receiver_email}>', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')

try:
    # 连接SMTP服务器
    # 对于TLS加密,使用starttls()
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls() # 启动TLS加密

    # 登录邮箱
    server.login(sender_email, sender_password)

    # 发送邮件
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print('邮件发送成功!')

except smtplib.SMTPException as e:
    print(f'邮件发送失败: {e}')
except Exception as e:
    print(f'发生未知错误: {e}')
finally:
    if 'server' in locals() and server:
        server.quit() # 关闭连接

这里需要特别注意的是

sender_password
。出于安全考虑,大多数主流邮箱服务(如Gmail、QQ邮箱、Outlook等)都推荐使用授权码而非你的账户主密码。授权码是专门为第三方应用生成的一次性或应用专用密码,即使泄露也不会直接影响你的主账户安全。获取授权码的方法通常在邮箱的“设置”->“账户”->“POP3/IMAP/SMTP服务”或“客户端授权码”部分。

Python发送带附件的邮件怎么实现? 在实际应用中,纯文本邮件往往不够用,我们经常需要发送带有文件附件的邮件。这比纯文本邮件稍微复杂一点,但

email
模块提供了非常强大的工具来处理。我的经验是,一旦你掌握了
MIMEMultipart
,处理附件就变得非常直观了。

要发送带附件的邮件,我们需要使用

email.mime.multipart.MIMEMultipart
来创建一个多部分邮件体,然后将文本内容和附件作为不同的部分添加到这个邮件体中。

立即学习Python免费学习笔记(深入)”;

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header
import os

sender_email = 'your_email@example.com'
sender_password = 'your_app_password'
receiver_email = 'recipient@example.com'
smtp_server = 'smtp.example.com'
smtp_port = 587

subject = '带附件的Python测试邮件'
body = '你好!这是一封带附件的Python测试邮件。请查收附件。'
attachment_path = 'path/to/your/file.pdf' # 附件的完整路径

# 创建MIMEMultipart对象,用于组合邮件正文和附件
msg = MIMEMultipart()
msg['From'] = Header(f'发件人名称 <{sender_email}>', 'utf-8')
msg['To'] = Header(f'收件人名称 <{receiver_email}>', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')

# 添加邮件正文
msg.attach(MIMEText(body, 'plain', 'utf-8'))

# 添加附件
if os.path.exists(attachment_path):
    try:
        with open(attachment_path, 'rb') as f:
            # 创建MIMEBase对象,用于表示附件
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(f.read())

        # 对附件进行Base64编码
        encoders.encode_base64(part)

        # 设置附件的文件名,确保中文文件名能正确显示
        file_name = os.path.basename(attachment_path)
        part.add_header('Content-Disposition', 'attachment', filename=(Header(file_name, 'utf-8').encode()))

        msg.attach(part)
        print(f"附件 '{file_name}' 添加成功。")
    except FileNotFoundError:
        print(f"错误:附件文件 '{attachment_path}' 未找到。")
    except Exception as e:
        print(f"添加附件时发生错误: {e}")
else:
    print(f"警告:附件文件 '{attachment_path}' 不存在,邮件将不包含此附件。")


try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print('带附件的邮件发送成功!')
except smtplib.SMTPException as e:
    print(f'邮件发送失败: {e}')
except Exception as e:
    print(f'发生未知错误: {e}')
finally:
    if 'server' in locals() and server:
        server.quit()

这里需要注意

MIMEBase('application', 'octet-stream')
的使用,它是一个通用的二进制流类型。
encoders.encode_base64(part)
是邮件协议中对二进制数据进行编码的标准方式。最重要的是
Content-Disposition
头,它告诉邮件客户端这是一个附件,并且指定了附件的文件名。对于中文文件名,使用
Header(file_name, 'utf-8').encode()
可以确保其正确显示。

如何用Python发送HTML格式的邮件? 现代邮件客户端对HTML格式的支持非常普遍,发送HTML邮件能让你的内容更具吸引力,可以包含图片、链接、排版等。我个人在发送报告、通知或营销邮件时,几乎总是倾向于使用HTML格式。

发送HTML邮件与发送纯文本邮件类似,只是在创建

MIMEText
对象时,需要将
_subtype
参数设置为
'html'
。如果你想提供一个纯文本的备用版本(这是一个好的实践,以防某些老旧的邮件客户端不支持HTML),你可以将纯文本和HTML版本都添加到
MIMEMultipart
中。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender_email = 'your_email@example.com'
sender_password = 'your_app_password'
receiver_email = 'recipient@example.com'
smtp_server = 'smtp.example.com'
smtp_port = 587

subject = 'Python发送HTML格式邮件'

# HTML邮件内容
html_body = """\
<html>
  <head></head>
  <body>
    <p>你好!</p>
    <p>这是一封由Python脚本发送的<b>HTML格式</b>测试邮件。</p>
    <p>你可以点击这里访问我的<a href="https://example.com">网站</a>。</p>
    <img src="https://via.placeholder.com/150" alt="Placeholder Image">
    <p>祝好!</p>
  </body>
</html>
"""

# 纯文本备用内容
text_body = "你好!这是一封由Python脚本发送的HTML格式测试邮件。\n请访问我的网站:https://example.com"

# 创建MIMEMultipart对象,用于组合纯文本和HTML版本
msg = MIMEMultipart('alternative') # 'alternative'表示这些部分是同一内容的替代表示
msg['From'] = Header(f'发件人名称 <{sender_email}>', 'utf-8')
msg['To'] = Header(f'收件人名称 <{receiver_email}>', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')

# 添加纯文本部分
msg.attach(MIMEText(text_body, 'plain', 'utf-8'))

# 添加HTML部分
msg.attach(MIMEText(html_body, 'html', 'utf-8'))

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
    server.sendmail(sender_email, receiver_email, msg.as_string())
    print('HTML格式邮件发送成功!')
except smtplib.SMTPException as e:
    print(f'邮件发送失败: {e}')
except Exception as e:
    print(f'发生未知错误: {e}')
finally:
    if 'server' in locals() and server:
        server.quit()

这里关键是

MIMEMultipart('alternative')
,它告诉邮件客户端,这些附件(纯文本和HTML)是同一个内容的替代版本,客户端会选择它最能理解的版本来显示。通常,邮件客户端会优先显示HTML版本。在HTML邮件中嵌入图片,如果图片是外部链接,直接在
<img>
标签中引用即可;如果是本地图片,则需要将其作为附件嵌入,并在HTML中通过
cid:
(Content-ID)引用,这会稍微复杂一些,涉及到
email.mime.image.MIMEImage
Content-ID
头的设置。

Python发送邮件,遇到身份验证失败怎么办? 身份验证失败是我在自动化邮件脚本开发中最常遇到的问题之一。它往往不是代码逻辑错误,而是配置或安全策略上的问题。遇到这类问题,首先不要慌,一步步排查通常都能解决。

  1. 检查用户名和密码(授权码):这是最基本也最容易出错的地方。确保
    sender_email
    sender_password
    完全正确。对于主流邮箱,几乎总是需要使用授权码,而不是你的账户主密码。很多新手会直接填主密码,导致认证失败。例如,Gmail的授权码需要在Google账户安全设置中生成,QQ邮箱和163邮箱也有类似设置。
  2. SMTP服务器地址和端口
    smtp_server
    smtp_port
    必须与你的邮箱服务商提供的完全一致。常见的组合是:
    • Gmail:
      smtp.gmail.com
      , 端口587 (TLS) 或 465 (SSL)
    • QQ邮箱:
      smtp.qq.com
      , 端口465 (SSL) 或 587 (TLS)
    • Outlook/Hotmail:
      smtp.office365.com
      , 端口587 (TLS)
    • 163邮箱:
      smtp.163.com
      , 端口465 (SSL) 或 994 (SSL) 确保你的代码中
      server = smtplib.SMTP(smtp_server, smtp_port)
      smtplib.SMTP_SSL(smtp_server, smtp_port)
      与端口和加密方式匹配。
  3. 加密方式
    • 如果端口是587,通常需要调用
      server.starttls()
      来启动TLS加密。
    • 如果端口是465,则应该使用
      smtplib.SMTP_SSL()
      来建立连接,它默认使用SSL加密,无需再调用
      starttls()
      。混淆这两种方式会导致连接或认证失败。
  4. 邮箱账户设置:有些邮箱服务默认关闭了SMTP/POP3/IMAP服务,或者有“客户端授权”之类的选项需要手动开启。例如,Gmail账户可能需要开启“允许不够安全的应用访问”或生成应用专用密码。QQ邮箱需要开启IMAP/SMTP服务并生成授权码。
  5. 网络或防火墙:极少数情况下,公司的网络策略或个人防火墙可能会阻止对SMTP端口的访问。可以尝试在其他网络环境下测试,或者检查防火墙设置。
  6. 错误信息:仔细阅读Python抛出的
    smtplib.SMTPAuthenticationError
    smtplib.SMTPException
    的详细信息。它通常会告诉你失败的具体原因,比如“Authentication failed”或“535 Authentication failed”。这些信息是排查问题的关键线索。

我的建议是,遇到认证问题,先去你的邮箱服务商官网查找其SMTP配置文档,然后对照你的代码和账户设置逐一检查。通常,问题都出在授权码或SMTP服务器/端口的配置上。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
SSL检测工具介绍
SSL检测工具介绍

SSL检测工具有SSL Labs、SSL Check、SSL Server Test、SSLMate、SSL/TLS Analyzer等。详细介绍:1、SSL Labs是一个由Qualys提供的在线SSL检测工具,可以评估服务器证书的部署情况、加密套件、协议支持等方面的安全性,它提供了一个详细的报告,包括证书的颁发者、有效期、安全性配置等;2、SSL Check等等。

355

2023.10.20

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

67

2025.12.13

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

88

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

272

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号