# -*- coding: utf-8 -*- import poplib import email from email.parser import Parser from email.header import decode_header from email.utils import parseaddr import time def guess_charset(msg): # 先從msg物件獲取編碼: charset = msg.get_charset() if charset is None: # 如果獲取不到,再從Content-Type欄位獲取: content_type = msg.get('Content-Type', '').lower() pos = content_type.find('charset=') if pos >= 0: charset = content_type[pos + 8:].strip() return charset #郵件的Subject或者Email中包含的名字都是經過編碼後的str,要正常顯示,就必須decode: def decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return value # indent用於縮排顯示: RESULT = '' def mail_info(msg,indent=0): global RESULT if indent == 0: # 郵件的From, To, Subject存在於根物件上: for header in ['From', 'To', 'Subject']: value = msg.get(header, '') if value: if header=='Subject': # 需要解碼Subject字串: value = decode_str(value) else: # 需要解碼Email地址: hdr, addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name, addr) # print('%s%s: %s' % (' ' * indent, header, value)) RESULT += ('%s%s: %s' % (' ' * indent, header, value)) RESULT += '\r\n' if (msg.is_multipart()): # 如果郵件物件是一個MIMEMultipart, # get_payload()返回list,包含所有的子物件: parts = msg.get_payload() for n, part in enumerate(parts): # print('%spart %s' % (' ' * indent, n)) # print('%s--------------------' % (' ' * indent)) # 遞迴列印每一個子物件: mail_info(part,indent + 1) else: # 郵件物件不是一個MIMEMultipart, # 就根據content_type判斷: content_type = msg.get_content_type() if content_type=='text/plain' or content_type=='text/html': # 純文字或HTML內容: content = msg.get_payload(decode=True) # 要檢測文字編碼: charset = guess_charset(msg) if charset: try: content = content.decode(charset) except: content = content.decode('utf-8', errors='ignore').encode('utf-8') # print('%sText: %s' % ('' * indent, content + '...')) RESULT += ('%sText: %s' % ('' * indent, content)) else: # 不是文字,作為附件處理: # print('%sAttachment: %s' % (' ' * indent, content_type)) RESULT += ('%sAttachment: %s' % (' ' * indent, content_type)) return RESULT def judge_mail(content,condition): res = True for l in range(0,len(condition)): if condition[l] not in content: res = False break return res #接收郵件:郵箱、密碼、域名、郵件數量 def receive_mail(email,password,pop3_server,num): res = '' server = poplib.POP3(pop3_server) #server.set_debuglevel(1) # print(server.getwelcome()) # 認證: server.user(email) server.pass_(password) # print('Messages: %s. Size: %s' % server.stat()) resp, mails, octets = server.list() for i in range(0,num): # 獲取最新一封郵件, 注意索引號從1開始: resp, lines, octets = server.retr(len(mails) - i) # 解析郵件: msg_content = b'\r\n'.join(lines).decode('utf-8') msg = Parser().parsestr(msg_content) res += mail_info(msg) # 關閉連線: # server.quit() return res #刪除郵件 def delete_mail(email,password,pop3_server): server = poplib.POP3(pop3_server) #server.set_debuglevel(1) # print(server.getwelcome()) # 認證: server.user(email) server.pass_(password) # print('Messages: %s. Size: %s' % server.stat()) resp, mails, octets = server.list() # 慎重:將直接從伺服器刪除郵件: server.dele(len(mails)) # 關閉連線: server.quit() return True if __name__ == '__main__': email = '[email protected]' password = ' pop3_server = 'imap.wondershare.cn' print(receive_mail(email,password,pop3_server,2)) # condition = ['Thank you for shopping with us www.wondershare.com1.','2.PID'] # #迴圈檢查三次郵件 # for i in range(3): # result = receive_mail(email,password,pop3_server,2) # res = judge_mail(result,condition) # if res == True: # print(res) # break # else: # print('第' + str(i) + '次輪循') # time.sleep(30) # print(delete_mail(email,password,pop3_server))