• python 接收邮件获取邮件内容


    收取邮件有两种协议,POP3和IMAP,POP3相对于IMAP功能较少无法对邮件进行更深层次的操作,因此本文使用IMAP协议收取邮件。python提供了很多收邮件的模块,本文使用imaplib来接收邮件。


    前提

      需要在邮件箱的设置中打开允许IMAP,不同邮件开启全方式不同,具体开启方式自行百度。(本文使用outlook,默认开启)

    难点

      获得邮件不难,难点是如何解析邮件的内容,由于邮件内容的编码是不固定的,因此编码格式的选择影响着解析邮件内容的正确性

    代码

    import imaplib , email , os
    
    imapserver = 'outlook.office365.com'
    emailuser = "bill@outlook.com"
    emailpasswd = "billpasswd"
    
    attachementdir=r"d:a"  #附件存放的位置
    
    conn = imaplib.IMAP4_SSL(imapserver)
    conn.login(emailuser,emailpasswd)
    
    conn.list()     #列出邮箱中所有的列表,如:收件箱、垃圾箱、草稿箱。。。
    
    conn.select('INBOX')    #选择收件箱(默认)
    
    result , dataid = conn.uid ( 'search' , None , "ALL" ) 
    
    mailidlist = dataid[0].split ()       #转成标准列表,获得所有邮件的ID
    
    # 解析邮件内容
    def get_body(msg):
        if msg.is_multipart ():
            return get_body ( msg.get_payload ( 0 ) )
        else:
            return msg.get_payload ( None , decode=True )
        
    #search('FROM','abc@outlook.com',conn)  根据输入的条件查找特定的邮件
    def search(key,value,conn):
        result , data = conn.search(None,key,'"()"'.format(value))
        return data
    
    #获取附件
    def get_attachements(msg):
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue
            filename = part.get_filename()
    
            if bool(filename):
                filepath = os.path.join(attachementdir,filename)
                with open(filepath,'wb') as f:
                    f.write(part.get_payload(decode=True))
    
    
    for id in mailidlist:
        result , data = conn.fetch ( id , '(RFC822)' )  # 通过邮件id获取邮件
        e = email.message_from_bytes ( data[0][1] )
        subject = email.header.make_header ( email.header.decode_header ( e['SUBJECT'] ) )
        mail_from = email.header.make_header ( email.header.decode_header ( e['From'] ) )
        print("邮件的subject是%s" % subject)
        print("邮件的发件人是%s" % mail_from)
        body = str ( get_body ( e ) , encoding='utf-8' )    # utf-8 gb2312 GB18030解析中文日文英文
        print("邮件内容是%s" % body)
    
    conn.logout()
    

     【问题】

      一般utf-8可以解决大部分的邮件编码格式,若不能解析请使用其他编码。 

     【待改进】

      email模块有一个获取邮件编码的方法,暂时未能找到

      使用email提供的方法获取邮件编码,变可以解决所有邮件解析的问题

  • 相关阅读:
    初识echarts
    深浅拷贝的理解
    react基本语法及组件
    webpack使用
    网上面试资料整理
    封装原生promise函数
    vue路由懒加载及组件懒加载
    译文---C#堆VS栈(Part Four)
    译文---C#堆VS栈(Part Three)
    译文---C#堆VS栈(Part Two)
  • 原文地址:https://www.cnblogs.com/zqj-blog/p/12626773.html
Copyright © 2020-2023  润新知