【问题标题】:Python - Embedded Image in HTML SMTP emailPython - HTML SMTP 电子邮件中的嵌入图像
【发布时间】:2018-06-29 20:42:47
【问题描述】:

我正在使用 Python 的 smtplib 生成电子邮件,并且我正在尝试重新创建一个签名以放置在每封电子邮件的底部。以下是对该签名的高度详细和精湛的再现:

文本部分我已经弄清楚了。

body = """\
    <html>
        <head></head>
        <body>
            stuff
        </body>
    </html>
    """

然后我将其附加到消息中:

message_body = MIMEText(body, 'html')

message.attach(message_body)

我似乎无法弄清楚如何嵌入图像,以便它们的格式如上图所示。图片中的线条只是为了显示对齐,但它们不存在于签名本身中。图像还包含超链接。

我尝试过将其添加到 &lt;body&gt; 标记的最末尾,以至少在底部重新创建较小的图像:

&lt;img src="C:\Users\Me\Desktop\image1.png"&gt;

&lt;img src="C:\Users\Me\Desktop\image2.png"&gt;

我没有收到任何错误,但发送电子邮件时也没有任何显示。我不知道如何开始格式化应该位于签名中文本左侧的较大图像。

我可以使用MIMEImage 成功地将这些图像作为附件包含在电子邮件中,但我不希望它们作为附件,所以这不起作用。

如上嵌入图像后,我想我可以做这样的事情来添加超链接:

<a href="https://www.example.com">
<img src="img1.png" alt="example.com">
</a>

我是 HTML 新手,所以这些对我来说是未知的领域,我不知道该怎么做。我在这里阅读了很多也提到base64编码的问题,但我不知道它是否适用于这种情况。

任何帮助将不胜感激。谢谢!

编辑:here 发布的新问题解决了编码和发送后,已发送电子邮件中的图像显示为空白的问题。

【问题讨论】:

  • 您是否尝试过将图像上传到网络服务器,然后使用 img 路径而不是本地路径?
  • @JiiB 该脚本将在本地机器上运行,因此图像可能会保存在机器本身或机器可以访问的某个目录中。

标签: python html


【解决方案1】:

如果你想在你的 html 中使用嵌入的图片,你需要先对它们进行 base64 编码。

一个 html 图片标签应该是这样的

<img src="data:image/jpg;base64,THEBASE64CODE" alt="image"high="30" width="30" />

你必须读取图像文件并使用 pythons base64 对其进行 base64 编码。

否则,您需要参考网络中包含您的图像的资源。

<img src="http://yourwebserver.org/image.jpg" alt="image" high="30" width="30" />

第一个解决方案需要在每封电子邮件中发送您的图片。这会增加电子邮件的大小。

第二种解决方案需要有一个公共的网络资源,并且接收方系统会在打开电子邮件后加载图像(如果他/她的电子邮件程序没有阻止它)。

在您的情况下,我会尝试使用您喜欢的编辑器和网络浏览器以纯 html 格式设计电子邮件。此后,我将尝试使用给定的解决方案之一修改 img-Tags。

为您的电子邮件设计提供一些附加信息:

HTML 表对于结构化数据表示非常有用

<table border="1" >

<tr>
    <td>IMG left</td>
    <td colspan="2">

        your text that could be very long and usefull to your recipient<br><br>
        you should encode the mail text for html within your python application<br><br>

        otherwise you will have problems with newline and so on.
    </td>
<tr>
    <td></td>
    <td>IMG center</td>
    <td>IMG rigth</td>
</tr>
</table>

用您的 img-Tag 替换 IMG。将您的邮件文本放入文本部分。移除border="1" 移除html-table的边框。

对于 HTML 编码,看看 pythons HTMLParser

【讨论】:

  • 谢谢,我尝试了第一个选项,编码如下:base64.b64encode(image_file.read()) 并将生成的字符串附加到该字符串的末尾:'data:image/png;base64,'。然后在这里使用完整的字符串:&lt;img src="%s"&gt;。图像现在显示在电子邮件中,但图像是broken image icon,而不是实际图像。知道出了什么问题吗?
  • 我认为编码有问题。我在一个 php 项目中遇到了类似的问题。看看这边base64-image.de。在那里您可以上传图像并对其进行 base64 编码。使用此代码进行测试。
  • 我使用了那个网站,不再看到损坏的图像图标,但是,现在我什么也没看到。我将img 标记更新为&lt;img src="%s" width = "32" height = "32"&gt;,现在只有一个带有边框的空框,图像应该在其中。我将编辑问题以包含此信息。
  • 请创建一个简单的 html 文件并尝试其中网站的 img-Tag 示例。在您的网络浏览器中打开它。当一切正常时,您可以以同样的方式尝试您的 python-base64 编码图像。如果两者都有效,您可以确定这不是编码问题。您的 %s 是否仅包含从 base64.b64encode 给出的编码图像?你必须把 data:image/jpg;base64, base64: src="data:image/jpg;base64,%s" 在你的情况下我认为
  • 我在 CodePen 示例中测试了编码字符串,它们工作正常,所以我认为这不是编码问题。
猜你喜欢
  • 2016-11-06
  • 2011-10-06
  • 2015-03-14
  • 2011-11-09
  • 2014-10-03
  • 2018-06-29
  • 2020-12-14
  • 2012-07-29
相关资源
最近更新 更多