如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件
Posted
技术标签:
【中文标题】如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件【英文标题】:How to send HTML format email with emebbed images(not attachment ) using Outlook 2010(no smtp) and python 【发布时间】:2013-08-08 17:12:31 【问题描述】:如下图,目前我已经实现了使用Outlook 2010和python发送html格式的邮件
def send_mail_via_com(self):
o = win32com.client.Dispatch("Outlook.Application")
Msg = o.CreateItem(0)
Msg.To = self.myEmailAddress
Msg.BCC = self.myEmailAddress
Msg.Subject = 'This is Subject'
Msg.HTMLBody = htmlEmailContent
Msg.Send()
接下来,我想在 HTML 格式的电子邮件中显示一些嵌入图像,我检查了 HTML 源代码,如下所示:
<img border=0 width=117 height=20 id="Picture_x0020_2" src="cid:image001.png@01CE9386.AB9B5E70" >
我尝试附加图像文件(使用上述 html 代码中引用的相同名称作为附件),但它只是附件,不会作为嵌入图像显示在文本正文中。 我们的邮件服务器不支持 SMTP 协议,所以我不能像 Sending Multipart html emails which contain embedded images 那样使用 smtplib。有人可以帮帮我吗?提前致谢!
attachment1 = "G:\\image001.png"
Msg.Attachments.Add(attachment1)
2013/8/8 更新,我通过http://social.msdn.microsoft.com/Forums/vstudio/en-US/6c063b27-7e8a-4963-ad5f-ce7e5ffb2c64/how-to-embed-image-in-html-body-in-c-into-outlook-mail 获得了 C# 版本代码,谁能告诉我这些的 Python 对应代码:
Attachment attachment = newMail.Attachments.Add(
@"E:\Pictures\image001.jpg"
, OlAttachmentType.olEmbeddeditem
, null
, "Some image display name"
);
string imageCid = "image001.jpg@123";
attachment.PropertyAccessor.SetProperty(
"http://schemas.microsoft.com/mapi/proptag/0x3712001E"
, imageCid
);
newMail.HTMLBody = String.Format(
"<body><img src=\"cid:0\"></body>"
, imageCid
);
【问题讨论】:
【参考方案1】:在 python 中,您必须在属性 PR_ATTACH_CONTENT_ID_W 之前定义,因为它没有在 pywin32 mapitags (win32com.mapi.mapitags) 中定义
from win32com.mapi.mapitags import PROP_TAG, PT_UNICODE
# defines the property PR_ATTACH_CONTENT_ID_W not defined in pywin32 mapitags.
# number of PR_ATTACH_CONTENT_ID_W Property is in MSDN Library
# https://msdn.microsoft.com/en-us/library/cc765868.aspx
# all mapi tags are defined in https://msdn.microsoft.com/en-us/library/cc815492%28v=office.15%29.aspx
mapitags.PR_ATTACH_CONTENT_ID_W = PROP_TAG(PT_UNICODE, 0x3712)
# now you can use the property PR_ATTACH_CONTENT_ID_W like Dmitry explained you.
【讨论】:
【参考方案2】:import win32com.client
o = win32com.client.Dispatch("Outlook.Application")
newMail = o.CreateItem(0)
attachment = newMail.Attachments.Add("E:\Pictures\image001.jpg", win32com.client.constants.olEmbeddeditem, 0, "Some image display name")
imageCid = "image001.jpg@123"
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E", imageCid)
newMail.HTMLBody = "<body><img src=\"cid:0\"></body>".format(imageCid)
msg.Send()
https://msdn.microsoft.com/en-us/library/office/ff869553(v=office.15).aspx
【讨论】:
【参考方案3】:制作一个 HTML 页面,包含您的文本内容和 CSS
获取您要发送的嵌入电子邮件的图像
使用 Base64 编码器将二进制照片转换为巨大的文本字符串 (如:http://www.greywyvern.com/code/php/binary2base64)
用该字符串替换您的正常图像源
保存文件并正常发送
【讨论】:
感谢您的信息,我试过但失败了,看来outlook不支持Base64编码的图像,而我将电子邮件内容保存为.html并在IE中打开它,图像显示非常嗯…… Outlook 使用 Word 呈现内嵌图像,它不支持嵌入图像。您需要在附件上设置 PR_ATTACH_CONTENT_ID 属性以匹配 img 标记上的 cid 属性。参见例如***.com/questions/16968356/vml-base64-image/… 谢谢 Dmitry,我无法访问您给的帖子中提到的 msdn 网络,但我猜从 PR_ATTACH_CONTENT_ID 属性,它应该是 C# 中的用法,对吧?那么知道它的python版本吗?谢谢以上是关于如何使用 Outlook 2010(无 smtp)和 python 发送带有嵌入图像(不是附件)的 HTML 格式电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SMTP 发送邮件并在 Outlook 发件箱中查看邮件?
EXCHANGE设置了SMTP不允许匿名访问之后OUTLOOK收不到邮件!如何实现不允许匿名访问后可以收不到邮件,急!
无法使用 Nodemailer 连接到 outlook.com SMTP
为啥编码标头内容类型:text/html;在 Outlook 插件中使用 MailItem 时缺少 GMAIL 的 SMTP 服务器:SMTP.GMAIL.COM?