使用Javamail将图像直接插入HTML模板

使用Javamail将图像直接插入HTML模板,java,html,css,image,jakarta-mail,Java,Html,Css,Image,Jakarta Mail,嘿,大家好,我已经看到了很多关于这个的话题,但不完全是我想要的 基本上,当我开始发送Javamail消息时,我会将图像作为byte[]对象,并生成一个包含html模板的字符串。我想做的是不把它存储在服务器上(我不想试图处理在服务器上保存图像的维护,我们将有有限的空间来处理)。我想获取我已经拥有的byte[]对象,并直接将其存储在html模板中,确保它位于正确的图像标记中。我有办法做到这一点吗?基本上我想贴一条消息;在特定位置直接导入html模板 希望我在这里讲得通 我想的另一个想法是将图像添加为

嘿,大家好,我已经看到了很多关于这个的话题,但不完全是我想要的

基本上,当我开始发送Javamail消息时,我会将图像作为byte[]对象,并生成一个包含html模板的字符串。我想做的是不把它存储在服务器上(我不想试图处理在服务器上保存图像的维护,我们将有有限的空间来处理)。我想获取我已经拥有的byte[]对象,并直接将其存储在html模板中,确保它位于正确的图像标记中。我有办法做到这一点吗?基本上我想贴一条消息;在特定位置直接导入html模板

希望我在这里讲得通


我想的另一个想法是将图像添加为附件,并在显示html模板时引用该附件……如果可能的话。

将图像添加为附件,然后使用“cid”前缀对其进行引用

//
//此HTML邮件由两部分组成,正文和嵌入的图像
//
MimMultipart multipart=新的MimMultipart(“相关”);
//第一部分(html)
BodyPart messageBodyPart=新的MimeBodyPart();
字符串htmlText=“Hello”;
setContent(htmlText,“text/html”);
//加上
multipart.addBodyPart(messageBodyPart);
//第二部分(图像)
messageBodyPart=新的MimeBodyPart();
DataSource fds=新文件数据源
(“C:\\images\\foo.gif”);
setDataHandler(新的DataHandler(fds));
messageBodyPart.setHeader(“内容ID”,即“”);
//加上
multipart.addBodyPart(messageBodyPart);
//把所有的东西放在一起
message.setContent(多部分);

完整示例

尝试以下使用ByteArrayDataSource在邮件中包含图像字节的方法

// Add html content
// Specify the cid of the image to include in the email

String html = "<html><body><b>Test</b> email <img src='cid:my-image-id'></body></html>";
Multipart mp = new MimeMultipart();
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html");
mp.addBodyPart(htmlPart);

// add image in another part

MimeBodyPart imagePart = new MimeBodyPart();
DataSource fds = new ByteArrayDataSource(imageBytes, imageType);
imagePart.setDataHandler(new DataHandler(fds));

// assign a cid to the image

imagePart.setHeader("Content-ID", "<my-image-id>"); // Make sure you use brackets < >
mp.addBodyPart(imagePart);

message.setContent(mp);
//添加html内容
//指定要包含在电子邮件中的图像的cid
String html=“测试电子邮件”;
Multipart mp=新的MimeMultipart();
MimeBodyPart htmlPart=新的MimeBodyPart();
setContent(html,“text/html”);
mp.addBodyPart(htmlPart);
//在另一部分中添加图像
MimeBodyPart imagePart=新的MimeBodyPart();
DataSource fds=新的ByteArrayDataSource(imageBytes,imageType);
setDataHandler(新的DataHandler(fds));
//将cid分配给映像
imagePart.setHeader(“内容ID”,即“”);//确保使用括号<>
mp.addBodyPart(图像部分);
message.setContent(mp);

改编自示例@

请记住,Outlook是非常受欢迎且极其愚蠢的邮件客户端。我严重怀疑嵌入的数据是否能用于图像。您确实需要在服务器上托管映像。嗯,好的,我也会尝试使用临时文件寻找解决方案。一个小问题是:内容ID应该有,并且
@
是必需的。另外,您想要的是
多部分/相关的
,而不是
多部分/混合的
@B.Z.B请注意,您可以避免通过将ByteArrayDataSource直接与字节数组一起使用来创建文件一个小问题:内容ID应该与消息ID或电子邮件地址具有相同的格式,而
@
是必需的@dkarp,我不知道。因此,要符合rfc2392,那么它应该是字符串htmlText=“Hello”;和messageBodyPart.setHeader(“内容ID”,即“);是的。虽然大多数邮件会匹配任何东西,只是为了在他们接受的内容上自由。哈哈,我以前看到过这个,但我认为它是严格地作为附件添加的(即它不会直接插入)。。。谢谢你的信息!
// Add html content
// Specify the cid of the image to include in the email

String html = "<html><body><b>Test</b> email <img src='cid:my-image-id'></body></html>";
Multipart mp = new MimeMultipart();
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html");
mp.addBodyPart(htmlPart);

// add image in another part

MimeBodyPart imagePart = new MimeBodyPart();
DataSource fds = new ByteArrayDataSource(imageBytes, imageType);
imagePart.setDataHandler(new DataHandler(fds));

// assign a cid to the image

imagePart.setHeader("Content-ID", "<my-image-id>"); // Make sure you use brackets < >
mp.addBodyPart(imagePart);

message.setContent(mp);