使用Python3获取IMAP的邮件
#-*- coding:UTF-8 -*- import imaplib, email def email_header_decode(str): dh = email.header.decode_header(str)[0] if dh[1] == None: return dh[0] return dh[0].decode(dh[1]) def email_get_timestamp_by_rfc2822(date): return email.utils.mktime_tz(email.utils.parsedate_tz(date)) def email_get_timestamp_by_msg(msg): if msg['Date']: return email_get_timestamp_by_rfc2822(msg['Date']) try: aReceived = msg['Received'].split(" ") Date = aReceived[len(aReceived) - 1].split('; ')[1] return email_get_timestamp_by_rfc2822(Date) except: print(msg) return None def imap_fetch(srvaddr, srvport, is_ssl, account, password, limit): #1:连接服务器 try: if is_ssl: M = imaplib.IMAP4_SSL(srvaddr, srvport) else: M = imaplib.IMAP4(srvaddr, srvport) except imaplib.IMAP4.error as err: return 500, None, err #2:使用账号密码进行登录 try: M.login(account, password) except imaplib.IMAP4.error as err: return 400, None, err #3:选择收件箱 try: M.select('INBOX', False) except imaplib.IMAP4.error as err: return 410, None, err #4:搜索邮件 try: typ, data = M.search(None, 'ALL') except imaplib.IMAP4.error as err: return 420, None, err #5:对搜到的邮件依次进行HEADER获取 count = 0 rows = [] for msg_num in data[0].split()[::-1]: count = count + 1 try: message_parts = '(UID BODY.PEEK[HEADER])' typ, datas = M.fetch(msg_num, message_parts) text = datas[0][1].decode('utf8') msg = email.message_from_string(text) #print('msg_num:%s msg:%s ' % (msg_num, msg)) #print(msg['Return-Path']) #print(msg['Delivered-To']) row = {} row['account'] = account row['msg_num'] = int(msg_num) From = email.utils.parseaddr(msg['From']) row['from_name'] = email_header_decode(From[0]) row['from_addr'] = From[1] row['to_addr'] = msg['To'] row['subject'] = email_header_decode(msg['Subject']) row['timestamp'] = email_get_timestamp_by_msg(msg) rows.append(row) except imaplib.IMAP4.error as err: print("M.fetch error: {0}".format(err)) #except: # print("M.fetch error: Unknown") if count >= limit: break M.close() M.logout() return 200, rows, None status, rows, err = imap_fetch('imap.126.com', 993, True, 'test@126.com', 'test', 1) print(status) print(rows) print("OS error: {0}".format(err))