Извлечение встроенных изображений из электронной почты Outlook

Я использую Microsoft CDO (объекты данных совместной работы) для программного чтения почты из почтового ящика Outlook и сохранения вложенных изображений. Я пытаюсь сделать это из Python, используя расширения Win32, но примеры на любом языке, использующем CDO, были бы полезны.

Пока я здесь ...

Следующий код Python прочитает последнее электронное письмо в моем почтовом ящике, распечатает имена вложений и распечатает тело сообщения:

from win32com.client import Dispatch

session = Dispatch('MAPI.session')
session.Logon('','',0,1,0,0,'exchange.foo.com\nbar');
inbox = session.Inbox
message = inbox.Messages.Item(inbox.Messages.Count)

for attachment in message.Attachments:
    print attachment

print message.Text

session.Logoff()

Однако имена вложений выглядят примерно так: «zesjvqeqcb_chart_0». Внутри источника электронной почты я вижу следующие ссылки на источники изображений: ‹IMG src =" cid: zesjvqeqcb_chart_0 "›

Итак, можно ли использовать этот URL-адрес CID (или что-то еще) для извлечения фактического изображения и сохранения его локально?


person Corey Goldberg    schedule 13.01.2009    source источник


Ответы (1)


Разница в версиях OS / Outlook / CDO может быть источником путаницы, поэтому вот шаги, чтобы заставить его работать в WinXP / Outlook 2007 / CDO 1.21:

  • установить CDO 1.21
  • установить win32com.client
  • goto C: \ Python25 \ Lib \ site-packages \ win32com \ client \ directory запустите следующее:
python makepy.py
  • из списка выберите «Microsoft CDO 1.21 Library (1.21)», нажмите ОК
C:\Python25\Lib\site-packages\win32com\client>python makepy.py
Generating to C:\Python25\lib\site-packages\win32com\gen_py\3FA7DEA7-6438-101B-ACC1-00AA00423326x0x1x33.py
Building definitions from type library...
Generating...
Importing module
  • Изучение только что сгенерированного файла 3FA7DEA7-6438-101B-ACC1-00AA00423326x0x1x33.py даст вам представление о том, какие классы, методы, свойства и константы доступны.

Теперь, когда мы сделали скучные шаги, самое интересное:

import win32com.client
from win32com.client import Dispatch

session = Dispatch('MAPI.session')
session.Logon ('Outlook') # this is profile name
inbox = session.Inbox
messages = session.Inbox.Messages 
message = inbox.Messages.GetFirst()

if(message):
    attachments = message.Attachments
    for i in range(attachments.Count):
        attachment = attachments.Item(i + 1) # yep, indexes are 1 based

        filename = "c:\\tmpfile" + str(i)
        attachment.WriteToFile(FileName=filename)
session.Logoff()

Такой же общий подход также будет работать, если у вас более старая версия CDO (CDO для win2k)

person Sergey Golovchenko    schedule 13.01.2009
comment
Я пробую те, что указаны в приведенном выше коде, и это не работает. Я не вижу этого метода и свойства в моем объекте вложения. идеи? - person Corey Goldberg; 14.01.2009
comment
в приведенном выше коде я все еще получаю AttributeError: ‹unknown› .GetDecodedContentStream при попытке вызвать этот метод. Он также не может видеть свойство FileName. Любой совет о том, как использовать этот интерфейс из моего кода Python выше? - person Corey Goldberg; 14.01.2009
comment
более подробный, полностью переработанный ответ - надеюсь, это поможет - person Sergey Golovchenko; 15.01.2009