本文介绍邮件传输的SMTP协议,并根据该协议,利用Python的‘smtplib’和‘email‘模块,完成邮件的发送。
一 SMTP协议介绍
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
二 模块介绍
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。
smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
2.1 smtplib介绍
smtplib使用较为简单。以下是最基本的语法。
导入及使用方法如下:
import smtplib
smtp = smtplib.SMTP()
smtp.connect(host,port)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
说明:
smtplib.SMTP():实例化SMTP;
-
connect(host,port):
- host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:
新浪邮箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,
搜狐邮箱:smtp.sohu.com,126邮箱:smtp.126.com,
139邮箱:smtp.139.com,163网易邮箱:smtp.163.com。 - port:指定连接服务器的端口号,默认为25.
- host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:
-
login(user,password):
user:登录邮箱的用户名。
-
password:登录邮箱的密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码,如下图所示
-
sendmail(sender, receiver, msg.as_string()):
- sender:邮件发送地址;
- receiver:邮件接收地址列表;可以多个接收人,
- msg.as_string():发送消息,msg:是字符串,表示邮件;as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。
2.2 email模块
email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。
该mime包下常用的有三个模块:text,image,multpart。
导入方法如下:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
构造一个邮件对象就是一个Message对象,
构造一个MIMEText对象,表示一个文本邮件对象;
构造一个MIMEImage对象,表示一个附件为图片的邮件对象;
要把多个邮件对象组合起来,就用MIMEMultipart对象。
2.2.1 text说明
邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,
通常都会用两类型分别为"text/plain"和"text/html"
构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。
- 添加普通文字代码示例
text= 'Python 邮件发送测试...'
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText(text, 'plain', 'utf-8')
- 添加html文字代码示例
html = """
Here is the link
"""
# 三个参数:第一个为超文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
text_html = MIMEText(html,'html', 'utf-8')
- 添加附件为文档的代码示例
# 读取文件
sendfile=open(r'D:\temp\test.txt','rb').read()
# 实例化MIMEText对象
text_att = MIMEText(sendfile, 'base64', 'utf-8')
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
text_att.add_header('Content-Disposition','attachment',filename='显示的名字.txt')
2.2.2 image说明
# 读取图片
sendimagefile=open(r'D:\temp\test.png','rb').read()
#实例化MIMEImage对象
image = MIMEImage(sendimagefile)
#定义图片 ID,在 HTML 文本中引用
image.add_header('Content-ID','')
# 构造图片作为附件显示
image.add_header('content-disposition', 'attachment', filename='test.png')
2.2.3 multpart说明
常见的multipart类型有三种:
- multipart/alternative;
- multipart/related;
- multipart/mixed。
- 邮件类型为"multipart/alternative"的邮件:包括纯文本正文(text/plain)和超文本正文(text/html)。
- 邮件类型为"multipart/related"的邮件:正文中包括图片,声音等内嵌资源。
- 邮件类型为"multipart/mixed"的邮件:包含附件,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
msg = MIMEMultipart('alternative')
msg = MIMEMultipart('related')
msg = MIMEMultipart('mixed')
在构造邮件的时候必须把Subject,From,To,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。
msg = MIMEMultipart('mixed')
msg['Subject'] = 'Python邮件发送'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg['Date']='2019-4-09'
说明:
msg.add_header(_name,_value,**_params):添加邮件头字段。
msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。
msg.attach(MIMEText对象或MIMEImage对象):将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。
构造的文本,超文本,附件,图片都何以添加到MIMEMultipart('mixed')中:
#添加文本
msg.attach(text_plain)
#添加超文本
msg.attach(text_html)
#添加附件
msg.attach(text_att)
#添加图片
msg.attach(image)
三 代码演示
下面的代码展示了利用python发送带有附件、图片、正文显示图片和文本的邮件代码示例,详情如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 20190406
@author: yiluo
@site: https://github.com/bingshilei
@email: [email protected]
@file:
@description: 利用python实现邮件发送
"""
# smtplib主要用来建立服务器链接
import smtplib
# 多个邮件对象组合
from email.mime.multipart import MIMEMultipart
# 带有附件为图片的邮件对象
from email.mime.image import MIMEImage
# 文本邮件对象
from email.mime.text import MIMEText
if __name__ == '__main__':
try:
# 1、第三方 SMTP 服务
# 设置服务器
mail_host = 'smtp.163.com'
# 设置用户名
mail_user = '[email protected]'
# 设置授权码
mail_passwd = 'che123'
# 设置发件人
sender = '[email protected]'
# 设置收件人
receiver = '[email protected]'
# 2、设置邮件主题
subject = '利用python实现发送邮件demo'
# 实例化邮件组合对象MIMEMultipart
msg = MIMEMultipart('mixed')
# 构造邮件主题
msg['Subject'] = subject
# 构造邮件发送人
msg['From'] = sender
# 构造邮件接收人
msg['To'] = receiver
# 3、构造邮件正文内容
# 3.1 设置正文内容
text = '欢迎关注车伊洛公众号,让我们每天都充电.'
# 实例化MIMEText对象
text_plain = MIMEText(text, 'plain', 'utf-8')
# 将MIMEText对象添加到MIMEMultipart对象上
msg.attach(text_plain)
# 3.2 设置超文本内容
str_html = """
Title
Python 邮件发送测试...
图片演示:
"""
# 实例化MIMEText对象
text_html = MIMEText(str_html, 'html', 'utf-8')
# 将MIMEText对象添加到MIMEMultipart对象上
msg.attach(text_html)
# 读取图片
with open(r'D:\temp\test.png', 'rb') as f:
send_image_file = f.read()
# 4、构造图片通过imageid在正文显示
# 实例化MIMEImage对象
mail_image_show = MIMEImage(send_image_file,'octet-stream')
# 定义图片 ID,在 HTML 文本中引用
mail_image_show.add_header('Content-ID', '')
# 将MIMEImage对象添加到MIMEMultipart对象上
msg.attach(mail_image_show)
# 5、构造图片作为附件显示
mail_image_attachment = MIMEImage(send_image_file,'octet-stream')
# 为mail_image增加属性,作为附件显示
mail_image_attachment.add_header('content-disposition', 'attachment', filename='test.png')
# 将MIMEImage对象添加到MIMEMultipart对象上
msg.attach(mail_image_attachment)
# 6、构造文本附件
#读取文本内容
with open(r'D:\temp\test.docx','rb') as f:
send_file = f.read()
# 实例化MIMEText对象
mail_file = MIMEText(send_file,'base64','utf-8')
# 为mail_file增加属性,作为附件显示
mail_file.add_header('content-disposition', 'attachment', filename='test.docx')
# 将MIMEIext对象添加到MIMEMultipart对象上
msg.attach(mail_file)
except Exception as e:
print(e)
# 5、发送邮件
try:
# 实例化SMTP对象
smtp = smtplib.SMTP()
# 连接邮箱服务器
smtp.connect(mail_host, 25)
# 设置日志级别
smtp.set_debuglevel(1)
# 登录邮箱服务器
smtp.login(mail_user, mail_passwd)
# 发送邮件
smtp.sendmail(sender, receiver, msg.as_string())
print('发送邮件成功')
# 断开邮箱会话
smtp.quit()
except Exception as e:
print(e)
print('发送邮件失败')
执行上述代码,qq邮箱可以收到一封邮件,正文包括文字和图片,附件为1张图片和1份文档,如下图所示:
四 文章总结
本文简单介绍了利用python实现邮件的发送,分章节介绍了使用的包smtplib和email,最后再以一个完整的例子作为巩固学习到的知识。其实使用python在发送邮件有很多用处,比如写脚本监控Linux运行的状况出现异常时可以发送邮件进行提示;或者在写爬虫的时候当数据爬取完成也可以发个邮件爬取完成等等。
本篇文章到此结束,如果本票文章对您有帮忙,可以点个喜欢。
如果您想要本文的源码,请关注微信号:【车伊洛】,发送关键字“pthon邮件发送”即可得到代码下载链接。