POP3、IMAP、SMTP,CardDAV、CalDAV协议特点
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
POP3、IMAP、SMTP可以分为两类:
从服务器邮件获取协议:POP3、IMAP
从客户端发送邮件协议:SMTP
SSL(Secure Sockets Layer)
安全套接层,及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密,客户与服务器应用之间的通信不被攻击者窃听。
CardDAV、CalDAV
一种通讯录同步的开放协议。使用 CardDAV 同步的通讯录可以编辑、修改或者删除,并且你在手机上的这些操作也同样会和服务器同步,并同时同步到你的其他设备上。
CalDAV 是一种用于存取网络行事历及行程或会议排程的client/server 协议。
IMAP和POP3两个邮件接收协议的区别:
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
而IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
同时,IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。
授权码申请
以qq邮箱为例
例子
import imaplib
import email
from email.header import decode_header
'''第一部分:收件IMAP4********************************************'''
'''登录邮箱IMAP4=========================================================='''
from_addr = '' # 发件邮箱
password = '' # 邮箱密码(或者客户端授权码)
imap_server = 'imap.qq.com'
try:
email_server = imaplib.IMAP4_SSL(imap_server, 993) #邮箱服务器及SSL端口
print("imap4 服务器连接成功")
except:
print("imap4 服务器连接失败")
exit(1)
try:
email_server.login(from_addr, password)
print("imap4 账号密码正确,登录成功")
except:
print("imap4 账号密码不正确,登录失败")
exit(1)
''' 邮箱中收到的未读邮件的数量=========================================================='''\
# 选择收件箱
email_server.select()
# search方法返回状态和查找得到的含有邮箱编号的字节数组
email_unseen_id_byte= email_server.search(None, 'UNSEEN')[1][0].split() #所有未读邮件的id 格式email_unseen_id_byte [b'5255', b'5256', b'5257']
print('未读邮件一共有:',len(email_unseen_id_byte),'封')
# #得到所有未读邮件标号将byte格式转为为str email_unseen_id ['5255', '5256', '5257', '5258']
email_unseen_id = []
count_byte = 0
for row in email_unseen_id_byte:
email_unseen_id.append(row.decode('utf-8'))
# '''读取邮件标题,地址========================================================='''
# 通过fetch(index)读取第index封邮件的内容
sub_list = []
addr_list = []
# #对每一封邮件进行处理
for a in email_unseen_id:
# 获取邮件主题和地址信息,byte格式
typ, email_content = email_server.fetch(f'{a}'.encode(), '(RFC822)')
mail_text = email_content[0][1]
# 编码转化
msg = email.message_from_bytes(mail_text)
subject = msg['Subject']
email_from = msg['from']
subdecode = decode_header(subject) #[(b'\xc9\xed\xdd\xc8\xcf\xd6\xbb\xd8\xcc\xc2\xeb', 'gb18030')]
from_decode = decode_header(email_from) # [(b'"', None), (b'\xd0\xa1\xe3', 'gb18030'), (b'" <3825@qq.com>', None)]
print(from_decode)