简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。
SMTP通讯的基本流程可以概括为以下几点:
1.连接SMTP服务器
2.登陆用户名和密码
3.发送指定邮件内容
4.退出SMTP连接
一、发送纯文本格式邮件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#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()
|
运行之后就会收到邮件:
但是仔细观察会发现:
1.邮件没有主题
2.看不到收件人的信息
这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件:
1
2
3
4
5
|
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就可以了:
1
2
|
msg = MIMEText( '<html><h1>你好!<h1><html>' , 'html' , 'utf-8' )
#发送HTML格式邮件就只需要把对应的第二个参数改为html即可
|
三、发送带附件的邮件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#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发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。
构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
这种嵌套关系就可以构造出任意复杂的邮件。你可以通过email.mime文档查看它们所在的包以及详细的用法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/stephenmc/p/8028411.html