最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)郵件自動下載的示例詳解

 更新時間:2022年07月14日 16:04:13   作者:阿濤的一天  
這篇文章主要為大家詳細介紹了如何利用Python語言實現(xiàn)郵件自動下載以及附件解析功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

開始碼代碼之前,我們先來了解一下三種郵件服務(wù)協(xié)議:

1、SMTP協(xié)議

SMTP(Simple Mail Transfer Protocol),即簡單郵件傳輸協(xié)議。相當(dāng)于中轉(zhuǎn)站,將郵件發(fā)送到客戶端。

2、POP3協(xié)議

POP3(Post Office Protocol 3),即郵局協(xié)議的第3個版本,是電子郵件的第一個離線協(xié)議標(biāo)準。該協(xié)議把郵件下載到本地計算機,不與服務(wù)器同步,缺點是更易丟失郵件或多次下載相同的郵件。

3、IMAP協(xié)議

IMAP(Internet Mail Access Protocol),即交互式郵件存取協(xié)議。該協(xié)議連接遠程郵箱直接操作,與服務(wù)器內(nèi)容同步。

然后介紹一下email包

這個包的中心組件是代表電子郵件消息的“對象模型”。 應(yīng)用程序主要通過在 message 子模塊中定義的對象模型接口與這個包進行交互。 應(yīng)用程序可以使用此 API 來詢問有關(guān)現(xiàn)有電子郵件的問題、構(gòu)造新的電子郵件,或者添加或移除自身也使用相同對象模型接口的電子郵件子組件。 也就是說,遵循電子郵件消息及其 MIME 子組件的性質(zhì),電子郵件對象模型是所有提供 EmailMessage API 的對象所構(gòu)成的樹狀結(jié)構(gòu)。

接下來我們通過具體的代碼實現(xiàn)一個登錄郵箱客戶端,下載郵件,解析郵件附件內(nèi)容的功能。

首先我們需要定義一個郵件解析的類,該類需要三個變量:

1、郵箱所屬的imap服務(wù)地址;

2、郵箱賬號;

3、郵箱密碼【注:不同郵箱需要不同的安全策略,例如qq郵箱需要短信驗證,獲取登錄授權(quán)碼,而不是明文密碼去登錄遠程客戶端】

class Email_parse:

    def __init__(self,remote_server_url,email_url,password):
    	# imap服務(wù)地址
        self.remote_server_url = remote_server_url
        # 郵箱賬號
        self.email_url = email_url
        # 郵箱密碼
        self.password = password

然后定義類中入口函數(shù),登錄遠程,默認獲取第一頁所有的郵件。我們獲取郵件的主題,并打印出來【不同郵件主題的編碼可能不同,二進制需要轉(zhuǎn)碼才能正確顯示】

    def main_parse_Email(self):
        """入口函數(shù),登錄imap服務(wù)"""
        server = imaplib.IMAP4_SSL(self.remote_server_url, 993)
        server.login(self.email_url, self.password)
        server.select('INBOX')
        status,data = server.search(None,"ALL")
        if status != 'OK':
            raise Exception('read email error')
        emailids = data[0].split()
        mail_counts = len(emailids)
        print("count:",mail_counts)
        # 郵件的遍歷是按時間從后往前,這里我們選擇最新的一封郵件
        for i in range(mail_counts - 1, mail_counts - 2, -1):
            status, edata = server.fetch(emailids[i], '(RFC822)')
            msg = email.message_from_bytes(edata[0][1])
            #獲取郵件主題title
            subject = email.header.decode_header(msg.get('subject'))
            if type(subject[-1][0]) == bytes:
                title = subject[-1][0].decode(str(subject[-1][1]))
            elif type(subject[-1][0]) == str:
                title = subject[-1][0]
            print("title:", title)

其中,msg變量保存的就是郵件的主體,接下來因為會重復(fù)用到msg和tilte,我們將構(gòu)造一個類函數(shù)返回msg和title。

    def get_email_title(msg):
        subject = email.header.decode_header(msg.get('subject'))
        if type(subject[-1][0]) == bytes:
            title = subject[-1][0].decode(str(subject[-1][1]))
        elif type(subject[-1][0]) == str:
            title = subject[-1][0]
        print("title:", title)
        return title

解析郵件,我們分為兩部分,郵件正文【HTML】和附件【xlsx等】,判斷有附件,我們就保存到固定的路徑下。表格的解析不再贅述了,pandas之類的包足以搞定。

    def get_att(msg):
        """獲取附件并下載"""
        filename = Email_parse.get_email_name(msg)
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                data = part.get_payload(decode=True)
                if data != None:
                    att_file = open('./src/' + filename, 'wb')
                    att_file.write(data)
                    att_file.close()
                else:
                    pass

郵件正文內(nèi)容,我們直接解析html,將文本內(nèi)容直接保存到.txt文件中,方便讀取。

    def get_text_from_HTML(msg):
        """獲取郵件中的html"""
        filename = Email_parse.get_email_name(msg)
        current_title = Email_parse.get_email_title(msg)
        print("filename:",filename,type(filename))
        for part in msg.walk():
            if not part.is_multipart():
                result = part.get_payload(decode=True)
                result = result.decode('gbk')
                f = open(f'./src/{current_title}.txt','w')
                f.write(result)
                f.close()
                return result

完整代碼如下:

import email
import imaplib
from email.header import decode_header
import pandas as pd
import datetime


class Email_parse:
    def __init__(self,remote_server_url,email_url,password):
        self.remote_server_url = remote_server_url
        self.email_url = email_url
        self.password = password

    def get_att(msg):
        filename = Email_parse.get_email_name(msg)
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                data = part.get_payload(decode=True)
                if data != None:
                    att_file = open('./src/' + filename, 'wb')
                    att_file.write(data)
                    att_file.close()
                else:
                    pass

    def get_email_title(msg):
        subject = email.header.decode_header(msg.get('subject'))
        if type(subject[-1][0]) == bytes:
            title = subject[-1][0].decode(str(subject[-1][1]))
        elif type(subject[-1][0]) == str:
            title = subject[-1][0]
        print("title:", title)
        return title


    def get_email_name(msg):
        for part in msg.walk():
            file_name = part.get_param("name")
            if file_name:
                h = email.header.Header(file_name)
                dh = email.header.decode_header(h)
                filename = dh[0][0]
                if dh[0][1]:
                    value, charset = decode_header(str(filename, dh[0][1]))[0]
                    if charset:
                        filename = value.decode(charset)
                        print("附件名稱:", filename)
                        return filename


    def main_parse_Email(self):
        server = imaplib.IMAP4_SSL(self.remote_server_url, 993)
        server.login(self.email_url, self.password)
        server.select('INBOX')
        status,data = server.search(None,"ALL")
        if status != 'OK':
            raise Exception('read email error')
        emailids = data[0].split()
        mail_counts = len(emailids)
        print("count:",mail_counts)
        for i in range(mail_counts - 1, mail_counts - 2, -1):
            status, edata = server.fetch(emailids[i], '(RFC822)')
            msg = email.message_from_bytes(edata[0][1])
            subject = email.header.decode_header(msg.get('subject'))
            if type(subject[-1][0]) == bytes:
                title = subject[-1][0].decode(str(subject[-1][1]))
            elif type(subject[-1][0]) == str:
                title = subject[-1][0]
            print("title:", title)
            Email_parse.get_att(msg)
            Email_parse.get_text_from_HTML(msg)


    def get_text_from_HTML(msg):
        filename = Email_parse.get_email_name(msg)
        current_title = Email_parse.get_email_title(msg)
        print("filename:",filename,type(filename))
        for part in msg.walk():
            if not part.is_multipart():
                result = part.get_payload(decode=True)
                result = result.decode('gbk')
                f = open(f'./src/{current_title}.txt','w')
                f.write(result)
                f.close()
                return result

if __name__ == "__main__":
    remote_server_url = 'imap.qq.com'
    email_url = "*********@qq.com"
    password = "**********"
    demo = Email_parse(remote_server_url,email_url,password)
    demo.main_parse_Email()

運行結(jié)果:

以上就是Python實現(xiàn)郵件自動下載的示例詳解的詳細內(nèi)容,更多關(guān)于Python郵件自動下載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python隨機種子ranrandom seed的使用

    python隨機種子ranrandom seed的使用

    本文介紹了在Python中設(shè)置隨機種子random seed的方法,可以使用seed()函數(shù)設(shè)置隨機種子,確保你的隨機數(shù)生成過程是可重復(fù)的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作

    python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作

    今天小編就為大家分享一篇python3 使用Opencv打開USB攝像頭,配置1080P分辨率的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中參數(shù)打包和解包的實現(xiàn)

    Python中參數(shù)打包和解包的實現(xiàn)

    在Python中,打包和解包參數(shù)是一種操作方式,可以將多個參數(shù)打包成一個元組或字典,也可以將一個元組或字典解包成多個參數(shù),本文就來介紹一下如何使用
    2023-09-09
  • PyTorch搭建LSTM實現(xiàn)多變量時序負荷預(yù)測

    PyTorch搭建LSTM實現(xiàn)多變量時序負荷預(yù)測

    這篇文章主要為大家介紹了PyTorch搭建LSTM實現(xiàn)多變量時間序列預(yù)測及負荷預(yù)測,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python寫的一個簡單DNS服務(wù)器實例

    Python寫的一個簡單DNS服務(wù)器實例

    這篇文章主要介紹了Python寫的一個簡單DNS服務(wù)器實例,需要的朋友可以參考下
    2014-06-06
  • PyQt5中QTableWidget如何彈出菜單的示例代碼

    PyQt5中QTableWidget如何彈出菜單的示例代碼

    這篇文章主要介紹了PyQt5中QTableWidget如何彈出菜單的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 如何利用Python快速統(tǒng)計文本的行數(shù)

    如何利用Python快速統(tǒng)計文本的行數(shù)

    這篇文章主要介紹了如何利用Python快速統(tǒng)計文本的行數(shù),要快速統(tǒng)計一個文本文件中的行數(shù),其實就是要統(tǒng)計這個文本文件中換行符的個數(shù),下面我們就一起進入文章看看具體的操作過程吧
    2021-12-12
  • Python實現(xiàn)數(shù)據(jù)地址實體抽取

    Python實現(xiàn)數(shù)據(jù)地址實體抽取

    大家好,本篇文章主要講的是Python實現(xiàn)數(shù)據(jù)地址實體抽取,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Python文件操作基礎(chǔ)流程解析

    Python文件操作基礎(chǔ)流程解析

    這篇文章主要介紹了Python文件操作基礎(chǔ)流程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 使用python3.5仿微軟記事本notepad

    使用python3.5仿微軟記事本notepad

    這篇文章主要為大家詳細介紹了使用python3.5仿微軟記事本notepad的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評論

汉阴县| 德安县| 板桥市| 邓州市| 余干县| 绵竹市| 榆社县| 九台市| 田东县| 赤峰市| 韶山市| 多伦县| 聊城市| 江川县| 繁峙县| 南宫市| 鹤壁市| 于田县| 化德县| 肃南| 东城区| 肇州县| 平乡县| 宽甸| 澄城县| 克拉玛依市| 小金县| 三台县| 柘荣县| 元氏县| 宜川县| 高安市| 广灵县| 新龙县| 东海县| 尼木县| 宜黄县| 融水| 樟树市| 彝良县| 镇平县|