python outlook exchange-server mapi cdo.message

Lectura de correos electrónicos desde Outlook con Python a través de MAPI



exchange-server cdo.message (4)

Creé mi propio iterador para iterar sobre los objetos de Outlook a través de python. El problema es que Python intenta iterar comenzando con Index [0], pero outlook espera para el primer elemento Index [1] ... Para hacerlo más simple de Ruby, hay debajo de una clase de ayuda Oli con los siguientes métodos:

.items () - produce una tupla (índice, artículo) ...

.prop () - ayuda a introspectar el objeto de Outlook exponiendo las propiedades disponibles (métodos y atributos)

from win32com.client import constants from win32com.client.gencache import EnsureDispatch as Dispatch outlook = Dispatch("Outlook.Application") mapi = outlook.GetNamespace("MAPI") class Oli(): def __init__(self, outlook_object): self._obj = outlook_object def items(self): array_size = self._obj.Count for item_index in xrange(1,array_size+1): yield (item_index, self._obj[item_index]) def prop(self): return sorted( self._obj._prop_map_get_.keys() ) for inx, folder in Oli(mapi.Folders).items(): # iterate all Outlook folders (top level) print "-"*70 print folder.Name for inx,subfolder in Oli(folder.Folders).items(): print "(%i)" % inx, subfolder.Name,"=> ", subfolder

Estoy tratando de escribir un programa corto que leerá los contenidos de los correos electrónicos dentro de una carpeta en mi intercambio / perfil de Outlook para poder manipular los datos. Sin embargo, tengo problemas para encontrar mucha información sobre python e intercambio / integración de Outlook. Muchas cosas son muy antiguas / no tienen documentos / no se explicaron. Intenté varios fragmentos pero parece que estoy obteniendo los mismos errores. He intentado con el código de Tim Golden:

import win32com.client session = win32com.client.gencache.EnsureDispatch ("MAPI.Session") # # Leave blank to be prompted for a session, or use # your own profile name if not "Outlook". It is also # possible to pull the default profile from the registry. # session.Logon ("Outlook") messages = session.Inbox.Messages # # Although the inbox_messages collection can be accessed # via getitem-style calls (inbox_messages[1] etc.) this # is the recommended approach from Microsoft since the # Inbox can mutate while you''re iterating. # message = messages.GetFirst () while message: print message.Subject message = messages.GetNext ()

Sin embargo, recibo un error:

pywintypes.com_error: (-2147221005, ''Invalid class string'', None, None)

No estoy seguro de cuál es mi nombre de perfil, así que lo intenté con:

session.Logon()

para que se le solicite pero tampoco funcionó (el mismo error). También probé con Outlook abierto y cerrado y ninguno cambió nada.


Perdón por mi mal ingles. Comprobar los correos que usan Python con MAPI es más fácil,

outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders[5] Subfldr = folder.Folders[5] messages_REACH = Subfldr.Items message = messages_REACH.GetFirst()

Aquí podemos obtener el primer correo en el buzón de correo o en cualquier subcarpeta. En realidad, necesitamos verificar el número y la orientación del buzón. Con la ayuda de este análisis, podemos verificar cada buzón y sus carpetas secundarias.

Del mismo modo, encuentre el código siguiente, donde podemos ver, los últimos / anteriores correos. Cómo tenemos que verificar

`outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") folder = outlook.Folders[5] Subfldr = folder.Folders[5] messages_REACH = Subfldr.Items message = messages_REACH.GetLast()`

Con esto podemos obtener el correo electrónico más reciente en el buzón. De acuerdo con el código mencionado anteriormente, podemos verificar todos nuestros buzones y sus subcarpetas.


Tuve el mismo problema que tú: no encontré mucho que funcionara. El siguiente código, sin embargo, funciona como un encanto.

import win32com.client outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) # "6" refers to the index of a folder - in this case, # the inbox. You can change that number to reference # any other folder messages = inbox.Items message = messages.GetLast() body_content = message.body print body_content


Tuve el mismo problema. La combinación de varios enfoques de Internet (y más arriba) ofrece el siguiente enfoque (checkEmails.py)

class CheckMailer: def __init__(self, filename="LOG1.txt", mailbox="Mailbox - Another User Mailbox", folderindex=3): self.f = FileWriter(filename) self.outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders(mailbox) self.inbox = self.outlook.Folders(folderindex) def check(self): #=============================================================================== # for i in xrange(1,100): #Uncomment this section if index 3 does not work for you # try: # self.inbox = self.outlook.Folders(i) # "6" refers to the index of inbox for Default User Mailbox # print "%i %s" % (i,self.inbox) # "3" refers to the index of inbox for Another user''s mailbox # except: # print "%i does not work"%i #=============================================================================== self.f.pl(time.strftime("%H:%M:%S")) tot = 0 messages = self.inbox.Items message = messages.GetFirst() while message: self.f.pl (message.Subject) message = messages.GetNext() tot += 1 self.f.pl("Total Messages found: %i" % tot) self.f.pl("-" * 80) self.f.flush() if __name__ == "__main__": mail = CheckMailer() for i in xrange(320): # this is 10.6 hours approximately mail.check() time.sleep(120.00)

Para la concurencia, también incluyo el código para la clase FileWriter (que se encuentra en FileWrapper.py). Lo necesitaba porque intentar conectar UTF8 a un archivo en Windows no funcionaba.

class FileWriter(object): '''''' convenient file wrapper for writing to files '''''' def __init__(self, filename): '''''' Constructor '''''' self.file = open(filename, "w") def pl(self, a_string): str_uni = a_string.encode(''utf-8'') self.file.write(str_uni) self.file.write("/n") def flush(self): self.file.flush()