如何使用 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 发件箱中查看邮件?

如何设置outlook office365邮箱的中继

EXCHANGE设置了SMTP不允许匿名访问之后OUTLOOK收不到邮件!如何实现不允许匿名访问后可以收不到邮件,急!

无法使用 Nodemailer 连接到 outlook.com SMTP

为啥编码标头内容类型:text/html;在 Outlook 插件中使用 MailItem 时缺少 GMAIL 的 SMTP 服务器:SMTP.GMAIL.COM?

通过 Outlook 的 smtp 服务器发送电子邮件