发送带有嵌入式图像的电子邮件

时间:2012-03-23 12:02:53

标签: java email html-email apache-commons-email

我正在尝试发送嵌入徽标和用户签名图像的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();

2 个答案:

答案 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 应该工作正常。它对我来说:))