python 使用 win32com 和/或 active_directory,如何按名称访问电子邮件文件夹?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2043980/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 23:38:56  来源:igfitidea点击:

Using win32com and/or active_directory, how can I access an email folder by name?

pythonactive-directoryoutlookwin32com

提问by Ross Rogers

In python w/ Outlook 2007, using win32com and/or active_directory, how can I get a reference to a sub-folder so that I may move a MailItem to this sub-folder?

在带有 Outlook 2007 的 python 中,使用 win32com 和/或 active_directory,如何获得对子文件夹的引用,以便可以将 MailItem 移动到该子文件夹?

I have an inbox structure like:

我有一个收件箱结构,如:

    Inbox
      |
      +-- test
      |
      `-- todo

I can access the inbox folder like:

我可以访问收件箱文件夹,如:

import win32com.client
import active_directory
session = win32com.client.gencache.EnsureDispatch("MAPI.session")
win32com.client.gencache.EnsureDispatch("Outlook.Application")
outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace('MAPI')
inbox =  mapi.GetDefaultFolder(win32com.client.constants.olFolderInbox)
print '\n'.join(dir(inbox))

But when I try to get subdirectory testper Microsoft's examplethe inboxobject doesn't have the Foldersinterface or any way to get a subdirectory.

但是当我尝试test按照Microsoft 的示例获取子目录时,该inbox对象没有Folders接口或任何获取子目录的方法。

How can I get a Folderobject which points to testsubdir?

如何获得Folder指向testsubdir的对象?

回答by Tony Tyrrell

I realize this is an old question but I've been using the win32com package recently and found the documentation troublesome to say the least...My hope is that someone, someday can be saved the turmoil I experienced trying to wrap my head around MSDN's explanation

我意识到这是一个老问题,但我最近一直在使用 win32com 包,发现文档至少可以说很麻烦......我希望有人,有一天可以挽救我试图围绕 MSDN 的头脑所经历的混乱解释

Here's and example of a python script to traverse through Outlook folders, accessing e-mails where I please.

这是一个 python 脚本的例子,它遍历 Outlook 文件夹,在我喜欢的地方访问电子邮件。

DisclaimerI shifted around the code and took out some sensitive info so if you're trying to copy and paste it and have it run, good luck.

免责声明我转移了代码并取出了一些敏感信息,所以如果你试图复制和粘贴它并让它运行,祝你好运。

import win32com
import win32com.client
import string
import os
# the findFolder function takes the folder you're looking for as folderName,
# and tries to find it with the MAPIFolder object searchIn

def findFolder(folderName,searchIn):
try:
    lowerAccount = searchIn.Folders
    for x in lowerAccount:
        if x.Name == folderName:
            print 'found it %s'%x.Name
            objective = x
            return objective
    return None
except Exception as error:
    print "Looks like we had an issue accessing the searchIn object"
    print (error)
    return None

def main():

outlook=win32com.client.Dispatch("Outlook.Application")

ons = outlook.GetNamespace("MAPI")

#this is the initial object you're accessing, IE if you want to access
#the account the Inbox belongs too
one = '<your account name here>@<your domain>.com'

#Retrieves a MAPIFolder object for your account 
#Object functions and properties defined by MSDN at 
#https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mapifolder_members(v=office.14).aspx
Folder1 = findFolder(one,ons)

#Now pass you're MAPIFolder object to the same function along with the folder you're searching for
Folder2 = findFolder('Inbox',Folder1)

#Rinse and repeat until you have an object for the folder you're interested in
Folder3 = findFolder(<your inbox subfolder>,Folder2)

#This call returns a list of mailItem objects refering to all of the mailitems(messages) in the specified MAPIFolder
messages = Folder3.Items

#Iterate through the messages contained within our subfolder
for xx in messages:
    try:
        #Treat xx as a singular object, you can print the body, sender, cc's and pretty much every aspect of an e-mail
       #In my case I was writing the body to .txt files to parse...
        print xx.Subject,xx.Sender,xx.Body
       #Using move you can move e-mails around programatically, make sure to pass it a 
        #MAPIFolder object as the destination, use findFolder() to get the object
        xx.Move(Folder3)


    except Exception as err:
        print "Error accessing mailItem"
        print err       


if __name__ == "__main__":
main()

PS Hope this doesn't do more harm than good.

PS希望这不会弊大于利。

回答by Ross Rogers

Something that did work for me was iterating over the folder names. ( When I posted this question, I couldn't figure out the folder names ).

对我有用的东西是迭代文件夹名称。(当我发布这个问题时,我无法弄清楚文件夹名称)。

import win32com.client
import active_directory
session = win32com.client.gencache.EnsureDispatch("MAPI.session")
win32com.client.gencache.EnsureDispatch("Outlook.Application")
outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace('MAPI')
inbox =  mapi.GetDefaultFolder(win32com.client.constants.olFolderInbox)

fldr_iterator = inbox.Folders   
desired_folder = None
while 1:
    f = fldr_iterator.GetNext()
    if not f: break
    if f.Name == 'test':
        print 'found "test" dir'
        desired_folder = f
        break

print desired_folder.Name

回答by Ryan Ginstrom

This works for me to move a mail item into a "test" subdirectory (simplified by getting rid of gencache stuff):

这对我来说可以将邮件项目移动到“测试”子目录中(通过摆脱 gencache 来简化):

import win32com.client

olFolderInbox = 6
olMailItem = 0

outlook = win32com.client.Dispatch("Outlook.Application")
mapi = outlook.GetNamespace('MAPI')
inbox =  mapi.GetDefaultFolder(olFolderInbox)

item = outlook.CreateItem(olMailItem)
item.Subject = "test"

test_folder = inbox.Folders("test")
item.Move(test_folder)

回答by Dayantat

So the below code will grab the "Last" item in the SOURCE folder and then move it to DEST folder. Sorry the code is a bit blunt I removed all additional features such as reading and saving the mail.

因此,下面的代码将抓取 SOURCE 文件夹中的“最后一个”项目,然后将其移动到 DEST 文件夹。抱歉,代码有点生硬,我删除了所有其他功能,例如阅读和保存邮件。

import win32com.client

inbox = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")


source = inbox.GetDefaultFolder(6).Folders["FOLDER_NAME_SOURCE"]
dest = inbox.GetDefaultFolder(6).Folders["FOLDER_NAME_DEST"]


def moveMail(message):
    print("moving mail to done folder")
    message.Move(dest)
    return print("MOVED")


def getMail():
    message = source.Items.GetLast()
    moveMail(message)


getMail()