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
Using win32com and/or active_directory, how can I access an email folder by name?
提问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 test
per Microsoft's examplethe inbox
object doesn't have the Folders
interface or any way to get a subdirectory.
但是当我尝试test
按照Microsoft 的示例获取子目录时,该inbox
对象没有Folders
接口或任何获取子目录的方法。
How can I get a Folder
object which points to test
subdir?
如何获得Folder
指向test
subdir的对象?
回答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()