Extraindo imagens incorporadas a partir do Outlook Email
-
22-07-2019 - |
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?
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)