2020-11-13 python和 mail

李大海的幸福生活發表於2020-11-14

場景:人力資源批量下載求職者的簡歷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()

相關文章