POP3和IMAP是郵件相關的協議,IMAP是比POP3更高級一點的協議,實現了了客戶端和服務端的交互;郵件協議在實際工作中的應用較為廣泛。
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后,您在電子郵件客戶端收取的郵件仍然保留在服務器上,同時在客戶端上的操作都會反饋到服務器上,如:刪除郵件,標記已讀等,服務器上的郵件也會做相應的動作。

在python中支持POP3協議,也支持IMAP協議,但是IMAP因為其交互性逐漸取代了POP3成為了郵件服務器與客戶端的交互,下面主要使用IMAP協議來獲取郵件正文、附件、移動或刪除郵件。
import re
import email
from imapclient import IMAPClient
import traceback
class?EmailRead(object):
"""實現讀取郵件正文、讀取附件功能、移動郵件、刪除郵件"""
def?__init__(self, user, passwd, index_file, re_list, server_adderss, port, move_file=None):
"""
:param user: 登陸用戶名
:param passwd: 登陸密碼
:param index_file: 需要查詢的郵件文件夾
:param re_list: 需要查找的郵件主題滿足的正則表達式
:param move_file: 將郵件移動到該文件夾
:param server_adderss: 郵件服務器地址
:param port: 郵件服務器IMAP協議端口
"""
self.server_address = server_adderss
self.user = user
self.password = passwd
self.index_file = index_file
self.move_file = move_file
self.re_list = re_list
self.server = None
self.port = port
self.item = None
self.file_type_list = ['image/jpeg', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
def?reade_email(self):
"""
查找郵件并根據附件類型下載附件
:return:?
"""
self.server = IMAPClient(self.server_address, port=993, ssl=True)
self.server.login(self.user, self.password)
self.server.select_folder(self.index_file, readonly=False)
result = self.server.search(['all']) # 獲取所有郵件
if result:
self.messages = self.server.fetch(result, ['BODY.PEEK[]'])
for message_id, message in self.messages.items():
e = email.message_from_string(message[b'BODY[]'].decode())
# 生成Message類型 e
try:
subject = str(email.header.make_header(
email.header.decode_header(e['SUBJECT']))) # 解碼subject
except:
subject = e['SUBJECT']
"""正則匹配標題中的 MSO """
if self.subject_re(subject):
"""獲取附件和正文"""
for part in e.walk():
filename = part.get_filename()
content_type = part.get_content_type()
con = part.get_payload(decode=False)
if not filename and content_type == 'text/html':
if isinstance(con, bytes):
con = part.get_payload(decode=True).decode()
elif filename and content_type in self.file_type_list:
con = part.get_payload(decode=True)
with open(filename, 'wb') as f:
f.write(con)
f.close()
else:
# list返回附件對象作用類似于e
pass
def?move_email(self, *id):
"""郵件移動和刪除功能:傳入的move_file是None則不移動只刪除"""
messages = self.server.fetch(list(id), ['BODY.PEEK[]'])
if None!= self.move_file:
self.server.copy(messages, self.move_file) # move
self.server.delete_messages(messages) # delete
self.server.expunge() # save delete
def?subject_re(self, subject):
"""用于匹配主題正則表達式"""
for i in self.re_list:
mso_re = re.search(i, subject)
if mso_re:
return True
else:
pass
return False
defclose(self):
self.server.logout()
該系統也可以用于解決部分郵件驗證的,可以直接從郵件獲取到驗證碼的正文,并進一步提取。
