base64编码的图像在电子邮件签名
我必须在电子邮件签名中包含一些图片(公司标志等)。 我使用由有问题的电子邮件系统生成的embedded式图像(通常作为附件发送)和链接的图像(要求在接收到的电子邮件中显示它们的权限),我有各种各样的问题。
我刚刚看到一些来自交换机的电子邮件,其中有一个base64图像表示的标志,并使用标签来显示。 我正在寻找一些关于如何在电子邮件签名中做到这一点的信息(如何生成标志的base64版本以及我需要什么代码才能使其工作)?
我尝试了简单的东西,如
<body> <span> <img src=.... > </span> </body>
但我所得到的是替代文字,所以我显然在这里做错了什么。
重要
下面的答案显示了如何使用数据URI来embedded图像。 这对于networking很有用,但对于大多数电子邮件客户端来说不可靠 。 对于电子邮件的目的,请务必阅读Shadow2531的答案 。
Base-64数据在img
标签中是合法的,我相信你的问题是如何正确插入这样的图片标签。
您可以使用在线工具或几行代码来生成基本64string。
从内联数据源图像的语法是:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
图像应作为附件embedded到消息中:
--boundary Content-Type: image/png; name="sig.png" Content-Disposition: inline; filename="sig.png" Content-Transfer-Encoding: base64 Content-ID: <0123456789> Content-Location: sig.png base64 data --boundary
而且,HTML部分会像这样引用图像:
<img src="cid:0123456789">
在一些客户端,src =“sig.png”也可以工作。
你基本上有一个多部分/混合,多部分/替代,多部分/相关的消息,图像附件是在相关的部分。 您可以查看此mbox文件的源代码(它使用文件名示例而不是cid示例)来获得一个想法。
客户不应该阻止这个图像,因为它不是遥远的。
或者,这里是一个多部分/替代,多部分/相关的例子作为一个mbox文件(保存为windows的新行格式,并在最后放置一个空行,并且不使用扩展名或.mbs扩展名):
From From: from@example.com To: to@example.com Subject: HTML Messages with Embedded Pic in Signature MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="alternative_boundary" This is a message with multiple parts in MIME format. --alternative_boundary Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit test -- [Picture of a Christmas Tree] --alternative_boundary Content-Type: multipart/related; boundary="related_boundary" --related_boundary Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <p>test</p> <p class="sig">-- <br><img src="cid:0123456789"></p> </body> </html> --related_boundary Content-Type: image/png; name="sig.png" Content-Disposition: inline; filename="sig.png" Content-Location: sig.png Content-ID: <0123456789> Content-Transfer-Encoding: base64 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 cHkgSG9saWRheXMgUGFnZQA7 --related_boundary-- --alternative_boundary--
您可以将其导入Sylpheed或Thunderbird(使用导入/导出工具扩展名)或Opera的内置邮件客户端。 然后,在Opera中,例如,您可以切换“prefer plain text”来查看HTML和文本版本之间的区别。 无论如何,你会看到HTML版本使用sig中的embedded式pic。
最近我有同样的问题,包括在电子邮件中的QR图像/ PNG。 QR图像是使用ZXing生成的一个字节数组。 我们不想将它保存到一个文件,因为从文件保存/读取是太昂贵(慢)。 所以上述两个答案都不适合我。 以下是我所做的解决这个问题的方法:
import javax.mail.util.ByteArrayDataSource; import org.apache.commons.mail.ImageHtmlEmail; ... ImageHtmlEmail email = new ImageHtmlEmail(); byte[] qrImageBytes = createQRCode(); // get your image byte array ByteArrayDataSource qrImageDataSource = new ByteArrayDataSource(qrImageBytes, "image/png"); String contentId = email.embed(qrImageDataSource, "QR Image");
假设contentId是“111122223333”,那么你的HTML部分应该有这个:
<img src="cid: 111122223333">
没有必要将字节数组转换为Base64,因为Commons Mail会自动为您进行转换。 希望这可以帮助。