2011-02-22 46 views
31

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 código de Tim Oro:Leyendo correos electrónicos desde Outlook con Python a través de MAPI

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, me sale un error:

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

No estoy seguro que mi nombre de perfil es lo que he intentado con:

session.Logon() 

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

+1

¿Ha considerado utilizar IMAP contra el servidor en lugar de depender de un cliente de Outlook? Dependiendo de su caso de uso, IMAP puede resultar viable y mucho más portátil (tanto clientes como servidores). –

+1

@Jason IMAP se ve bien, pero desafortunadamente no está habilitado en la cuenta que estoy usando. – johnharris85

Respuesta

42

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 
+2

¿Hay alguna manera de ver los otros atributos del mensaje? Me gustaría utilizar su ejemplo para obtener la fecha y la hora en que se recibió el mensaje. – sequoia

+4

encontró la solución: 'message.CreationTime' por alguna razón los atributos no aparecen cuando uso dir() – sequoia

+5

@sequoia - Usando la lista de Microsoft de propiedades COM para MailItems (por ejemplo: mensajes de Outlook) es como encontré todo el propiedades del mensaje (message.SenderEmailAddress, por ejemplo): http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mailitem_properties.aspx – wardw123

8

He creado 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 ítem Index [1] ... Para hacerlo más simple de Ruby, hay debajo de una clase auxiliar Oli con los siguientes métodos :

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

.prop() - ayudar a la introspección de objetos de Outlook exponer 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 
0

que tenía el mismo problema La combinación de varios enfoques de la Internet (y superior) vienen con el enfoque siguiente (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 concistency incluyo también el código de la clase FileWriter (que se encuentra en FileWrapper.py). Lo necesitaba porque tratando de canalizar 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()  

Enjoy.

1

Lo siento por mi mal inglés. Comprobación de correos utilizando 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 sacar el máximo primer correo en la caja de correo, o en cualquier subcarpeta. De hecho, debemos verificar la orientación del número de buzón &. Con la ayuda de este análisis podemos verificar cada casilla de correo & sus carpetas de sub-buzones.

De manera similar, encuentre el código a continuación, 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 conseguir el correo electrónico más reciente en el buzón. De acuerdo con el código mencionado anteriormente, podemos consultar todos nuestros buzones, & sus subcarpetas.

Cuestiones relacionadas