it-swarm.com.de

Lesen von E-Mails aus Outlook mit Python über MAPI

Ich versuche, ein kurzes Programm zu schreiben, das den Inhalt von E-Mails in einem Ordner in meinem Exchange/Outlook-Profil einliest, damit ich die Daten bearbeiten kann. Ich habe jedoch Probleme, viele Informationen über Python und Exchange/Outlook-Integration zu finden. Viele Sachen sind entweder sehr alt/haben keine Dokumente/nicht erklärt. Ich habe mehrere Snippets ausprobiert, aber scheinbar die gleichen Fehler erhalten. Ich habe den Code von Tim Golden ausprobiert:

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 ()

Ich bekomme jedoch einen Fehler:

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

Nicht sicher, wie mein Profilname ist, also habe ich es versucht:

session.Logon()

aufgefordert werden, aber das hat auch nicht funktioniert (gleicher Fehler). Auch habe sowohl mit Outlook als auch mit Open versucht und auch nichts verändert.

36
johnharris85

Ich hatte das gleiche Problem wie du - ich habe nicht viel gefunden, was funktioniert. Der folgende Code funktioniert jedoch wie ein Zauber.

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
56
Bobby

Ich habe einen eigenen Iterator erstellt, um Outlook-Objekte über Python zu iterieren. Das Problem ist, dass Python versucht, mit Index [0] zu beginnen, aber Outlook erwartet für den ersten Eintrag Index [1] ... Um es einfacher zu machen, ist eine Hilfsklasse Oli mit folgenden. 

.items () - ergibt einen Tuple (Index, Item) ... 

. prop () - hilft bei der Introspektion von Outlook-Objekten, die verfügbare Eigenschaften (Methoden und Attribute) verfügbar machen

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
12
Martin Stancik

Entschuldigung für mein schlechtes Englisch. Das Überprüfen von Mails mit Python mitMAPIist einfacher 

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

Hier können wir die erste Mail in die Mailbox oder in einen beliebigen Unterordner bringen. Eigentlich müssen wir die Postfachnummer und -ausrichtung überprüfen. Mit Hilfe dieser Analyse können wir jedes Postfach und seine untergeordneten Postfachordner überprüfen. 

Ebenso finden Sie unten den Code, wo wir die letzten/früheren Mails sehen können. Wie müssen wir überprüfen? 

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

Damit können wir die aktuellsten E-Mails in die Mailbox bekommen. Nach dem oben genannten Code können wir alle Postfächer und ihre Unterordner überprüfen.

3
Ozzius

Ich hatte das gleiche Problem. Die Kombination verschiedener Ansätze aus dem Internet (und darüber) ergibt folgenden Ansatz (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 __== "__main__":
    mail = CheckMailer()
    for i in xrange(320):  # this is 10.6 hours approximately
            mail.check()
            time.sleep(120.00)

Der Vollständigkeit halber gebe ich auch den Code für die FileWriter-Klasse ein (in FileWrapper.py zu finden). Ich brauchte das, weil Versuchte, UTF8 in eine Datei in Windows zu leiten, nicht funktionierte.

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()
1
raptisth