python实现smtp协议发送邮件协议简介:
SMTP和POP3/IMAP协议的⼀些介绍
1.SMTP协议
(1) SMTP协议(simple mail transfer protocol) 简单邮件传输协议
(2) 定义了邮件客户端与SMTP服务器之间、两台SMTP服务器之间的通信规则
(3) 分为标准SMTP协议和扩展SMTP协议。扩展SMTP协议在标准SMTP协议上增加了邮件
安全的认证
(4) 通信双⽅采⽤⼀问⼀答的命令/响应模式
(5) 底层基于TCP/IP的应⽤层协议、默认⽹络监听号25
2.POP3协议
(1) ⽤户要从服务提供商提供的电⼦邮件中获取⾃⼰的电⼦邮件,需要POP3邮件服务器帮组完成
⽽POP3(Post Office Protocol) 定义了邮件客户端与POP3服务器通信规则。
(2) POP3采⽤的⽹络监听端⼝号默认为110
3.IMAP协议
(1) IMAP (internet Message Access Protocol) 协议是对POP3协议的⼀种扩展
实至名归什么意思(2) 相对于POP3协议⽽⾔,定义了更为强⼤的邮件接收功能
IMAP具有摘要浏览功能
IAP可以让⽤户有选择性地下载邮件附件
IMAP可以让⽤户在邮件服务器上创建⾃⼰的邮件夹,分类保存各个邮件
(3) IMAP协议在逐渐取代POP3协议,但POP3协议长期存在也不会在短期内淘汰,所以我们看到还是两种协议并存
smtplocalhost.py 直接由⾃⼰搭建的邮件服务器发送,我这⾥ubuntu正在配置
# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-08-29 22:52:18
# @Last Modified by: Clarence
# @Last Modified time: 2018-09-10 15:13:28
"""
Python3 SMTP发送邮件
python的smtplib提供⼀种很⽅便的途径发送电⼦邮件。它对smtp协议进⾏了简单的封装
Python创建SMTP对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port[, local_hostname]]])
参数:
host: SMTP服务器主机。你可以指定主机的ip地址或者域名字符串(本地'localhost').
port: 如果你提供了host参数,你需要指定SMTP服务使⽤的端⼝号,⼀般情况下SMTP端⼝号为25
local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为localhost即可
Python SMTP对象使⽤ndmail⽅法发送邮件,语法如下:
SMTP.ndmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数:
from_addr: 邮件发送者地址
to_addrs:字符串列表,邮件发送地址
msg:发送消息字符串,邮件⼀般有标题,发信⼈,收信⼈,邮件内容,附件等构成,发送邮件的时候,
要注意msg的格式。这个格式就是smtp协议中定义的格式。
"""
import smtplib
from import MIMEText
from email.header import Header
nder = ''
receivers = [''] #接受邮件,可以设置为你的QQ邮箱或者其他邮箱
# 三个参数: 第⼀个为⽂本内容,第⼆个plain设置⽂本格式,第三个utf-8设置编码
"""
"""
MIME类型(Multipurpo Internet Mail Extensions)是描述消息内容类型的因特⽹标准
MIME消息能包含⽂本、图像、⾳频、视频以及其他应⽤程序专⽤的数据
不同的应⽤程序⽀持不同的MIME类型 plain是纯⽂本格式
"""
message = MIMEText('Python邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", "utf-8") #发送者
message['To'] = Header('测试', 'utf-8') # 接受者
subject = 'Python SMTP邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
print(type(message), message)
smtpObj = smtplib.SMTP('localhost')
smtpObj.ndmail(nder, receivers, message.as_string())
print('邮件发送成功')
except smtplib.SMTPException:
print("Error: ⽆法发送邮件")
"""
<class 'MIMEText'> Content-Type: text/plain; chart="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: ba64
From: =?utf-8?b?6I+c6bif5pWZ56iL?=
To: =?utf-8?b?5rWL6K+V?=
Subject: =?utf-8?b?UHl0aG9uIFNNVFDpgq7ku7bmtYvor5U=?=
五线谱图
UHl0aG9u6YKu5Lu25Y+R6YCB5rWL6K+VLi4u
可以看到打印出来的message这个MIME⽂本类,⾥⾯包含的内容是编码类型,数据类型,MIME版本,以及传输的编码格式ba64,
下⾯是邮件的⾸发地址,可以看到这是⽤ba64编码之后的地址
//这⾥出现由于⽬标计算机积极拒绝,⽆法连接错误的原因是,邮件服务器需要认证登陆,⼤家可以在linux或者win配置ndmail服务端,然后尝试smtp = smtplib.SMTP_SSL(smtprver, 465)
smtp.helo()
smtp.ehlo()
smtp.login(ur, password)来认证
"""
通过腾讯或其他的SMTP服务来发送邮箱
smtpremote.py
# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date: 2018-09-10 11:25:25
# @Last Modified by: Clarence
# @Last Modified time: 2018-09-10 16:54:15
小儿金丹片"""
如果本机没有ndmail访问,可以使⽤其他服务商的SMTP访问(QQ、⽹易、Google等)
⼀个具体的STMP通信(如发送端邮件服务器与接收端服务器的通信)的过程如下:
1) 发送端邮件服务器(以下简称客户端)与接收端邮件服务器(以下简称服务器)的25号端⼝建⽴TCP连接
2) 客户端向服务器发送各种命令,来请求各种服务(如认证、指定发送⼈和接收⼈)
3)服务器解析⽤户的命令,做出相应动作并返回给客户端⼀个响应。
4) 2)和3)交替进⾏,知道所有邮件都发送完成或两者的连接被意外中断
"""
import smtplib
from import MIMEText
from email.header import Header
# 第三⽅SMTP服务
mail_host = "" # 设置服务器
#⾃⼰的邮箱,通过QQ邮箱设置获取⼝令
mail_ur = "" #⽤户名
mail_pass = "xxxxxxxxxx" # ⼝令
nder = ''
receivers = [''] #接受者的邮箱,我的另⼀个QQ邮箱
'''
如果发送HTML格式的邮件,那么改变MIME类型就可以
发送HTML格式的邮件与发送纯⽂本消息的邮件不同之处就是将MIMEText中_subtype设置为html
mail_msg = """好看的小说女生
<p>Python 邮件发送测试...<p>
<p><a href="">这是⼀个链接</a></p>
"""
message=MIMEText(mail_msg, 'html', 'utf-8')
'''
# class MIMEText(_text[, _subtype[, _chart]]) ⽤于创建主要类型⽂本的MIME对象,_text是有效负载的字符串,_subtype # 是次要类型,默认为plain._chart是⽂本的字符集
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] = Header("", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.login(mail_ur, mail_pass) #会返回(状态码, "字符串解释")元组信息
smtpObj.ndmail(nder, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: ⽆法发送邮件")
"""
<smtplib.SMTP object at 0x000001ED3DDFCE48>
邮件发送成功
[Finished in 2.9s]
⼤家可以在QQ邮箱上设置中账号菜单设置开启STMP服务,然后获得⼝令,填⼊mail_pass,这⾥我就⽤xxxx表⽰⼝令,可以看到邮件发送成功注: nder和mail_ur要相同,可能QQSTMP服务器需要知道真实的发送者,所以就这样
"""
发送带附件的邮件
ndAttachmentmail.py
import smtplib
from import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
# 第三⽅SMTP服务
mail_host = "" # 设置服务器
#⾃⼰的邮箱,通过QQ邮箱设置获取⼝令
mail_ur = "" #⽤户名
介绍杭州mail_pass = "xxxxxxxxxxxx" # ⼝令
#这⾥nder和mail_ur要⼀致,腾讯可能不让匿名发送邮件
nder = ''
receivers = [''] #接受者的邮箱
# 创建⼀个带附件的实例
message = MIMEMultipart()
message['From'] = Header("发送邮件者Clarence", 'utf-8')
message['To'] = Header("", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
# 邮件正⽂内容
豆腐营养成分message.attach(MIMEText('这是smtp协议发送邮件测试有效负载内容....', 'plain', 'utf-8'))
# 构造附件1,传送当前⽬录下的⽂件,可以看出是直接读取⽂本⼆进制流
attr1 = MIMEText(open('', 'rb').read(), 'ba64', 'utf-8')
"""
上⾏代码作⽤阴阳颠倒
任贤齐歌Content-Type: text/ba64; chart="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: ba64
"""
attr1["Content_Type"] = 'application/octet-stream' # 内容是⼆进制流,不知道⽂件类型
#
attr1["Content-Disposition"] = 'attachment; filename=""' #Content-Disposition是MIME协议的扩展,⽀持MIME⽤户代理如何显⽰附加的⽂件message.attach(attr1)
#构造附件2,传送当前⽬录下的⽂件
attr2 = MIMEText(open('', 'rb').read(), 'ba64', 'utf-8')
attr2["Content_Type"] = 'application/octet-stream'
attr2['Content-Disposition'] = 'attachment; filename="'
message.attach(attr2)
try:
smtpObj = smtplib.SMTP()
smtpObj.login(mail_ur, mail_pass) #会返回(状态码, "字符串解释")元组信息
smtpObj.ndmail(nder, receivers, message.as_string())
print(message)
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: ⽆法发送邮件")
发送html且带图像IncoToHtml.py