zoukankan      html  css  js  c++  java
  • 使用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))
  • 相关阅读:
    [SCOI2008]奖励关
    [HNOI2015]落忆枫音
    [HAOI2012]高速公路
    [HNOI2012]集合选数
    A. 【UNR #2】积劳成疾
    整体二分
    [HNOI2015]亚瑟王
    [SDOI2010]星际竞速
    [SDOI2010]地精部落
    [SDOI2014]数数
  • 原文地址:https://www.cnblogs.com/xiangxisheng/p/14300835.html
Copyright © 2011-2022 走看看