美文网首页
python下载邮件

python下载邮件

作者: 体胖勤跑步 | 来源:发表于2017-08-26 15:55 被阅读0次

    一直想用qt来写一个邮件客户端的,但是c++下面总也找不到能运行的demo,只好找了个python的了,需要运行在python2.7下面,转来的代码,如下:

    #-*- encoding: utf-8 -*-
    #author : rayment
    #CreateDate : 2013-01-24`
    
    import imaplib
    import email
    #设置命令窗口输出使用中文编码
    import sys
    reload(sys)
    sys.setdefaultencoding('gbk')
    
    #保存文件方法(都是保存在指定的根目录下)
    def savefile(filename, data, path):
        try:
            filepath = path + filename
            print('Saved as ' + filepath)
            f = open(filepath, 'wb')
        except:
            print('filename error')
            f.close()
        f.write(data)
        f.close()
       
    #字符编码转换方法
    def my_unicode(s, encoding):
        if encoding:
            return unicode(s, encoding)
        else:
            return unicode(s)
    
    #获得字符编码方法
    def get_charset(message, default="ascii"):
        #Get the message charset
        return message.get_charset()
        return default
    
    #解析邮件方法(区分出正文与附件)
    def parseEmail(msg, mypath):
        mailContent = None
        contenttype = None
        suffix =None
        for part in msg.walk():
            if not part.is_multipart():
                contenttype = part.get_content_type()   
                filename = part.get_filename()
                charset = get_charset(part)
                #是否有附件
                if filename:
                    h = email.Header.Header(filename)
                    dh = email.Header.decode_header(h)
                    fname = dh[0][0]
                    encodeStr = dh[0][1]
                    if encodeStr != None:
                        if charset == None:
                            fname = fname.decode(encodeStr, 'gbk')
                        else:
                            fname = fname.decode(encodeStr, charset)
                    data = part.get_payload(decode=True)
                    print('Attachment : ' + fname)
                    #保存附件
                    if fname != None or fname != '':
                        savefile(fname, data, mypath)            
                else:
                    if contenttype in ['text/plain']:
                        suffix = '.txt'
                    if contenttype in ['text/html']:
                        suffix = '.htm'
                    if charset == None:
                        mailContent = part.get_payload(decode=True)
                    else:
                        mailContent = part.get_payload(decode=True).decode(charset)         
        return  (mailContent, suffix)
    
    #获取邮件方法
    def getMail(mailhost, account, password, diskroot, port = 993, ssl = 1):
        mypath = diskroot + ':\\'
        #是否采用ssl
        if ssl == 1:
            imapServer = imaplib.IMAP4_SSL(mailhost, port)
        else:
            imapServer = imaplib.IMAP4(mailhost, port)
        imapServer.login(account, password)
        imapServer.select()
        #邮件状态设置,新邮件为Unseen
        #Message statues = 'All,Unseen,Seen,Recent,Answered, Flagged'
        resp, items = imapServer.search(None, "All")
        number = 1
        for i in items[0].split():
           #get information of email
           resp, mailData = imapServer.fetch(i, "(RFC822)")   
           mailText = mailData[0][1]
           msg = email.message_from_string(mailText)
           ls = msg["From"].split(' ')
           strfrom = ''
           if(len(ls) == 2):
               fromname = email.Header.decode_header((ls[0]).strip('\"'))
               strfrom = 'From : ' + my_unicode(fromname[0][0], fromname[0][1]) + ls[1]
           else:
               strfrom = 'From : ' + msg["From"]
           strdate = 'Date : ' + msg["Date"]
           subject = email.Header.decode_header(msg["Subject"])
           sub = my_unicode(subject[0][0], subject[0][1])
           strsub = 'Subject : ' + sub
                 
           mailContent, suffix = parseEmail(msg, mypath)
           #命令窗体输出邮件基本信息
           print('\n')
           print('No : ' + str(number))
           print(strfrom)
           print(strdate)
           print(strsub)
    
           #保存邮件正文
           if (suffix != None and suffix != '') and (mailContent != None and mailContent != ''):
               savefile(str(number) + suffix, mailContent, mypath)
               number = number + 1
               
        imapServer.close()
        imapServer.logout()
    
    if __name__ =="__main__":
        #邮件保存在e盘
        mypath ='e'
        print('begin to get email...')
        #getMail('pop.gmail.com', '***@gmail.com', 'xxxxx', mypath, 993, 1)
        #qq邮箱登陆用ssl,注意下面的xxxxxx是qq邮箱的imap授权码,要在qq邮箱里设置
        getMail('imap.qq.com', '***@qq.com', 'xxxxxx', mypath, 993, 1)
        print('the end of get email.')
    

    相关文章

      网友评论

          本文标题:python下载邮件

          本文链接:https://www.haomeiwen.com/subject/rczmdxtx.html