отправка электронного письма со встроенным изображением - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь отправить html-письма с логотипом и изображением подписи пользователя. Я использую Apache Commons Mail. Я следовал учебному пособию по Apache и пробовал разные подходы, найденные в Интернете, но я не могу вставить любое изображение. Я хотел бы отметить, что я не могу использовать URL-адреса для получения встроенного изображения, поскольку это приложение для внутренней сети и, во всяком случае, за системой единого входа, которая блокирует любой доступ извне. Более того, это не совсем 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 ]

1 голос
/ 27 марта 2012

Я не собирался отвечать, потому что мой ответ на самом деле не связан с Java, но ...

Возможно встроить изображение в электронное письмо, используя кодировщик base64.http://www.motobit.com/util/base64-decoder-encoder.asp

Я бы еще раз предложил это, потому что большинство клиентов не показывают закодированные изображения http://www.campaignmonitor.com/blog/post/1761/embedding-images-in-email/

Я думаю, что вам лучше всего разместить обычную ссылку в формате HTML на изображение, размещенное на сервере.

Извините, если это не тот ответ, который вы хотели услышать.

0 голосов
/ 28 ноября 2012

Не проходите через суету 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 в начале.1007 * Должно работать нормально.Это для меня:)

...