Извлечение встроенных изображений из электронной почты Outlook - PullRequest
4 голосов
/ 13 января 2009

Я использую Microsoft CDO (Collaboration Data Objects) для программного чтения почты из почтового ящика 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". Внутри источника электронной почты я вижу ссылки на источники изображений, например: image

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

1 Ответ

5 голосов
/ 13 января 2009

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

  • установка CDO 1,21
  • установить win32com.client
  • Перейдите в каталог C: \ Python25 \ Lib \ site-packages \ win32com \ client \ и выполните следующую команду:
python makepy.py
  • из списка выберите «Библиотека Microsoft CDO 1.21 (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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...