我正在尝试发送嵌入徽标和用户签名图像的HTML电子邮件。我正在使用apache commons邮件。我已经关注了Apache的网站教程并尝试了在网络上找到的不同方法,但我无法嵌入任何图像。 我想说的是我不能使用网址来获取嵌入的图像,因为这是一个内部网应用程序,无论如何,它是一个单一登录系统的后面,它将阻止来自外部的任何访问。 此外,这不是真正的HTML,而是应用程序用作模板的xml。 下面我添加了xml - html(注释文本得到正确显示,只是嵌入式图像啊问题),以及我用来嵌入图像的代码,任何人都可以指出我正在做的任何错误或建议解决我的问题请 ?
生成的html / xml:
<?xml version="1.0" encoding="UTF-8"?><div style="margin-top: 20px; font-size: small;">
<br/>
<div class="auto-style1">
<div style="text-align: left;">
...
<div class="MsoNormal" style="text-align: right; padding-right: 100px; font-family: arial black,sans-serif;">
<img id="signature" src="cid:jrvoirylpp"/>
</div>
...
我发送邮件的代码:
HtmlEmail htmlMail = new HtmlEmail();
initMail(htmlMail);//set commons parameters (host,port,...
htmlMail.setContent(htmlCorpoMessaggio, "text/html");
//i'm trying to retrieve the raw byte array from my app resources
InputStream is = this.getClass().getResourceAsStream(
String.format("%s%s",
Configurator.getString("Template.resources"),
Configurator.getString("Template.firma")));
byte[] image = IOUtils.toByteArray(is);
//can't send an url i'm trying to truly embed the image inside the mail message
DataSource ds = new ByteArrayDataSource(image, "image/png");
String cid = htmlMail.embed(ds, "signature");
//i need to replace the src="an app path" to cid
Document doc = XmlHelper.loadXMLFromString(htmlCorpoMessaggio);
NodeList nodeList = doc.getElementsByTagName("img");
Node currentNode = null;
for(int i = 0; i < nodeList.getLength(); i++)
{
currentNode = nodeList.item(i);
}
NamedNodeMap nodiAttributo = currentNode.getAttributes();
for(int i= 0 ; i < nodiAttributo.getLength() ; i++ )
{
Node n = nodiAttributo.item(i);
if(n.getNodeName().equals("src"))
n.setNodeValue("cid:" + cid);
}
htmlCorpoMessaggio = XmlHelper.getStringFromDocument(doc);
for(MailAttachment allegato : allegati)
{
//la stringa vuota rappresenta la descrizione dell'allegato
htmlMail.attach(allegato.getDataSource(),
allegato.getFilename(),"",EmailAttachment.ATTACHMENT);
}
htmlMail.send();
答案 0 :(得分:1)
我不会回答,因为我的答案与java无关,但......
可以使用base64编码器在电子邮件中嵌入图像。 http://www.motobit.com/util/base64-decoder-encoder.asp
我会再次建议,因为大多数客户都不会显示编码图像 http://www.campaignmonitor.com/blog/post/1761/embedding-images-in-email/
我认为您最好的选择是将正常的html链接发布到服务器上托管的图片。
很抱歉,如果这不是你想听到的答案。
答案 1 :(得分:0)
不要经历XmlHelper的麻烦。这可能是因为它无法正常工作
只需更改电子邮件中的img标记,例如src="CIDSIGNATURE"
,然后执行以下操作:
HtmlEmail htmlMail = new HtmlEmail();
initMail(htmlMail);//set commons parameters (host,port,...
//i'm trying to retrieve the raw byte array from my app resources
InputStream is = this.getClass().getResourceAsStream(
String.format("%s%s",
Configurator.getString("Template.resources"),
Configurator.getString("Template.firma")));
byte[] image = IOUtils.toByteArray(is);
//can't send an url i'm trying to truly embed the image inside the mail message
DataSource ds = new ByteArrayDataSource(image, "image/png");
String cid = htmlMail.embed(ds, "signature");
htmlCorpoMessaggio = htmlCorpoMessaggio.replace("CIDSIGNATURE", "cid:" + cid);
htmlMail.setHtmlMsg(htmlCorpoMessaggio);
htmlMail.send();
注意我在开头删除了htmlMail.setContent
应该工作正常。它对我来说:))