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))
  • 相关阅读:
    Delphi下遍历文件夹下所有文件的递归算法
    mysql + unidac 使用事务例子
    新建DataSnap REST Application
    ClientDataSet中的错误处理
    TSQLConnection的事务处理
    ClientDataSet的查找和过滤功能
    TField中的GetText和SetText
    ClientDataSet中撤消与恢复操作及执行细节
    ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus
    ClientDataSet中动态添加计算字段
  • 原文地址:https://www.cnblogs.com/xiangxisheng/p/14300835.html
Copyright © 2011-2022 走看看