最近想把公司郵箱的附件給下載下來祈惶,附件好多都是我整理的報(bào)告和文檔钱贯,一個(gè)個(gè)去下載明顯太傻,碰到這種問題第一個(gè)想到的就是Python啦
需求很簡單,只需要登錄自己的Exchange郵箱线召,然后遍歷所有郵件,有附件的就下載下來多矮。
可是最主要的一步卻難倒我了缓淹,連接Exchange郵箱比較麻煩,最后找到了exchangelib
這個(gè)模塊塔逃。
這個(gè)模塊網(wǎng)上的教程不多讯壶,所以這里記錄下使用過程。
安裝exchangelib
exchangelib的github地址可以點(diǎn)擊這里湾盗,可通過PyPi直接進(jìn)行安裝:
pip3 install exchangelib
具體編碼
引入模塊
exchangelib
模塊挺多的伏蚊,其中Account
, Credentials
用來連接郵箱的,其他的根據(jù)你自身需求來吧格粪,截圖是所有模塊:
連接郵箱
登錄郵箱編碼還是比較簡單的:
credentials = Credentials('域名\用戶名', '密碼')
account = Account('郵箱', credentials=credentials, autodiscover=True)
如果你想容錯(cuò)躏吊,比如獲取大量郵件時(shí)可能會超時(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條郵件并打印出來:
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)
針對郵件李剖,exchangelib
還提供了查詢篩選功能,比如官方的例子:
filtered_items = my_folder.filter(subject__contains='foo').exclude(categories__icontains='bar')
但是我試驗(yàn)了一些囤耳,還是比較慢的篙顺,可能我的郵件比較多吧。
附件
exchangelib
對于附件也有很好的支持充择,官方例子如下:
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來提高你的工作效率還是不錯(cuò)的,你的想到的組件基本上都有椎麦,幾行代碼輕松搞定宰僧,棒棒噠