使用Python3获取IMAP的邮件

使用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))