【问题标题】:Adding an image to an Outlook MailItem via Python通过 Python 将图像添加到 Outlook MailItem
【发布时间】:2021-04-21 16:15:36
【问题描述】:

我的目标是使用 Python 将图像(来自本地 .png 文件)添加到 Outlook MailItem。

我已经阅读了关于 SO(主要使用 VBA)的类似问题的答案,但我遇到的问题是邮件在发送之前看起来很好(我可以看到图像)(以及当我查看我的已发送邮件文件夹时) ),但是当在另一端接收时,图像就坏了。

如果我在邮件中手动插入图像(使用 Outlook 菜单中的“插入/图片/来自此设备”),电子邮件会正常到达,并显示图像。

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

import win32com.client as wc

def main():
    outlook = wc.Dispatch("Outlook.Application")

    #Create a new mail item
    msg = outlook.CreateItem(0)

    #Set some properties
    msg.BodyFormat = 2
    msg.Subject = 'Here is my chart'
    msg.Recipients.Add('xxx@yyy.com')
    
    #Add an attachment, with position 0
    imageFile = 'C:\\Temp\\myplot.png'
    ats = msg.Attachments
    att = ats.Add(imageFile,1,0)
    
    #Set the HTMLBody
    msg.HTMLBody = '<img src="cid:{0:}" width=200 height=200>'.format(att.FileName)

    #Send
    msg.Send()

main()

这是我在“已发送邮件”文件夹中看到的内容:

我发送的项目中的 HTML(使用查看源代码)是这样的:

<img src="cid:myplot.png" width=200 height=200>

但这就是结果:

目标正文中的 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”标签(这与已发送邮件文件夹中的内容相匹配):

<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">

我将不胜感激任何对此的见解! (遗憾的是,Outlook 不允许我录制宏来查看手动过程在做什么)。我见过一个示例(来自 C#),其中在 MailItem 上使用 SetProperty() 方法来添加不在 Outlook 对象模型中的其他项目(模式、上下文 id)以及新创建的 Guid,但这真的是有必要吗?

使用 Microsoft 365、Outlook 版本 2105、Beta 通道

【问题讨论】:

    标签: python email outlook


    【解决方案1】:

    创建一个附件并使用Attachment.PropertyAccessor.SetProperty 设置PR_ATTACH_CONTENT_ID 属性(DASL 名称"http://schemas.microsoft.com/mapi/proptag/0x3712001F")。

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

    img src="cid:xyz"
    

    其中 xyz 是 PR_ATTACH_CONTENT_ID 属性的值。

    使用OutlookSpy(我是其作者)查看现有消息 - 单击 IMessage 按钮。

    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>";
    

    【讨论】:

    • 这很有魅力,迪米特里。非常感谢。这似乎是一种常见的活动,我想知道为什么 MS 不通过 Outlook 对象模型公开 MAPI 属性?
    猜你喜欢
    • 2011-05-10
    • 2016-12-19
    • 1970-01-01
    • 2011-12-28
    • 2018-01-31
    • 2012-08-27
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    相关资源
    最近更新 更多