寫了個小程式,來幫我把 outlook 寄件備份跟已刪除郵件的資料夾裡超過30天的郵件刪除掉。
主要使用python跟pywin32,雖然程式很短,但花了不少時間摸索。
首先是對 Office Outlook 的物件模型不了解,我參考了不少網路上的範例(例如:MG: Python for Windows)以及微軟提供的參考才摸索出來。
另外就是對時間的處理,OLE的日期時間跟python的日期時間不一樣,我參考了Converting OLE datetime values into Python datetime objects來作。
最後就是意外發現了 pywin32 有提供 makepy.py 這個工具,可以預先根據 COM Type Library 產生 code 出來,這就很類似 .Net framework 提供的 tlbimp。
#!/usr/bin/env python # -*- coding: utf-8 -*- import os, sys import win32com.client from datetime import datetime from datetime import timedelta import pywintypes # Microsoft Outlook Constants # http://msdn.microsoft.com/en-us/library/aa219371(office.11).aspx olFolderDeletedItems=3 olFolderSentMail=5 # or you can use the following command to generate # c:\python26\python.exe c:\Python26\lib\site-packages\win32com\client\makepy.py -d # After generated, you can use win32com.client.constants.olFolderSentMail # http://code.activestate.com/recipes/496683-converting-ole-datetime-values-into-python-datetim/ OLE_TIME_ZERO = datetime(1899, 12, 30, 0, 0, 0) def ole2datetime(oledt): return OLE_TIME_ZERO + timedelta(days=float(oledt)) if __name__ == '__main__': app = win32com.client.Dispatch( "Outlook.Application" ) ns = app.GetNamespace( "MAPI" ) folders = [ ns.GetDefaultFolder(olFolderSentMail), ns.GetDefaultFolder(olFolderDeletedItems) ] for folder in folders: print( "Processing %s" % folder.Name ) past30days=datetime.now()-timedelta(days=30) mark2delete=[] #If you use makepy.py, you have to use the following codes instead of "for item in folder.Items" #for i in range(1,folder.Items.Count+1): # item = folder.Items[i] for item in folder.Items: if ole2datetime(item.LastModificationTime)<past30days: mark2delete.append( item ) if len(mark2delete)>0: for item in mark2delete: print( "Removing %s" % item.Subject ) item.Delete() else: print("No matched mails.")