Чтение электронной почты из Outlook с Python через MAPI - PullRequest
40 голосов
/ 22 февраля 2011

Я пытаюсь написать короткую программу, которая будет читать содержимое электронных писем в папке в моем профиле exchange / Outlook, чтобы я мог манипулировать данными. Однако у меня проблемы с поиском большого количества информации о Python и интеграции Exchange / Outlook. Многие вещи либо очень старые / не имеют документов / не объяснены. Я пробовал несколько фрагментов, но, похоже, получаю те же ошибки. Я пробовал код Тима Голдена:

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

Однако я получаю сообщение об ошибке:

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

Не уверен, какое имя у моего профиля, поэтому я попытался:

session.Logon()

, чтобы получить запрос, но это тоже не сработало (та же ошибка). Также пробовал оба с открытым и закрытым Outlook и ничего не изменил.

Ответы [ 4 ]

62 голосов
/ 09 апреля 2013

У меня была та же проблема, что и у вас, - я не нашел много работающего.Следующий код, однако, работает как брелок.

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
13 голосов
/ 07 апреля 2014

Я создал свой собственный итератор для перебора объектов Outlook через python.Проблема в том, что python пытается выполнять итерации, начиная с Index [0], но outlook ожидает для первого элемента Index [1] ... Чтобы упростить Ruby, ниже есть вспомогательный класс Oli со следующими методами:

.items () - возвращает кортеж (index, Item) ...

.prop () - помогает анализировать объект внешнего вида, предоставляя доступные свойства (методы и атрибуты)

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
4 голосов
/ 03 июля 2017

Извините за мой плохой английский.Проверять почту с помощью Python с MAPI проще,

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

Здесь мы можем получить самое первое письмо в почтовый ящик или в любую подпапку.На самом деле, нам нужно проверить номер почтового ящика и ориентацию.С помощью этого анализа мы можем проверить каждый почтовый ящик и его вложенные папки.

Аналогичным образом, пожалуйста, найдите нижеприведенный код, где мы можем видеть последние / более ранние письма.Как нам нужно проверить.

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

С этим мы можем получить самую последнюю электронную почту в почтовый ящик.Согласно приведенному выше коду, мы можем проверить все наши почтовые ящики и их подпапки.

2 голосов
/ 08 августа 2014

У меня была такая же проблема. Объединяя различные подходы из Интернета (и выше), придумайте следующий подход (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)

Для согласованности я также включил код для класса FileWriter (находится в FileWrapper.py). Мне это нужно, потому что попытка передать UTF8 в файл в Windows не сработала.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...