通过Python向Outlook邮件项添加图像

通过Python向Outlook邮件项添加图像,python,email,outlook,Python,Email,Outlook,我的目标是使用Python将图像(来自local.png文件)添加到Outlook邮件项中 我在SO上读过类似问题的答案(大部分使用VBA),但问题是在发送邮件之前(以及在“已发送邮件”文件夹中查看邮件时),邮件看起来很好(我可以看到图像),但在另一端收到邮件时,图像会被破坏 如果我在邮件中手动插入图像(使用Outlook菜单中的insert/Picture/从此设备),电子邮件将正常送达,并显示图像 以下是我正在使用的基本代码(主要基于VBA示例): 将win32com.client作为wc导

我的目标是使用Python将图像(来自local.png文件)添加到Outlook邮件项中

我在SO上读过类似问题的答案(大部分使用VBA),但问题是在发送邮件之前(以及在“已发送邮件”文件夹中查看邮件时),邮件看起来很好(我可以看到图像),但在另一端收到邮件时,图像会被破坏

如果我在邮件中手动插入图像(使用Outlook菜单中的insert/Picture/从此设备),电子邮件将正常送达,并显示图像

以下是我正在使用的基本代码(主要基于VBA示例):

将win32com.client作为wc导入
def main():
outlook=wc.Dispatch(“outlook.Application”)
#创建新邮件项目
msg=outlook.CreateItem(0)
#设置一些属性
msg.BodyFormat=2
msg.Subject='这是我的图表'
msg.Recipients.Add('xxx@yyy.com')
#添加位置为0的附件
图像文件='C:\\Temp\\myplot.png'
ats=消息附件
att=ats.Add(图像文件,1,0)
#设置HTMLBody
msg.HTMLBody=''.format(att.FileName)
#发送
msg.Send()
main()
这是我在“已发送邮件”文件夹中看到的内容:

<img width="614" height="461" style="width:6.3958in;height:4.802in" id="Picture_x0020_1" src="cid:image001.png@01D736CD.72206440" alt="Chart, line chart Description automatically generated">

我发送的项目(使用查看源)中的HTML如下:


但这就是我们的目标:

目标正文中的HTML如下所示:

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<img src="cid:AD1B7014D243624CA83F873A11053F18@GBRP123.PROD.OUTLOOK.COM" width="200" height="200">
</body>
</html>

当我手动插入图像时,收到的HTML要长得多(因此我不会在这里全部包含),但“img”标记在这里(这与Sent Items文件夹中的内容相匹配):


我将非常感谢任何关于这方面的见解!(遗憾的是Outlook不允许我录制宏以查看手动过程正在执行的操作)。我看过一个例子(来自C#),其中在MailItem上使用SetProperty()方法添加Outlook对象模型中没有的其他项目(架构、上下文id)以及新创建的Guid,但这真的是必要的吗


使用Microsoft 365、Outlook版本2105、Beta频道创建附件并设置
PR\u ATTACH\u CONTENT\u ID
属性(DASL名称
)http://schemas.microsoft.com/mapi/proptag/0x3712001F“
)使用
附件.PropertyAccessor.SetProperty

然后,您的HTML正文(
MailItem.HTMLBody
property)需要通过cid引用该图像附件:

img src="cid:xyz"
其中xyz是
PR\u ATTACH\u CONTENT\u ID
属性的值

使用查看现有邮件(单击IMessage按钮)

attachment=mailitem.Attachments.Add(“c:\temp\MyPicture.jpg”);
附件.PropertyAccessor.SetProperty(“http://schemas.microsoft.com/mapi/proptag/0x3712001F“,“MyId1”);
mailitem.HTMLBody=“测试图像”;

这很有魅力,迪米特里。非常感谢。这似乎是一个非常常见的活动,我想知道为什么MS不通过Outlook对象模型公开MAPI属性?
<img width="614" height="461" style="width:6.3958in;height:4.802in" id="Picture_x0020_1" src="cid:image001.png@01D736CD.72206440" alt="Chart, line chart Description automatically generated">
img src="cid:xyz"
attachment = mailitem.Attachments.Add("c:\temp\MyPicture.jpg");
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId1");
mailitem.HTMLBody = "<html><body>Test image <img src=""cid:MyId1""></body></html>";