我正在使用Microsoft的CDO(协作数据对象)以编程方式从Outlook邮箱中读取邮件并保存嵌入的图像附件.我正在尝试使用Win32扩展从Python执行此操作,但使用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 \目录运行以下命令:
python makepy.py
从列表中选择"Microsoft CDO 1.21 Library(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(win2k的CDO),同样的一般方法也会有效