Python使用smtplib模块发送纯文本、HTML及带附件邮件详解
本文详细介绍如何利用Python的smtplib模块实现自动发送邮件功能。内容涵盖SMTP协议基础、连接登录流程,并分步演示如何构造和发送纯文本邮件、HTML格式邮件以及包含附件的复杂邮件。通过解析MIMEText、MIMEMultipart等类的继承关系,帮助开发者掌握邮件头设置与内容构造技巧,确保邮件完整送达。
简单邮件传输协议(SMTP)是用于在邮件服务器之间发送和路由电子邮件的标准协议。Python内置了smtplib模块,该模块提供了一个SMTP客户端会话对象,允许开发者通过SMTP或ESMTP监听器向任意互联网主机发送邮件。
SMTP通信的基本流程主要包含以下几个步骤:
第一步,建立与SMTP服务器的连接。
第二步,使用用户名和密码进行身份验证登录。
第三步,指定并发送具体的邮件内容。
第四步,断开与SMTP服务器的连接。
一、发送纯文本格式邮件
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from smtplib import SMTP
from email.mime.text import MIMEText
from email.header import Header
#构造纯文本邮件内容
msg = MIMEText('hello,send by Python.....','plain','utf-8')
#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'
#发送者的登陆用户名和密码
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx'
#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx'
#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list
smtp = smtplib.SMTP() #实例化SMTP对象
smtp.connect(smtpserver,25) #(缺省)默认端口是25 也可以根据服务器进行设定
smtp.login(user,password) #登陆smtp服务器
smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数
'''
login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文
是一个str,as_string()把MIMEText对象变成str。
'''
smtp.quit()
执行上述代码后,接收方即可收到邮件。

然而,仔细观察收到的邮件会发现以下问题:
首先,邮件主题栏为空。
其次,无法直接看到发件人和收件人的显示信息。
这是因为邮件的主题、发件人及收件人等元数据并非通过SMTP协议直接发送给邮件传输代理(MTA),而是封装在发送给MTA的文本内容中。因此,必须在MIMEText对象中显式添加From、To和Subject字段,才能构成一封完整的标准邮件。
msg = MIMEText('hello,send by Python.....','plain','utf-8')
msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
subject = 'python SMTP 测试邮件'
msg['Subject'] = Header(subject,'utf-8')
二、发送HTML格式的邮件
若需发送HTML格式的邮件而非纯文本,实现方法十分简单。在构造MIMEText对象时,将HTML字符串传入,并将第二个参数由“plain”更改为“html”即可。
msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8')
#发送HTML格式邮件就只需要把对应的第二个参数改为html即可
三、发送带附件的邮件
发送包含附件的邮件时,首先需要创建MIMEMultipart()实例。接着构造附件对象,若存在多个附件,需依次构造并添加,最后通过smtplib.smtp方法发送完整邮件。
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
#发送邮件服务器
smtpserver = 'xxxxx'
#发送邮箱用户名和密码
user = 'xxxxxx'
password = 'xxxxxx'
#发送邮箱
sender = 'xxxxx'
#接受邮箱
receiver = 'xxxxxxx'
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header('Python 测试','utf-8')
message['To'] = Header('测试','utf-8')
subject = 'Python SMTP邮件测试'
message['Subject'] = Header(subject,'utf-8')
#邮件正文内容
message.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))
#构造附件1,传送当前目录下的test.txt文件
att1 = MIMEText(open('123.txt','rb').read(),'base64','utf-8')
att1['Content-Type'] = 'application/octet-stream'
#这里的filename可以任意写,写什么名字 邮件中就显示什么名字
att1['Content-Disposition'] = 'attachment;filename:"123.txt"'
message.attach(att1)
smtp = smtplib.SMTP()
smtp.connect(smtpserver,25)
smtp.login(user,password)
smtp.sendmail(sender,receiver,message.as_string())
smtp.quit()
小结
使用Python的smtplib模块发送邮件操作简便。只要掌握各类邮件内容的构造方法,并正确设置邮件头信息,即可顺利发出邮件。
构造邮件对象本质上是构建Message对象。若构造MIMEText对象,则代表一个文本邮件;若构造MIMEImage对象,则代表一个图片附件。要将多个对象组合在一起,需使用MIMEMultipart对象,而MIMEBase可用于表示任何类型的对象。它们的继承关系如下:
Message +- MIMEBase +- MIMEMultipart +- MIMENonMultipart +- MIMEMessage +- MIMEText +- MIMEImage
这种嵌套关系使得构造任意复杂的邮件成为可能。开发者可通过查阅email.mime文档,了解这些类所在的包及其详细用法。
以上即为本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













