网易首页 > 网易号 > 正文 申请入驻

Python 库手册:smtplib 发送电子邮件模块

0
分享至

smtplib 是 Python 提供的标准库,用于发送电子邮件。它通过 SMTP(简单邮件传输协议)与邮件服务器建立连接,并支持账号登录、加密传输、多收件人群发、HTML 格式及附件等多种邮件发送方式。与 email 模块搭配使用,可以实现强大的自动化邮件功能。

常见应用场景:

(1)用户注册时发送验证码或欢迎邮件。

(2)报警系统或日志服务的邮件通知。

(3)自动化任务(如数据分析、爬虫)的邮件汇报。

(4)后台定时任务推送日报或报告。

(5)内部消息系统发送提醒或通知。

◆ ◆

核心概念

1、SMTP 协议

即 Simple Mail Transfer Protocol,用于电子邮件的传输,通常端口号为 25、465(SSL)或 587(STARTTLS)。

2、SMTP 类

用于与 SMTP 服务器建立普通连接(非加密或支持 STARTTLS 加密)。

3、SMTP_SSL 类

用于直接通过 SSL 加密连接 SMTP 服务器,适用于需要高安全性的邮箱(如 Gmail、QQ 邮箱)。

4、登录认证

大多数邮箱服务器都需要身份验证,需提供发件人邮箱与授权码(非密码)。

5、邮件内容构造

通常与 email.mime 模块配合使用来构造邮件体,包括文本、HTML、附件等格式。

6、发件与收件

邮件通过 sendmail() 方法发送,需指定发件人、收件人列表和完整邮件内容字符串。

◆ ◆

应用举例

以下五个实例,全部采用显式连接、登录、发送、退出流程,并以 QQ 邮箱为例(你需替换为自己的真实邮箱和授权码)。

例 1:发送纯文本邮件(最基本用法)

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

sender = "your@qq.com"
password = "your_auth_code"
receiver = "receiver@example.com"

msg = MIMEText("这是一封来自 Python 的纯文本测试邮件。", "plain", "utf-8")
msg["Subject"] = Header("纯文本测试", "utf-8")
msg["From"] = Header(sender)
msg["To"] = Header(receiver)

smtp_server = "smtp.qq.com"
smtp_port = 465

server = smtplib.SMTP_SSL(smtp_server, smtp_port)
try:
    server.login(sender, password)
    server.sendmail(sender, [receiver], msg.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print("发送失败:", e)
finally:
    try:
        server.quit()
    except:
        pass

例 2:发送 HTML 格式邮件

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

sender = "your@qq.com"
password = "your_auth_code"
receiver = "receiver@example.com"

html_content = """

 
    Hello!
    这是一封 HTML 格式 的测试邮件。
 

"""
msg = MIMEText(html_content, "html", "utf-8")
msg["Subject"] = Header("HTML 邮件测试", "utf-8")
msg["From"] = Header(sender)
msg["To"] = Header(receiver)

server = smtplib.SMTP_SSL("smtp.qq.com", 465)
try:
    server.login(sender, password)
    server.sendmail(sender, [receiver], msg.as_string())
    print("HTML 邮件发送成功")
except smtplib.SMTPException as e:
    print("发送失败:", e)
finally:
    try:
        server.quit()
    except:
        pass

例 3:SSL 加密发送

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

sender = "your@qq.com"
password = "your_auth_code"
receiver = "receiver@example.com"
cc = "cc_user@example.com"

msg = MIMEText("邮件内容:这是带有抄送的邮件。", "plain", "utf-8")
msg["Subject"] = Header("抄送测试", "utf-8")
msg["From"] = Header(sender)
msg["To"] = Header(receiver)
msg["Cc"] = Header(cc)

server = smtplib.SMTP_SSL("smtp.qq.com", 465)
try:
    server.login(sender, password)
    # 注意:sendmail 的收件人列表必须包含所有收件人(包括抄送)
    server.sendmail(sender, [receiver, cc], msg.as_string())
    print("带抄送的邮件发送成功")
except smtplib.SMTPException as e:
    print("发送失败:", e)
finally:
    try:
        server.quit()
    except:
        pass

例 4:发送带附件的邮件(纯文本 + 附件)

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

sender = "your@qq.com"
password = "your_auth_code"
receiver = "receiver@example.com"

msg = MIMEMultipart()
msg["Subject"] = Header("带附件的邮件", "utf-8")
msg["From"] = Header(sender)
msg["To"] = Header(receiver)

# 邮件正文
msg.attach(MIMEText("这是一封包含附件的测试邮件。", "plain", "utf-8"))

# 附件(确保该路径下存在 test.pdf 文件)
with open("test.pdf", "rb") as f:
    part = MIMEApplication(f.read(), Name="test.pdf")
    part.add_header("Content-Disposition", "attachment", filename="test.pdf")
    msg.attach(part)

server = smtplib.SMTP_SSL("smtp.qq.com", 465)
try:
    server.login(sender, password)
    server.sendmail(sender, [receiver], msg.as_string())
    print("带附件邮件发送成功")
except smtplib.SMTPException as e:
    print("发送失败:", e)
finally:
    try:
        server.quit()
    except:
        pass

例 5:发送群发邮件

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

sender = "your@qq.com"
password = "your_auth_code"
receivers = ["user1@example.com", "user2@example.com", "user3@example.com"]

msg = MIMEText("大家好,这是一封群发测试邮件。", "plain", "utf-8")
msg["Subject"] = Header("群发测试", "utf-8")
msg["From"] = Header(sender)
msg["To"] = Header(", ".join(receivers))  # 显示在邮件头部

server = smtplib.SMTP_SSL("smtp.qq.com", 465)
try:
    server.login(sender, password)
    server.sendmail(sender, receivers, msg.as_string())
    print("群发邮件发送成功")
except smtplib.SMTPException as e:
    print("发送失败:", e)
finally:
    try:
        server.quit()
    except:
        pass

◆ ◆

常用函数速览

ehlo(name='')

向 SMTP 服务器标识客户端身份,启用扩展 SMTP(ESMTP)功能。

参数

name:可选,指定客户端的主机名,默认由系统自动获取

返回

返回服务器响应的字符串信息。成功调用后,可使用服务器支持的扩展功能(如 STARTTLS)。

login(user, password)

登录 SMTP 服务器进行身份验证,适用于需要登录的邮箱服务。

参数

user:邮箱用户名(一般为邮箱地址)

password:邮箱密码或专用授权码(如 Gmail 需启用 SMTP 并获取授权码)

返回

返回服务器的登录响应信息。若失败,将抛出 SMTPAuthenticationError 异常。

quit()

发送 QUIT 命令,并优雅地关闭与服务器的连接。

参数:无

返回

返回服务器关闭连接的响应信息。

sendmail(from_addr, to_addrs, msg)

向一个或多个收件人发送电子邮件。

参数

from_addr:发件人地址(字符串)

to_addrs:收件人地址(字符串或字符串列表)

msg:完整的邮件内容(字符串,需包含邮件头和正文)

返回:成功发送时返回空字典。

若有收件人发送失败,则返回包含失败地址的字典。

set_debuglevel(level)

设置 SMTP 对话的调试输出等级,用于调试通信过程。

参数

level:整数,1 表示开启调试输出,0 表示关闭

返回:无

starttls(keyfile=None, certfile=None, context=None)

将当前连接升级为加密的 TLS 连接,保障通信安全。

参数

keyfile:可选,指定客户端私钥文件路径

certfile:可选,指定客户端证书文件路径

context:可选,ssl.SSLContext 对象,用于配置 TLS 加密参数

返回:无

若服务器不支持 STARTTLS 命令,将抛出 SMTPNotSupportedError。

◆ ◆

补充说明

1、邮件内容(尤其是附件或多格式邮件)应使用 email.mime 模块构造,不建议直接写字符串拼接。

2、如果邮箱使用了二步验证,请在设置中生成并使用“授权码”登录 SMTP,而非邮箱登录密码。

3、部分邮件服务商需手动开启“SMTP 服务”,否则连接将被拒绝。

4、sendmail() 中的收件人必须是列表类型,即使只有一个邮箱地址也应写成 [addr]。

5、推荐设置 set_debuglevel(1) 进行测试,可以看到完整通信过程。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
乌军这波打出国威的反击战,战果已远超俄罗斯的预料

乌军这波打出国威的反击战,战果已远超俄罗斯的预料

起喜电影
2026-02-18 14:05:22
你干过哪些阴暗龌龊的事?网友:最后一个真的好炸裂好真实

你干过哪些阴暗龌龊的事?网友:最后一个真的好炸裂好真实

带你感受人间冷暖
2026-02-17 01:00:24
42岁朱珠和老公春节到天津探望亲戚,夫妻街上拍时尚大片,好带感

42岁朱珠和老公春节到天津探望亲戚,夫妻街上拍时尚大片,好带感

科学发掘
2026-02-19 01:05:36
中国西南运河建设已达89%,2026年实现通江达海!

中国西南运河建设已达89%,2026年实现通江达海!

特约前排观众
2026-02-19 01:05:03
看哭太多人!四川男子9000工资,5000给生病的母亲,妻子闹离婚了

看哭太多人!四川男子9000工资,5000给生病的母亲,妻子闹离婚了

夜深爱杂谈
2026-02-14 20:20:11
夺首金后四度落泪!苏翊鸣:重压后如释重负,首金比生日更重大

夺首金后四度落泪!苏翊鸣:重压后如释重负,首金比生日更重大

奥拜尔
2026-02-18 22:34:31
心满意足!网传湖北一94岁老人在除夕安详离世,网友:修来的善终

心满意足!网传湖北一94岁老人在除夕安详离世,网友:修来的善终

火山詩话
2026-02-19 13:06:55
联合国人权专家小组:爱泼斯坦案或涉危害人类罪 需展开彻查

联合国人权专家小组:爱泼斯坦案或涉危害人类罪 需展开彻查

大象新闻
2026-02-19 10:00:16
马斯克罕见牵手39岁印度裔伴侣,赴海湖庄园婚宴,女高管已生四娃

马斯克罕见牵手39岁印度裔伴侣,赴海湖庄园婚宴,女高管已生四娃

小熊侃史
2026-02-19 10:12:49
有效票数为246票,高市获得125票,高市早苗当选日本新任首相 ,接下来将着手组建新内阁

有效票数为246票,高市获得125票,高市早苗当选日本新任首相 ,接下来将着手组建新内阁

每日经济新闻
2026-02-18 18:23:25
金正恩能力有多强?创造5个政界记录,有望成为世界级伟大人物

金正恩能力有多强?创造5个政界记录,有望成为世界级伟大人物

谈史论天地
2026-02-18 12:06:52
本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机

本科已严重饱和的五个专业,1、临床医学,2、法学,3、计算机

明智家庭教育
2026-01-31 10:29:14
“流水220万,利润0” 2026开年多了个新词——无利润繁荣

“流水220万,利润0” 2026开年多了个新词——无利润繁荣

餐饮界
2026-02-13 19:49:19
美国副总统公开谈谷爱凌!谷爱凌回应记者质疑:这种想法很荒谬

美国副总统公开谈谷爱凌!谷爱凌回应记者质疑:这种想法很荒谬

华人生活网
2026-02-19 05:15:37
林峯老婆晒娃却被骂上热搜,网友:给孩子穿这个,良心不会痛吗?

林峯老婆晒娃却被骂上热搜,网友:给孩子穿这个,良心不会痛吗?

情感大头说说
2026-02-18 22:35:36
我在芬兰见雇主家暖气不热,顺手修了,第5天小镇的人都赶过来了

我在芬兰见雇主家暖气不热,顺手修了,第5天小镇的人都赶过来了

三农老历
2026-01-30 11:25:43
泽连斯基:我比普京更懂俄罗斯,杀了他也结束不了战争

泽连斯基:我比普京更懂俄罗斯,杀了他也结束不了战争

老马拉车莫少装
2026-02-19 13:01:23
中国1月Swift人民币在全球支付中占比3.13%

中国1月Swift人民币在全球支付中占比3.13%

每日经济新闻
2026-02-19 09:12:45
韩国队无奈!女子3000米接力逆袭夺冠 金牌数追平中国队但排名落后

韩国队无奈!女子3000米接力逆袭夺冠 金牌数追平中国队但排名落后

风过乡
2026-02-19 08:33:48
无锡惠山,突发紧急一幕!

无锡惠山,突发紧急一幕!

江南晚报
2026-02-19 10:10:31
2026-02-19 14:16:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1759文章数 76关注度
往期回顾 全部

科技要闻

怒烧45亿,腾讯字节阿里决战春节

头条要闻

美军数十年"最大规模"集结中东 特朗普被指仍在"思考"

头条要闻

美军数十年"最大规模"集结中东 特朗普被指仍在"思考"

体育要闻

首金!苏翊鸣唱国歌落泪 自信比1呐喊

娱乐要闻

明星过年百态!黄晓明等现身三亚

财经要闻

面条火腿香菇酱!上市公司这些年请你吃

汽车要闻

量产甲醇插混 吉利银河星耀6甲醇插混版申报图

态度原创

手机
数码
家居
本地
公开课

手机要闻

3999元起的iPhone、最便宜MacBook,苹果这些新品太炸裂了

数码要闻

戴森推出PencilWash洗地机:专清硬质地面污渍,售349美元

家居要闻

本真栖居 爱暖伴流年

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版