2013-08-05 26 views
0

我打出一個導出Outlook消息爲.msg文件的路障。我不確定如何完成這項任務。我有一個程序,當前正在讀取電子郵件並導出附件,一旦完成,它會將消息移至已處理的文件夾,以便我可以跟蹤已完成的內容。我需要添加一個將整個電子郵件本身導出到本地計算機上的文件夾的功能。有沒有人用pywin32.client完成這個工作?Python:使用pywin32.client將消息導出爲.msg

這是現在的程序。 (藉口亂其仍在進行中)

import os 
import win32com.client 
import csv 
import datetime 
from random import randint 

ATTACHMENTS_FOLDER = "C:\\EMAILS" 
LOG_PATH = 'C:\\EMAILS\\log.csv' 
COUNTER = 1 
SUBFOLDER_LIST = ["TEST"] 
UPLOAD_LIST = 'C:\\EMAILS\\logupload%d.csv' % randint(2,150000) 


def ExportMessages (Folder, item): 
    #No IDEA! 
    pass 

def process_attachment(sender, subject, attachment, messagedate): 
    """ 
    :param sender: 
    :param subject: 
    :param attachment: 
    :param messagedate: 
    """ 
    global count 
    count = 0 
    try: 
    filepath = os.path.join(ATTACHMENTS_FOLDER, "RAN-%dSEN-%sSUB-%s%s" % (randint(2,100000),str(sender), str(subject), attachment)) 
    count = count +1 
    print "Trying", filepath 
    open(filepath, "r") 
    os.remove(filepath) 
    except IOError: 
    pass 

    try: 
    attachment.SaveAsFile(filepath) 
    row = [messagedate, sender, subject, count] 
    row2 = [messagedate, sender, subject, filepath] 
    w = csv.writer(csv_file) 
    w2 = csv.writer(csv_file2) 
    w.writerow(row) 
    w2.writerow(row2) 
    except: 
    pass 

def move_message_fail(message, folder): 
    """ 
    :param message: 
    :param folder: 
    """ 
    print "Moving:", message.Subject 
    proc_folder = folder.Folders("Failed") 
    message.Move(proc_folder) 

def move_message(folder, message): 
    """ 
    :param folder: 
    :param message: 
    """ 
    print "Moving:", message.Subject 
    proc_folder = folder.Folders("Processed") 
    message.Move(proc_folder) 

def process_message(message, folder): 
    """ 
    :param message: 
    :param folder: 
    """ 
    global vin_num 
    vin_num = '' 
    print "Message:", message.Subject 
    vin = message.Subject 
    sender = message.SenderName 
    if folder == SUBFOLDER_LIST[0]: 
    for i in vin.split(' '): 
     if '-' in i: 
      vin_num = i 
    if vin_num: 
     now = datetime.datetime.now() 
     messagedate = now.strftime("%m-%d-%Y") 
     attachments = message.Attachments 
     for n_attachment in range(attachments.Count): 
      attachment = attachments.Item(n_attachment + 1) 
      #if attachment.Type == win32com.client.constants.CdoFileData: 
      process_attachment(sender, vin_num, attachment, messagedate) 
      #message.Update() 
      move_message(folder, message, up_folder) 
    else: 
     move_message_fail(message, folder) 
    else: 
    vin_num = vin.split(' ')[1] 
    now = datetime.datetime.now() 
    messagedate = now.strftime("%m-%d-%Y") 
    attachments = message.Attachments 
    for n_attachment in range(attachments.Count): 
     attachment = attachments.Item(n_attachment + 1) 
     #if attachment.Type == win32com.client.constants.CdoFileData: 
     process_attachment(sender, vin_num, attachment, messagedate) 
     #message.Update() 
     move_message(folder, message, up_folder) 



if __name__ == '__main__': 
    csv_file = open(LOG_PATH, "ab") 
    csv_file2 = open(UPLOAD_LIST, "wb") 
    for i in SUBFOLDER_LIST: 
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") 
    one_folder = outlook.Folders(1) 
    two_folder = one_folder.Folders("Inbox") 
    three_folder = two_folder.Folders(i) 
    messages = three_folder.Items 
    message = messages.GetFirst() 
    while message: 
     process_message(message, i) 
     ExportMessages(three_folder, message) 
     message = messages.GetNext() 
+0

我有3個Outlook配置文件(3個不同的電子郵件帳戶)設置。那麼如何選擇使用哪個配置文件(帳戶)的收件箱? – user5155835

回答

3

呼叫MailItem.SaveAs並通過olMsg或olMsgUnicode作爲第二(格式)參數。

+0

完美運作。謝謝! – thedemon

+0

任何想法如何讀取保存的.msg文件? – van

+0

您可以使用Application.CreateItemFromTemplate,但請記住Outlook使用現有的MSG文件作爲模板創建一個新項目,因此不會複製所有屬性。您可以使用Redemption及其RDOSession.GetMessageFrommsgFile(http://www.dimastr.com/redemption/rdosession.htm)直接打開MSG文件。 –

相關問題