我正在使用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”。在电子邮件源中,我看到如下图像源链接:

那么,是否可以使用这个cid url(或其他任何东西)来提取实际的图像并将其保存在本地?

最佳答案

os/outlook/cdo版本的不同可能是造成混淆的原因,下面是使其在winxp/outlook 2007/cdo 1.21上工作的步骤:
安装CDO 1.21
安装win32com.client
转到C:\python25\lib\site packages\win32com\client\directory运行以下命令:

python makepy.py
  • from the list select "Microsoft CDO 1.21 Library (1.21)", click 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
  • Examining file 3FA7DEA7-6438-101B-ACC1-00AA00423326x0x1x33.py that's just been generated, will give you an idea of what classes, methods, properties and constants are available.

Now that we are done with the boring steps, here is the fun part:

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为Wi2K),同样的通用方法也会起作用。

09-26 13:42