Extrahieren Eingebettete Bilder aus Outlook E-Mail
-
22-07-2019 - |
Frage
Ich bin mit Microsoft CDO (Collaboration Data Objects) programmatisch Mail von einem Outlook-Postfach lesen und eingebettete Bild-Anhänge speichern. Ich versuche, dies von Python zu tun, um die Win32-Erweiterungen verwenden, aber Proben in jeder Sprache, die CDO verwendet wäre hilfreich.
So weit, ich bin hier ...
Der folgende Python-Code wird die letzte E-Mail in meinem Postfach lesen, die Namen der Anhänge drucken, und den Nachrichtentext drucken:
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()
Allerdings sind die Anlagennamen Dinge wie: „zesjvqeqcb_chart_0“. Innerhalb der E-Mail-Quelle, sehe ich Bildquelle Links wie folgt aus:
So, ist es möglich, diese CID-URL zu verwenden (oder etwas anderes), um das aktuelle Bild zu extrahieren und lokal speichern?
Lösung
Unterschied in Versionen von OS / Outlook / CDO ist, was könnte die Quelle der Verwirrung sein, so sind hier die Schritte, die sie auf WinXP / Outlook 2007 / CDO 1.21 arbeiten zu bekommen:
- CDO 1.21
- installieren win32com.client
- gehe zu C: \ Python25 \ Lib \ site-packages \ win32com \ \ Verzeichnis Client den folgenden:
python makepy.py
- aus der Liste wählen Sie "Microsoft CDO 1.21 Library (1.21)", klicken Sie auf 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
- Datei 3FA7DEA7-6438-101B-ACC1-00AA00423326x0x1x33.py Untersuchen, die erzeugt gerade ist, wird Ihnen eine Vorstellung davon, was Klassen, Methoden, Eigenschaften und Konstanten zur Verfügung.
Jetzt, da wir mit den langweiligen Schritte erfolgt sind, hier ist der spaßige Teil:
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()
Die gleiche allgemeiner Ansatz wird auch funktionieren, wenn Sie ältere Version von CDO (CDO für win2k) haben