Python 发送邮件实战:SMTP 协议快速上手指南
简单邮件传输协议 (SMTP) 负责发送邮件并在邮件服务器间路由邮件。
Python 提供 smtplib 模块,定义了 SMTP 客户端会话对象,可用于向任何运行 SMTP 或 ESMTP 监听守护进程的互联网主机发送邮件。
创建 SMTP 对象
简单语法:
import smtplib
smtpObj = smtplib.SMTP([host[, port[, local_hostname]]])
参数详情:
- host:运行 SMTP 服务器的主机,可指定 IP 或域名(如 tutorialspoint.com),可选。
- port:提供
host时需指定 SMTP 服务监听端口,通常为 25。 - local_hostname:本机运行 SMTP 服务器时可指定
localhost。
SMTP 对象实例方法 sendmail 执行发送工作,接受三个参数:
- sender:发件人地址字符串。
- receivers:收件人地址字符串列表。
- message:符合 RFC 格式的消息字符串。
示例:发送纯文本邮件
#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message."""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except SMTPException:
print("Error: unable to send email")
邮件正文使用三引号,正确格式化头部:需包含 From、To、Subject 头部,与正文间留空行。
使用 smtpObj 连接本地 SMTP 服务器,调用 sendmail 发送。若本地无 SMTP 服务器,可用 smtplib 客户端连接远程 SMTP 服务器。除非使用网页邮件(如 Hotmail、Yahoo! Mail),邮件提供商会提供发件服务器详情,如:
smtplib.SMTP('mail.your-domain.com', 25)
发送 HTML 邮件
发送文本邮件时内容视为纯文本,HTML 标签不会渲染。Python 支持将 HTML 作为真正 HTML 发送。
发送时指定 MIME 版本、内容类型和字符集。
示例
#!/usr/bin/python
import smtplib
message = """From: From Person
To: To Person
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
This is HTML message.
This is headline.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except SMTPException:
print("Error: unable to send email")
发送带附件的邮件
混合内容邮件需设置 Content-type 为 multipart/mixed,文本和附件部分在 边界 内指定。
边界以两个连字符加唯一编号开始,编号不得出现在邮件正文中。结束边界也需以两个连字符结尾。
附件文件需用 pack("m") 函数进行 base64 编码后传输。
示例:发送 /tmp/test.txt 作为附件
#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body = """This is a test email to send an attachment."""
part1 = """From: From Person
To: To Person
Subject: Sending Attachment
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s""" % (marker, marker)
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s""" % (body, marker)
part3 = """Content-Type: multipart/mixed; name="%s"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--""" % (filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print("Successfully sent email")
except Exception:
print("Error: unable to send email")
Python
- 树莓派配合 TMP006 红外温度传感器:Python 库与安装指南
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- 精通Python数据类型:实战指南
- 精通Python运算符:全面指南
- 精通Python Pass语句:实战指南
- 精通Python函数参数:位置、关键字与默认参数
- 精通 Python 字典:创建、操作与进阶技巧
- 精通 Python 异常处理:try、except、else 与 finally 详解
- Python 计算平均值:从循环到 NumPy 的四种实战方法
- Python 优雅交换两变量:无需临时变量的一行代码
- Python 发送邮件实战:SMTP 协议快速上手指南
- Java 发送邮件完整指南:从基础到进阶实战