Python優(yōu)雅的操作Exchange郵箱——exchangelib模塊使用介紹

最近想把公司郵箱的附件給下載下來(lái),附件好多都是我整理的報(bào)告和文檔,一個(gè)個(gè)去下載明顯太傻,碰到這種問(wèn)題第一個(gè)想到的就是Python啦

需求很簡(jiǎn)單,只需要登錄自己的Exchange郵箱,然后遍歷所有郵件,有附件的就下載下來(lái)。

可是最主要的一步卻難倒我了,連接Exchange郵箱比較麻煩,最后找到了exchangelib這個(gè)模塊。

這個(gè)模塊網(wǎng)上的教程不多,所以這里記錄下使用過(guò)程。

安裝exchangelib

exchangelib的github地址可以點(diǎn)擊這里,可通過(guò)PyPi直接進(jìn)行安裝:

pip3 install exchangelib

具體編碼

引入模塊

exchangelib模塊挺多的,其中Account, Credentials用來(lái)連接郵箱的,其他的根據(jù)你自身需求來(lái)吧,截圖是所有模塊:

截圖1

連接郵箱

登錄郵箱編碼還是比較簡(jiǎn)單的:

credentials = Credentials('域名\用戶名', '密碼')
account = Account('郵箱', credentials=credentials, autodiscover=True)

如果你想容錯(cuò),比如獲取大量郵件時(shí)可能會(huì)超時(shí)之類的,像我的需求需要下載大量附件時(shí),我們可以創(chuàng)建為服務(wù)賬戶:

credentials = ServiceAccount(username='域名\用戶名', password='密碼')
account = Account('郵箱', credentials=credentials, autodiscover=True)

發(fā)送郵件

雖然發(fā)送郵件和我的需求沒什么關(guān)系,但稍微試驗(yàn)看一下,還是很方便的,幾行代碼就搞定了。

m = Message(
        account=account,#之前申明的賬戶
        subject='#標(biāo)題',
        body='#郵件內(nèi)容',
        to_recipients = [Mailbox(email_address='#收件人')]
    )
m.send()

文件夾(Folders)

如果要查詢你的郵件,就要使用到文件夾這個(gè)概念,比如收件箱account.inbox,發(fā)件箱account.outbox,我們以收件箱為例,獲取收件箱的10條郵件并打印出來(lái):

for item in account.inbox.all().order_by('-datetime_received')[:100]:
    print(item.subject, item.sender, item.datetime_received)

如果你的收件箱下還有文件夾,可以使用children屬性:

for item in account.inbox.children:
    print('文件夾名稱:'+item.name)

針對(duì)郵件,exchangelib還提供了查詢篩選功能,比如官方的例子:

 filtered_items = my_folder.filter(subject__contains='foo').exclude(categories__icontains='bar')

但是我試驗(yàn)了一些,還是比較慢的,可能我的郵件比較多吧。

附件

exchangelib對(duì)于附件也有很好的支持,官方例子如下:

 for item in my_folder.all():
    for attachment in item.attachments:
        if isinstance(attachment, FileAttachment):
            local_path = os.path.join('/tmp', attachment.name)
            with open(local_path, 'wb') as f:
                f.write(attachment.content)
            print('Saved attachment to', local_path)
        elif isinstance(attachment, ItemAttachment):
            if isinstance(attachment.item, Message):
                print(attachment.item.subject, attachment.item.body)

我的需求

最后貼下我的需求,下載我的郵箱中指定文件夾下所有的附件:

credentials = ServiceAccount(username='域名\用戶名', password='密碼')
account = Account('郵箱', credentials=credentials, autodiscover=True)
print('1.郵箱連接成功')

for item in account.inbox.children:
    print('2.文件夾名稱:'+item.name)
    if item.name=='Reports':#只要Reports文件夾下的附件
        index=0
        totalcount=0
        page=0
        while True:          
            for model in item.all()[page:page+50]:
                index=index+1
                print(str(index)+'-開始:'+model.subject)
                for attachment in model.attachments:
                    if isinstance(attachment, FileAttachment):
                        with open('/Users/cavin/Desktop/files/' + attachment.name, 'wb') as f:
                            f.write(attachment.content)
            if totalcount==index:
                break
            page=page+50
            totalcount=index

總結(jié)

利用python來(lái)提高你的工作效率還是不錯(cuò)的,你的想到的組件基本上都有,幾行代碼輕松搞定,棒棒噠

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容