Pergunta

Eu estou usando CDO da Microsoft (Collaboration Data Objects) para ler programaticamente mail de uma caixa de correio Outlook e salvar anexos de imagem embutidos. Eu estou tentando fazer isso a partir de Python usando as extensões Win32, mas amostras em qualquer linguagem que usa o CDO seria útil.

Até agora, eu estou aqui ...

O seguinte código Python irá ler o último e-mail na minha caixa de correio, imprimir os nomes dos anexos, e imprimir o corpo da mensagem:

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

No entanto, os nomes de anexos são coisas como: "zesjvqeqcb_chart_0". Dentro da fonte de e-mail, eu vejo imagem ligações de origem como este:

Assim, é possível usar este URL CID (ou qualquer outra coisa) para extrair a imagem real e salvá-lo localmente?

Foi útil?

Solução

Diferença em versões do OS / Outlook / CDO é o que poderia ser a fonte de confusão, por isso aqui estão os passos para fazê-lo funcionar no WinXP / Outlook 2007 / CDO 1.21:

  • CDO 1.21
  • instalar win32com.client
  • Goto C: \ Python25 \ lib \ site-packages \ win32com \ client \ diretório execute o seguinte:
python makepy.py
  • na lista selecione "Microsoft CDO 1.21 Library (1,21)", clique em OK
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
  • arquivo Examinando 3FA7DEA7-6438-101B-ACC1-00AA00423326x0x1x33.py que acabou de ser gerado, lhe dará uma idéia do que classes, métodos, propriedades e constantes estão disponíveis.

Agora que estamos a fazer com os passos chato, aqui é a parte divertida:

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

abordagem geral Same também irá funcionar se você tem a versão mais antiga do CDO (CDO para win2k)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top