base64 encoded images in email signatures
我必须在电子邮件签名中包含一些图片(公司徽标等)。我使用电子邮件系统生成的嵌入图像(它们通常作为附件发送)和链接图像(需要在收到的电子邮件中显示它们)时遇到了各种各样的问题。
我刚刚看到一些来自Exchange的电子邮件,它有一个base64图像的徽标表示,并使用一个标签来进行显示。我正在寻找一些信息,如有可能,我如何在电子邮件签名中做到这一点(我如何为一个开始生成base64版本的徽标,以及我需要什么代码才能使它工作)?
我尝试过一些简单的事情,比如
1 2 3 4 5 | <body> <span> <img src=.... > </span> </body> |
但我所得到的只是alt文本,所以我显然在做一些错误的事情。
图像应作为如下附件嵌入到邮件中:
1 2 3 4 5 6 7 8 9 10 | --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部分将引用这样的图像:
1 | <img src="cid:0123456789"> |
在一些客户机中,src="sig.png"也可以工作。
您基本上有一个多部分/混合的、多部分/可选的、多部分/相关的消息,其中图像附件在相关部分中。您可以查看这个mbox文件的源代码(它使用文件名示例而不是cid示例)来获得一个想法。
客户端也不应该阻止此图像,因为它不是远程的。
或者,这里有一个multipart/alternative,multipart/相关的示例,作为一个mbox文件(另存为Windows换行格式,并在末尾放一个空行)。并且,不使用扩展名或.mbs扩展名):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | From From: from@example.com To: [email protected] 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"> </head> <body> <p> test </p> <p class="sig">-- <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中,您可以切换"首选纯文本"以查看HTML和文本版本之间的区别。无论如何,您将看到HTML版本使用了SIG中的嵌入图片。
重要的
下面的答案显示了如何使用数据URI嵌入图像。这对网络很有用,但对于大多数电子邮件客户机来说不可靠。对于电子邮件,请务必阅读shadow2531的答案。
Base-64数据在
您可以使用在线工具或几行代码来生成base 64字符串。
从内联数据中获取图像的语法是:
1 2 3 | <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot"> |
http://en.wikipedia.org/wiki/data_uri_方案
最近我也遇到了同样的问题,在电子邮件中加入了qr-image/png。QR图像是一个字节数组,使用zxing生成。我们不想将其保存到文件中,因为保存/读取文件的成本太高(速度太慢)。所以上面的两个答案对我都不起作用。以下是我为解决这个问题所做的:
1 2 3 4 5 6 7 | 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部分应该有:
不需要将字节数组转换为base64,因为commons mail会自动为您进行转换。希望这有帮助。