This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository faxtomail. See http://git.codelutin.com/faxtomail.git commit e93ac25f646e2214db47d197ce972e9c729d5ab1 Author: Kevin Morin <morin@codelutin.com> Date: Tue Mar 24 18:49:33 2015 +0100 fixes #6862 [Archives web] Erreur d'affichage des réponses qui ont des balises html non valides fixes #6863 Erreur de gestion des mails de content type différent de text ou multipart correction du changement de format de page lors de la transformation des mails en pdf --- .../services/service/EmailServiceImpl.java | 100 ++++++++++----------- .../services/service/EmailServiceTest.java | 45 +++++++++- .../ui/swing/content/demande/DemandeUIModel.java | 2 +- .../faxtomail/ui/swing/util/FaxToMailUIUtil.java | 4 +- .../faxtomail/web/action/DemandDetailAction.java | 8 +- .../faxtomail/web/job/MailFilterJob.java | 35 +++++++- pom.xml | 6 +- 7 files changed, 134 insertions(+), 66 deletions(-) diff --git a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java index ed67b3d..b91e56c 100644 --- a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java +++ b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java @@ -2118,10 +2118,10 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe // <td background="cid:bg.gif" height="52"> // <img border=0 src="cid:bg.gif" /> // <img src='cid:5e9ef859-ea65-4f9b-a9fa-30d4a2c5837c' - content = content.replaceAll("(\\w+)=([\"'])cid:" + Pattern.quote(key) + "([\"'])", "$1=$2file://" + file.getAbsolutePath() + "$3"); + content = content.replaceAll("(\\w+)=([\"'])cid:" + Pattern.quote(key) + "([\"'])", "$1=$2" + file.toURI() + "$3"); if (log.isDebugEnabled()) { - log.debug("Mapping attachment id " + key + " to file " + file.getAbsolutePath()); + log.debug("Mapping attachment id " + key + " to file " + file.toURI()); } } @@ -2129,70 +2129,64 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe ImageRenderer imageRenderer = html2Image.getImageRenderer().setWidth((int) PageSize.A4.getWidth()); org.w3c.dom.Document doc = html2Image.getParser().getDocument(); - // FIXME kmorin 20150316 npe on imageRenderer.saveImage(baos, true); on windows - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - imageRenderer.saveImage(baos, true); - Image image = Image.getInstance(baos.toByteArray()); - - float width = image.getWidth(); - float height = image.getHeight(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + imageRenderer.saveImage(baos, true); + Image image = Image.getInstance(baos.toByteArray()); - // get the format of the page - Rectangle format = PageSize.A4; - if (width > PageSize.A4.getWidth() && width <= PageSize.A4.getHeight()) { - if (height <= PageSize.A4.getWidth()) { - format = PageSize.A4.rotate(); + float width = image.getWidth(); + float height = image.getHeight(); - } else { - format = PageSize.A3; - } - } - if (width > PageSize.A3.getWidth() && width <= PageSize.A3.getHeight()) { - if (height <= PageSize.A3.getWidth()) { - format = PageSize.A3.rotate(); + // get the format of the page + Rectangle format = PageSize.A4; + if (width > PageSize.A4.getWidth() && width <= PageSize.A4.getHeight()) { + if (height <= PageSize.A4.getWidth()) { + format = PageSize.A4.rotate(); - } else { - format = PageSize.A2; - } + } else { + format = PageSize.A3; } - if (width > PageSize.A2.getWidth() && width <= PageSize.A2.getHeight()) { - if (height <= PageSize.A2.getWidth()) { - format = PageSize.A2.rotate(); + } + if (width > PageSize.A3.getWidth() && width <= PageSize.A3.getHeight()) { + if (height <= PageSize.A3.getWidth()) { + format = PageSize.A3.rotate(); - } else { - format = PageSize.A1; - } + } else { + format = PageSize.A2; } - if (width > PageSize.A1.getWidth() && width <= PageSize.A1.getHeight()) { - if (height <= PageSize.A1.getWidth()) { - format = PageSize.A1.rotate(); + } + if (width > PageSize.A2.getWidth() && width <= PageSize.A2.getHeight()) { + if (height <= PageSize.A2.getWidth()) { + format = PageSize.A2.rotate(); - } else { - format = PageSize.A0; - } - } - if (width > PageSize.A0.getWidth()) { - format = PageSize.A0.rotate(); + } else { + format = PageSize.A1; } - - Node style = doc.createElement("style"); - style.setTextContent("@page { size: " + format.getWidth() + "px " + format.getHeight() + "px; }"); - NodeList heads = doc.getElementsByTagName("head"); - Node head; - if (heads.getLength() > 0) { - head = heads.item(0); + } + if (width > PageSize.A1.getWidth() && width <= PageSize.A1.getHeight()) { + if (height <= PageSize.A1.getWidth()) { + format = PageSize.A1.rotate(); } else { - head = doc.createElement("head"); - Node html = doc.getDocumentElement(); - html.appendChild(head); + format = PageSize.A0; } - head.appendChild(style); + } + if (width > PageSize.A0.getWidth()) { + format = PageSize.A0.rotate(); + } - } catch (Exception ex) { - doc = html2Image.getParser().getDocument(); + Node style = doc.createElement("style"); + style.setTextContent("@page { size: " + format.getWidth() + "px " + format.getHeight() + "px; }"); + NodeList heads = doc.getElementsByTagName("head"); + Node head; + if (heads.getLength() > 0) { + head = heads.item(0); + + } else { + head = doc.createElement("head"); + Node html = doc.getDocumentElement(); + html.appendChild(head); } + head.appendChild(style); // convert to pdf ITextRenderer renderer = new ITextRenderer(); diff --git a/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java b/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java index 83b1732..18dc4a6 100644 --- a/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java +++ b/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java @@ -221,12 +221,49 @@ public class EmailServiceTest extends AbstractFaxToMailServiceTest { // File email = new File("src/test/resources/email.txt"); // String emailContent = FileUtils.readFileToString(email); // MimeMessage message = MimeMessageUtils.createMimeMessage(null, emailContent); -// +// Charset charset = FaxToMailServiceUtils.getCharset(message); // ArrayList<Attachment> attachments = new ArrayList<>(); -// String htmlContent = service.decomposeMultipartEmail(attachments, message); // -// Attachment attachment = service.convertHTMLToPdf(attachments, htmlContent, "test"); -// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); +// if (message.isMimeType("multipart/*")) { +// +// String htmlContent = service.decomposeMultipartEmail(attachments, message); +// +// Attachment attachment = service.convertHTMLToPdf(attachments, htmlContent, "test"); +// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); +// +// } else if (message.isMimeType("text/*")) { +// // convertit le contenu texte en PDF +// String content = IOUtils.toString(message.getInputStream(), charset); +// if (StringUtils.isNotBlank(content)) { +// Attachment attachment = service.convertTextToPdf(content, "test"); +// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); +// } +// }else { +// String fileName = message.getFileName(); +// try { +// fileName = MimeUtility.decodeText(fileName); +// +// } catch (UnsupportedEncodingException ex) { +// // don't care, use filename raw value +// } +// +// DataHandler dh = message.getDataHandler(); +// +// // create new attachment +// Attachment attachment = new AttachmentImpl(); +// attachment.setAddedByUser(false); +// AttachmentFile attachmentFile = service.getAttachmentFileFromStream(dh.getInputStream()); +// attachmentFile.setFilename(fileName); +// attachment.setOriginalFile(attachmentFile); +// +// // convert attachment if defined by admin +// service.convertIfNecessary(attachment); +// +// // save attachment +// attachments.add(attachment); +// Files.copy(attachment.getOriginalFile().getFile(), new File("/tmp/test.pdf")); +// } +// // // } catch (Exception e) { // e.printStackTrace(); diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java index 968200d..d43de1b 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java @@ -918,7 +918,7 @@ public class DemandeUIModel extends AbstractFaxToMailBeanUIModel<Email, DemandeU if (message.isMimeType("multipart/*")) { decomposeMultipartEmail(message); - } else { + } else if (message.isMimeType("text/*")) { String content = IOUtils.toString(message.getInputStream(), charset); plainContent = content; } diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java index de31d2b..ee33699 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java @@ -383,10 +383,10 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { // <td background="cid:bg.gif" height="52"> // <img border=0 src="cid:bg.gif" /> // <img src='cid:5e9ef859-ea65-4f9b-a9fa-30d4a2c5837c' - content = content.replaceAll("(\\w+)=([\"'])cid:" + Pattern.quote(key) + "([\"'])", "$1=$2file://" + file.getAbsolutePath() + "$3"); + content = content.replaceAll("(\\w+)=([\"'])cid:" + Pattern.quote(key) + "([\"'])", "$1=$2" + file.toURI() + "$3"); if (log.isDebugEnabled()) { - log.debug("Mapping attachment id " + key + " to file " + file.getAbsolutePath()); + log.debug("Mapping attachment id " + key + " to file " + file.toURI()); } } diff --git a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/DemandDetailAction.java b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/DemandDetailAction.java index 8a0ac53..755fc1b 100644 --- a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/DemandDetailAction.java +++ b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/DemandDetailAction.java @@ -266,6 +266,8 @@ public class DemandDetailAction extends FaxToMailActionSupport { String content = IOUtils.toString(message.getInputStream(), charset); replyModel.setPlainContent(content); } + +// replyModel.setPlainContent("test<mailto:test2"); result.add(replyModel); } @@ -363,7 +365,7 @@ public class DemandDetailAction extends FaxToMailActionSupport { if (message.isMimeType("multipart/*")) { decomposeMultipartEmail(message, emailUIModel); - } else { + } else if (message.isMimeType("text/*")) { Charset charset = FaxToMailServiceUtils.getCharset(message); String content = IOUtils.toString(message.getInputStream(), charset); emailUIModel.setPlainContent(content); @@ -499,7 +501,9 @@ public class DemandDetailAction extends FaxToMailActionSupport { public void setPlainContent(String plainContent) { if (content == null) { - this.content = plainContent == null ? null : plainContent.replaceAll("(\r\n|\n)", "<br />"); + this.content = plainContent == null ? null : plainContent.replaceAll("(\r\n|\n)", "<br />") + // <mailto:...> throws an error in the ng-bind-html primitive in the UI + .replaceAll("<mailto:([^\\>]*)>", "[mailto:$1]"); } } diff --git a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java index faca3a0..96b1503 100644 --- a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java +++ b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java @@ -27,6 +27,8 @@ package com.franciaflex.faxtomail.web.job; import com.franciaflex.faxtomail.FaxToMailApplicationContext; import com.franciaflex.faxtomail.FaxToMailConfiguration; import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.persistence.entities.Client; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.Email; @@ -56,6 +58,7 @@ import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; +import javax.activation.DataHandler; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; @@ -65,6 +68,8 @@ import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.text.DateFormat; import java.util.ArrayList; @@ -481,13 +486,41 @@ public class MailFilterJob extends AbstractFaxToMailJob { attachments.add(attachment); } } - } else { + + // text email + } else if (message.isMimeType("text/*")) { // convertit le contenu texte en PDF String content = IOUtils.toString(message.getInputStream(), charset); if (StringUtils.isNotBlank(content)) { Attachment attachment = emailService.convertTextToPdf(content, t("faxtomail.email.content.attachment.plainFileName")); attachments.add(0, attachment); } + + //directly an attachment + } else { + String fileName = message.getFileName(); + + try { + fileName = MimeUtility.decodeText(fileName); + + } catch (UnsupportedEncodingException ex) { + // don't care, use filename raw value + } + + DataHandler dh = message.getDataHandler(); + + // create new attachment + Attachment attachment = new AttachmentImpl(); + attachment.setAddedByUser(false); + AttachmentFile attachmentFile = emailService.getAttachmentFileFromStream(dh.getInputStream()); + attachmentFile.setFilename(fileName); + attachment.setOriginalFile(attachmentFile); + + // convert attachment if defined by admin + emailService.convertIfNecessary(attachment); + + // save attachment + attachments.add(attachment); } emailService.saveEmail(email, diff --git a/pom.xml b/pom.xml index 7e0a295..ce77f33 100644 --- a/pom.xml +++ b/pom.xml @@ -669,12 +669,12 @@ <version>2.0.1</version> <exclusions> <exclusion> - <artifactId>core-renderer</artifactId> <groupId>org.xhtmlrenderer</groupId> + <artifactId>core-renderer</artifactId> </exclusion> <exclusion> - <artifactId>xml-apis</artifactId> <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> </exclusion> </exclusions> </dependency> @@ -682,7 +682,7 @@ <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> - <version>9.0.6</version> + <version>9.0.7</version> </dependency> <dependency> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.