简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。

SMTP通讯的基本流程可以概括为以下几点:

1.连接SMTP服务器

2.登陆用户名和密码

3.发送指定邮件内容

4.退出SMTP连接

一、最简单案例

1.获取授权码(充当登录密码使用)

python实现ssl python smtp ssl_服务器

python实现ssl python smtp ssl_服务器_02

 

python实现ssl python smtp ssl_html_03

 

2.案例代码

#coding:utf-8
import smtplib
from email.mime.text import MIMEText


#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx' # "smtp.qq.com"
#发送者的登陆用户名和密码
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx'
#发送的内容
send_message = 'hello,send by Python.....'
#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'
#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list


# ==========实例化SMTP对象===========
smtp = smtplib.SMTP_SSL(host=smtpserver)

# ==========1.连接SMTP服务器===========
smtp.connect(smtpserver,465) #(缺省)默认端口是25 QQ邮箱端口 465

# ==========2.登陆用户名和密码===========
smtp.login(user,password) #登陆smtp服务器

# ==========3.发送指定邮件内容===========
msg = MIMEText(send_message,'plain','utf-8')#构造纯文本邮件内容
smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数

# ==========4.退出SMTP连接===========
smtp.quit()

3.完善发件人、收件人、主题

但是仔细观察会发现:

1.邮件没有主题

2.看不到收件人的信息

这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件:

from email.header import Header

#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')

完整代码

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx' # "smtp.qq.com"
#发送者的登陆用户名和密码(授权码)
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx' #授权码
#发送的内容
send_message = 'hello,send by Python.....'
#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'
#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list


# ==========实例化SMTP对象===========
smtp = smtplib.SMTP_SSL(host=smtpserver)

# ==========1.连接SMTP服务器===========
smtp.connect(smtpserver,465) #(缺省)默认端口是25 QQ邮箱端口 465

# ==========2.登陆用户名和密码===========
smtp.login(user,password) #登陆smtp服务器

# ==========3.发送指定邮件内容===========
msg = MIMEText(send_message,'plain','utf-8')#构造纯文本邮件内容
msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
msg['Subject'] = Header('python SMTP 测试邮件的主题','utf-8')

smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数

# ==========4.退出SMTP连接===========
smtp.quit()

二、发送HTML格式的邮件

如果我们要发送HTML邮件,而不是普通的纯文本文件怎么办?方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了: 

将:
msg = MIMEText(send_message,'plain','utf-8')#构造纯文本邮件内容
改为:
msg = MIMEText("<html><h1>你好!<h1><html>",'html','utf-8')

完整代码:

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx' # "smtp.qq.com"
#发送者的登陆用户名和密码(授权码)
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx' #授权码
#发送的内容
#send_message = 'hello,send by Python.....'
#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'
#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list


# ==========实例化SMTP对象===========
smtp = smtplib.SMTP_SSL(host=smtpserver)

# ==========1.连接SMTP服务器===========
smtp.connect(smtpserver,465) #(缺省)默认端口是25 QQ邮箱端口 465

# ==========2.登陆用户名和密码===========
smtp.login(user,password) #登陆smtp服务器

# ==========3.发送指定邮件内容===========
#msg = MIMEText(send_message,'plain','utf-8')#构造纯文本邮件内容
msg = MIMEText("<html><h1>你好!<h1><html>",'html','utf-8')
msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
msg['Subject'] = Header('python SMTP 测试邮件的主题','utf-8')

smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数

# ==========4.退出SMTP连接===========
smtp.quit()

三、发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

发送附件功能  所需的主要代码:

from email.mime.multipart import MIMEMultipart


# ==========3.发送指定邮件内容===========
msg = MIMEMultipart()
msg.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))

msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
msg['Subject'] = Header('python SMTP 测试邮件的主题','utf-8')

#构造附件1,传送当前目录下的111.jpg文件
file = open('111.jpg','rb')#读取附件内容
fr = file.read()
att1 = MIMEText(fr,'base64','utf-8')
#设置 filename 文件名
att1.add_header('Content-Disposition', 'attachment', filename="111.jpg")
msg.attach(att1)

smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数

完整代码:

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

#发送者邮箱的SMTP服务器地址
smtpserver = 'xxxx' # "smtp.qq.com"
#发送者的登陆用户名和密码(授权码)
user = 'xxxxx@XXXX.com.cn'
password = 'xxxxxx' #授权码
#发送的内容
#send_message = 'hello,send by Python.....'
#发送者邮箱
sender = 'xxxxx@XXXXX.com.cn'
#接收者的邮箱地址
receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list


# ==========实例化SMTP对象===========
smtp = smtplib.SMTP_SSL(host=smtpserver)

# ==========1.连接SMTP服务器===========
smtp.connect(smtpserver,465) #(缺省)默认端口是25 QQ邮箱端口 465

# ==========2.登陆用户名和密码===========
smtp.login(user,password) #登陆smtp服务器

# ==========3.发送指定邮件内容===========
#msg = MIMEText(send_message,'plain','utf-8')#构造纯文本邮件内容
#msg = MIMEText("<html><h1>你好!<h1><html>",'html','utf-8')
msg = MIMEMultipart()
msg.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))

msg['From'] = Header('Python测试','utf-8')
msg['To'] = Header('管理员','utf-8')
msg['Subject'] = Header('python SMTP 测试邮件的主题','utf-8')

#构造附件1,传送当前目录下的111.jpg文件
file = open('111.jpg','rb')#读取附件内容
fr = file.read()
att1 = MIMEText(fr,'base64','utf-8')
#设置 filename 文件名
att1.add_header('Content-Disposition', 'attachment', filename="111.jpg")
msg.attach(att1)

smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数

# ==========4.退出SMTP连接===========
smtp.quit()