場景:人力資源批量下載求職者的簡歷zip檔案
from poplib import POP3
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
#################################郵箱資訊###########################
email = "2796464329@qq.com"
password: str = "dgttlxbaullqdcgi"
pop3_server = "pop.qq.com"
server = POP3(pop3_server) #連線到POP3伺服器
################################郵箱解析############################
value = ['','','']
def printMsg(msg):
global value
i = 0
for header in ['From', 'To', 'Subject']: #解析郵件頭
value[i] = msg.get(header, '')
if value[i]:
if header == 'Subject': #解析主題
value[i] = decode_str(value[i])
else:
hdr, addr = parseaddr(value[i])
name = decode_str(hdr)
value[i] = u'%s <%s>' % (name, addr)
i = i+1
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
####################################################################
#server.set_debuglevel(1) #開閉除錯資訊
#print (server.getwelcome().decode('utf-8')) #列印歡迎資訊
server.user(email) #身份認證郵箱地址
server.pass_(password) #身份認證,郵箱密碼
emailNum, size = server.stat()
print ("Messages: %s. size: %s" % (emailNum, size)) #返回郵箱的數量和佔用空間
resp, mails, octets = server.list() #返回所有郵箱的編號
index = len(mails) #獲取最新的一封郵件, 索引從1開始
resp, lines, octets = server.top(index,0) #只獲取郵箱的頭
msg_content = b'\r\n'.join(lines).decode('utf-8') #每一行加入換行,並轉化為UTF-8型別
msg = Parser().parsestr(msg_content) #把郵件內容解析成Message物件
printMsg(msg)
print (value)
#server.dele(index) #可以根據索引號從伺服器刪除郵件
server.quit() #關閉連線
from email.parser import Parser
from email.header import decode_header,Header
from email.utils import parseaddr
import poplib
# 輸入郵件地址, 口令和POP3伺服器地址:
email = '2796464329@qq.com'
password = 'dgttlxbaullqdcgi' # 這個密碼不是郵箱登入密碼,是pop3服務密碼
pop3_server = 'pop.qq.com'
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def print_info(msg):
# 輸出發件人,收件人,郵件主題資訊
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header == 'Subject':
value = decode_str(value) # 將主題名稱解密
else:
hdr, addr = parseaddr(value)
name = decode_str(hdr)
value = u'%s <%s>' % (name, addr)
print('%s: %s' % (header, value))
# 獲取郵件主體資訊
attachment_files = []
for part in msg.walk():
file_name = part.get_filename() # 獲取附件名稱型別
contentType = part.get_content_type() #獲取資料型別
mycode = part.get_content_charset() #獲取編碼格式
if file_name:
h = Header(file_name)
dh = decode_header(h) # 對附件名稱進行解碼
filename = dh[0][0]
if dh[0][1]:
filename = decode_str(str(filename, dh[0][1])) # 將附件名稱可讀化
attachment_files.append(filename)
data = part.get_payload(decode=True) # 下載附件
with open(filename, 'wb') as f: # 在當前目錄下建立檔案,注意二進位制檔案需要用wb模式開啟
#with open('指定目錄路徑'+filename, 'wb') as f: 也可以指定下載目錄
f.write(data) # 儲存附件
print(f'附件 {filename} 已下載完成')
elif contentType == 'text/plain': #or contentType == 'text/html':
# 輸出正文 也可以寫入檔案
data = part.get_payload(decode=True)
content = data.decode(mycode)
print('正文:',content)
print('附件檔名列表',attachment_files)
# 連線到POP3伺服器:
server = poplib.POP3_SSL(pop3_server, 995)
# 可以開啟或關閉除錯資訊:
server.set_debuglevel(1)
# 可選:列印POP3伺服器的歡迎文字:
# print(server.getwelcome().decode('utf-8'))
# 身份認證:
server.user(email)
server.pass_(password)
# stat()返回郵件數量和佔用空間:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有郵件的編號:
resp, mails, octets = server.list()
# 可以檢視返回的列表類似[b'1 82923', b'2 2184', ...]
# print(mails)
# 由於pop3協議不支援對已讀未讀郵件的標記,因此,要判斷一封pop郵箱中的郵件是否是新郵件必須與郵件客戶端聯合起來才能做到。
index = len(mails)
print('未讀郵件的數量',index)
# 獲取最新一封郵件, 注意索引號從1開始,最後一個索引代表的是最新接收的郵件:
# 可以寫個迴圈,獲取所有郵件的內容 for i in range(1,index+1)
resp, lines, octets = server.retr(index)
# lines儲存了郵件的原始文字的每一行,
# 可以獲得整個郵件的原始文字:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍後解析出郵件:
msg = Parser().parsestr(msg_content)
#獲取郵件內容
print_info(msg)
# 可以根據郵件索引號直接從伺服器刪除郵件:
# server.dele(2)
# 關閉連線:
server.quit()