diff --git a/pom.xml b/pom.xml index 88cfb5b..87d87b6 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,8 @@ - ISO-8859-15 - ISO-8859-15 + UTF-8 + UTF-8 4.1.2.RELEASE @@ -31,8 +31,8 @@ maven-compiler-plugin 2.3.2 - 1.7 - 1.7 + 1.6 + 1.6 @@ -48,7 +48,7 @@ - org.dstovall + com.jolira onejar-maven-plugin 1.4.4 @@ -92,12 +92,6 @@ - - - onejar-maven-plugin.googlecode.com - http://onejar-maven-plugin.googlecode.com/svn/mavenrepo - - @@ -120,6 +114,14 @@ 2.6 + + + commons-io + commons-io + 2.2 + + + javax.mail mail diff --git a/src/main/java/com/mockmock/Settings.java b/src/main/java/com/mockmock/Settings.java index 890c505..af933b6 100644 --- a/src/main/java/com/mockmock/Settings.java +++ b/src/main/java/com/mockmock/Settings.java @@ -31,12 +31,12 @@ public class Settings /** * A set of "From" email addresses to filter */ - private Set filterFromEmailAddresses = new HashSet<>(); + private Set filterFromEmailAddresses = new HashSet(); /** * A set of "To" email addresses to filter */ - private Set filterToEmailAddresses = new HashSet<>(); + private Set filterToEmailAddresses = new HashSet(); /** * Path to the static folder containing the images, css and js diff --git a/src/main/java/com/mockmock/console/Parser.java b/src/main/java/com/mockmock/console/Parser.java index d836a4e..9821043 100644 --- a/src/main/java/com/mockmock/console/Parser.java +++ b/src/main/java/com/mockmock/console/Parser.java @@ -126,7 +126,7 @@ protected void parseFilterFromEmailAddressesOption(CommandLine cmd, Settings set { String input = cmd.getOptionValue("ff"); String[] emailAddresses = input.split(","); - settings.setFilterFromEmailAddresses(new HashSet<>(Arrays.asList(emailAddresses))); + settings.setFilterFromEmailAddresses(new HashSet(Arrays.asList(emailAddresses))); } } @@ -136,7 +136,7 @@ protected void parseFilterToEmailAddressesOption(CommandLine cmd, Settings setti { String input = cmd.getOptionValue("ft"); String[] emailAddresses = input.split(","); - settings.setFilterToEmailAddresses(new HashSet<>(Arrays.asList(emailAddresses))); + settings.setFilterToEmailAddresses(new HashSet(Arrays.asList(emailAddresses))); } } diff --git a/src/main/java/com/mockmock/htmlbuilder/MailViewHtmlBuilder.java b/src/main/java/com/mockmock/htmlbuilder/MailViewHtmlBuilder.java index 12915ef..b9366de 100644 --- a/src/main/java/com/mockmock/htmlbuilder/MailViewHtmlBuilder.java +++ b/src/main/java/com/mockmock/htmlbuilder/MailViewHtmlBuilder.java @@ -63,20 +63,47 @@ public String build() " \n"; } - if(mockMail.getBodyHtml() != null) + if(mockMail.getAttacheFileName() != null) { output += - "
\n" + - "

HTML body unformatted

\n" + - "
" + StringEscapeUtils.escapeHtml(mockMail.getBodyHtml()) + "
\n" + - "
\n"; + " \n"; + } + + if(mockMail.getBodyHtml() != null) + { +// output += +// "
\n" + +// "

HTML body unformatted

\n" + +// "
" + StringEscapeUtils.escapeHtml(mockMail.getBodyHtml()) + "
\n" + +// "
\n"; // also show a parsed version via an iframe + output += + ""; + output += "
\n" + "

HTML body formatted

\n" + - " \n" + + "
\n" + "
"; } diff --git a/src/main/java/com/mockmock/http/MailAttachmentHandler.java b/src/main/java/com/mockmock/http/MailAttachmentHandler.java new file mode 100644 index 0000000..38f6be9 --- /dev/null +++ b/src/main/java/com/mockmock/http/MailAttachmentHandler.java @@ -0,0 +1,121 @@ +package com.mockmock.http; + +import com.mockmock.mail.MailQueue; +import com.mockmock.mail.MockMail; +import org.apache.commons.io.IOUtils; +import org.eclipse.jetty.server.Request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.MimeTypeUtils; + +import javax.mail.internet.MimeUtility; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLConnection; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by Pengzili on 2016/12/30. + */ + +@Service +public class MailAttachmentHandler extends BaseHandler{ + + private String pattern = "^/attachment/([0-9]+)/?$"; + + private MailQueue mailQueue; + + @Override + public void handle(String target, Request request, HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException, ServletException { + + if(!isMatch(target)) + { + return; + } + + long mailId = getMailId(target); + if(mailId == 0) + { + return; + } + + MockMail mockMail = this.mailQueue.getById(mailId); + + if(mockMail == null) + { + return; + } + + if(mockMail.getBodyHtml() == null) + { + return; + } + + String fileName = mockMail.getAttacheFileName(); + String fileNameExt =fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()); + String mimeType = "application/octet-stream"; + + if (fileNameExt.equals("pdf")){ + mimeType = "application/pdf"; + }else if(fileNameExt.equals("doc")){ + mimeType = "application/msword"; + }else if(fileNameExt.equals("xls")){ + mimeType = "application/vnd.ms-excel"; + } + + response.setContentType(mimeType); + response.setHeader("Content-Disposition", " attachment;filename="+ MimeUtility.encodeWord(mockMail.getAttacheFileName())); + response.getOutputStream().write(mockMail.getAttachment()); + response.setStatus(HttpServletResponse.SC_OK); + + request.setHandled(true); + + } + + /** + * Checks if this handler should be used for the given target + * @param target String + * @return boolean + */ + private boolean isMatch(String target) + { + return target.matches(pattern); + } + + /** + * Returns the mail id if it is part of the target + * @param target String + * @return long + */ + private long getMailId(String target) + { + Pattern compiledPattern = Pattern.compile(pattern); + + Matcher matcher = compiledPattern.matcher(target); + if(matcher.find()) + { + String result = matcher.group(1); + try + { + return Long.valueOf(result); + } + catch (NumberFormatException e) + { + return 0; + } + } + + return 0; + } + + @Autowired + public void setMailQueue(MailQueue mailQueue) { + this.mailQueue = mailQueue; + } +} diff --git a/src/main/java/com/mockmock/mail/MailQueue.java b/src/main/java/com/mockmock/mail/MailQueue.java index 43ff309..177bdde 100644 --- a/src/main/java/com/mockmock/mail/MailQueue.java +++ b/src/main/java/com/mockmock/mail/MailQueue.java @@ -1,7 +1,6 @@ package com.mockmock.mail; import com.google.common.eventbus.Subscribe; -import com.mockmock.AppStarter; import com.mockmock.Settings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,7 +12,7 @@ @Service public class MailQueue { - private static ArrayList mailQueue = new ArrayList<>(); + private static ArrayList mailQueue = new ArrayList(); private Settings settings; diff --git a/src/main/java/com/mockmock/mail/MockMail.java b/src/main/java/com/mockmock/mail/MockMail.java index 32739d7..16550ba 100644 --- a/src/main/java/com/mockmock/mail/MockMail.java +++ b/src/main/java/com/mockmock/mail/MockMail.java @@ -13,6 +13,8 @@ public class MockMail implements Comparable private String rawMail; private MimeMessage mimeMessage; private long receivedTime; + private byte[] attachment; + private String attacheFileName; public long getId() { @@ -113,4 +115,20 @@ public void setReceivedTime(long receivedTime) { this.receivedTime = receivedTime; } + + public byte[] getAttachment() { + return attachment; + } + + public void setAttachment(byte[] attachment) { + this.attachment = attachment; + } + + public String getAttacheFileName() { + return attacheFileName; + } + + public void setAttacheFileName(String attacheFileName) { + this.attacheFileName = attacheFileName; + } } diff --git a/src/main/java/com/mockmock/mail/MockMockMessageHandlerFactory.java b/src/main/java/com/mockmock/mail/MockMockMessageHandlerFactory.java index e45ee0f..32dab70 100644 --- a/src/main/java/com/mockmock/mail/MockMockMessageHandlerFactory.java +++ b/src/main/java/com/mockmock/mail/MockMockMessageHandlerFactory.java @@ -2,6 +2,7 @@ import com.google.common.eventbus.EventBus; import com.mockmock.Settings; +import org.apache.commons.io.IOUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,6 +16,7 @@ import javax.mail.Multipart; import javax.mail.Session; import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; import java.io.*; import java.util.Properties; @@ -126,6 +128,9 @@ public void data(InputStream data) throws RejectException, IOException { BodyPart bodyPart = multipart.getBodyPart(i); String contentType = bodyPart.getContentType(); + contentType = contentType.replaceAll("\t|\r|\n", ""); + System.out.println(contentType); + if(contentType.matches("text/plain.*")) { mockMail.setBody(convertStreamToString(bodyPart.getInputStream())); @@ -134,6 +139,33 @@ else if(contentType.matches("text/html.*")) { mockMail.setBodyHtml(convertStreamToString(bodyPart.getInputStream())); } + else if(contentType.matches("multipart/related.*")){ + // compound documents + Multipart contentMulti = (Multipart)bodyPart.getContent(); + for (int j = 0; j < contentMulti.getCount(); j++){ + BodyPart subPart = contentMulti.getBodyPart(i); + String subContentType = subPart.getContentType(); + System.out.println(subContentType); + String encoding = "UTF-8"; + + if(subContentType.matches("text/html.*")){ + String originalBodyHtml = IOUtils.toString(subPart.getInputStream(), "utf-8"); + String replacedBodyHtml = originalBodyHtml.replaceAll("(?