public static String getText(Part part) { try { ContentType contentType = new ContentType(part.getContentType()); System.err.println( "contentType: " + part.getContentType() + ", class: " + part.getContent().getClass().getName()); if (part.isMimeType("text/*")) { String charset = contentType.getParameter("charset"); System.err.println("Charset: " + charset); return (String) part.getContent(); } else if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart) part.getContent(); for (int i = 0; i < mp.getCount(); i++) { String text = getText(mp.getBodyPart(i)); if (text != null) { return text; } } } return null; } catch (ParseException e) { throw new RuntimeException(e); } catch (MessagingException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } }
private void rePart(Part part) throws Exception { if (part.getDisposition() != null) { String strFileNmae = MimeUtility.decodeText(part.getFileName()); // MimeUtility.decodeText解决附件名乱码问题 System.out.println("发现附件: " + MimeUtility.decodeText(part.getFileName())); System.out.println("内容类型: " + MimeUtility.decodeText(part.getContentType())); System.out.println("附件内容:" + part.getContent()); InputStream in = part.getInputStream(); // 打开附件的输入流 // 读取附件字节并存储到文件中 java.io.FileOutputStream out = new FileOutputStream(strFileNmae); int data; while ((data = in.read()) != -1) { out.write(data); } in.close(); out.close(); } else { if (part.getContentType().startsWith("text/plain")) { System.out.println("文本内容:" + part.getContent()); } else { // System.out.println("HTML内容:" + part.getContent()); } } }
/** Return the primary text content of the message. */ public String getContent(Part p) throws MessagingException, IOException { if (p.isMimeType("text/*")) { String s = (String) p.getContent(); return s; } if (p.isMimeType("multipart/alternative")) { // prefer html text over plain text Multipart mp = (Multipart) p.getContent(); String text = null; for (int i = 0; i < mp.getCount(); i++) { Part bp = mp.getBodyPart(i); if (bp.isMimeType("text/plain")) { if (text == null) text = getContent(bp); continue; } else if (bp.isMimeType("text/html")) { String s = getContent(bp); if (s != null) return s; } else { return getContent(bp); } } return text; } else if (p.isMimeType("multipart/*")) { Multipart mp = (Multipart) p.getContent(); for (int i = 0; i < mp.getCount(); i++) { String s = getContent(mp.getBodyPart(i)); if (s != null) return s; } } return null; }
/** Return the primary text content of the message. */ private static String getText(Part p) throws MessagingException, IOException { if (p.isMimeType("text/enriched")) { InputStream is = (InputStream) p.getContent(); StringWriter writer = new StringWriter(); IOUtils.copy(is, writer); return writer.toString(); } if (p.isMimeType("text/*") && !p.isMimeType("text/enriched")) { p.getContentType(); try { String s = (String) p.getContent(); textIsHtml = p.isMimeType("text/html"); return s; } catch (ClassCastException e) { InputStream is = (InputStream) p.getContent(); StringWriter writer = new StringWriter(); IOUtils.copy(is, writer); textIsHtml = p.isMimeType("text/html"); return writer.toString(); } } if (p.isMimeType("multipart/alternative")) { // prefer html text over plain text Multipart mp = (Multipart) p.getContent(); String text = null; for (int i = 0; i < mp.getCount(); i++) { Part bp = mp.getBodyPart(i); if (bp.isMimeType("text/plain")) { if (text == null) text = getText(bp); return text; // continue; } else if (bp.isMimeType("text/html")) { String s = getText(bp); if (s != null) return s; } else { return getText(bp); } } return text; } else if (p.isMimeType("multipart/*")) { Multipart mp = (Multipart) p.getContent(); for (int i = 0; i < mp.getCount(); i++) { String s = getText(mp.getBodyPart(i)); if (s != null) return s; } } return null; }
/** * Process the MimeMessage from signed Mail to get attachments and save them to disk. * * @param mime * @return * @throws MessagingException * @throws IOException */ private String processAttachmentsOfSignedMail(MimeMessage mime) throws IOException, MessagingException { List<Attachment> attachList = new ArrayList<Attachment>(); // Get the content of the messsage, it's an Multipart object like a package including all the // email text and attachment. Multipart multi1 = (Multipart) mime.getContent(); // process each part in order. for (int i = 0, n = multi1.getCount(); i < n; i++) { // unpack, get each part of Multipart, part 0 may email text and part 1 may attachment. Or it // is another embedded Multipart. Part part2 = multi1.getBodyPart(i); // determine Part is email text or Multipart. if (part2.getContent() instanceof Multipart) { Multipart multi2 = (Multipart) part2.getContent(); // First, verify the quantity and size of attachments. boolean isValidMailMsg = this.isValidMailMsg(multi2); if (isValidMailMsg) { // process the content in multi2. for (int j = 0; j < multi2.getCount(); j++) { Part part3 = multi2.getBodyPart(j); if (part3.isMimeType("multipart/related")) { if (part3.getContent() instanceof Multipart) { Multipart multi3 = (Multipart) part3.getContent(); for (int m = 0; m < multi3.getCount(); m++) { Part part4 = multi3.getBodyPart(m); if (!part4.isMimeType("multipart/alternative")) { // This is an embedded picture, save it. this.saveAttachment(part4, attachList); } } } } else { // Save the attachment. String disposition = part3.getDisposition(); if (disposition != null && Part.ATTACHMENT.equalsIgnoreCase(disposition)) { this.saveAttachment(part3, attachList); } } } } } else { // Process the attachment.(This is a certificate file.) String disposition = part2.getDisposition(); if (disposition != null && Part.ATTACHMENT.equalsIgnoreCase(disposition)) { this.saveAttachment(part2, attachList); } } } return JSONArray.fromObject(attachList).toString(); }
public void saveEmailFiles(HttpServletRequest request, HttpServletResponse response, Part part) throws Exception { String fileName = ""; if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart) part.getContent(); for (int i = 0; i < mp.getCount(); i++) { BodyPart mpart = mp.getBodyPart(i); String disposition = mpart.getDisposition(); if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) { fileName = mpart.getFileName(); if (fileName != null) { if (fileName.toLowerCase().indexOf("gb2312") != -1 || fileName.toLowerCase().indexOf("gbk") != -1) { fileName = MimeUtility.decodeText(fileName); } if (request.getHeader("User-Agent").contains("Firefox")) { response.addHeader("content-disposition", "attachment;filename=" + fileName); } else if (request.getHeader("User-Agent").contains("MSIE")) { response.addHeader( "content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); } System.out.println("saveFile1"); saveFile(response, fileName, mpart.getInputStream()); } } else if (mpart.isMimeType("multipart/*")) { saveEmailFiles(request, response, mpart); } else { fileName = mpart.getFileName(); if (fileName != null) { if (fileName.toLowerCase().indexOf("gb2312") != -1 || fileName.toLowerCase().indexOf("gbk") != -1) { fileName = MimeUtility.decodeText(fileName); } if (request.getHeader("User-Agent").contains("Firefox")) { response.addHeader("content-disposition", "attachment;filename=" + fileName); } else if (request.getHeader("User-Agent").contains("MSIE")) { response.addHeader( "content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); } System.out.println("saveFile2"); saveFile(response, fileName, mpart.getInputStream()); } } } } else if (part.isMimeType("message/rfc822")) { saveEmailFiles(request, response, (Part) part.getContent()); } }
/** * Count the mail attachments' size, it is a total mail attachments' size. * * @param multi * @param mailAttachmentsSize * @return * @throws MessagingException * @throws IOException */ protected int countMailAttachmentsSize(Multipart multi, int mailAttachmentsSize) throws MessagingException, IOException { for (int i = 0, n = multi.getCount(); i < n; i++) { Part part = multi.getBodyPart(i); if (part.getContent() instanceof Multipart) { mailAttachmentsSize = this.countMailAttachmentsSize((Multipart) part.getContent(), mailAttachmentsSize); } int partSize = part.getSize(); if (partSize != -1) { mailAttachmentsSize = mailAttachmentsSize + partSize; } } return mailAttachmentsSize; }
public static void collectPartContent(Part part, MBMailMessage collector) throws Exception { Object partContent = part.getContent(); String contentType = part.getContentType().toLowerCase(); if ((part.getDisposition() != null) && (part.getDisposition().equalsIgnoreCase(MimeMessage.ATTACHMENT))) { if (_log.isDebugEnabled()) { _log.debug("Processing attachment"); } byte[] bytes = null; if (partContent instanceof String) { bytes = ((String) partContent).getBytes(); } else if (partContent instanceof InputStream) { bytes = JavaMailUtil.getBytes(part); } collector.addFile(part.getFileName(), bytes); } else { if (partContent instanceof MimeMultipart) { collectMultipartContent((MimeMultipart) partContent, collector); } else if (partContent instanceof String) { if (contentType.startsWith("text/html")) { collector.setHtmlBody((String) partContent); } else { collector.setPlainBody((String) partContent); } } } }
private static String getBody(Part msg, String contentType) throws MessagingException, IOException, SAXException { if (msg.getContentType().startsWith(contentType)) { return msg.getContent().toString(); } else if (msg.getContentType().startsWith("multipart/")) { MimeMultipart multi = (MimeMultipart) msg.getContent(); for (int i = 0; i < multi.getCount(); i++) { BodyPart part = multi.getBodyPart(i); String content = getBody(part); if (content != null) { return content; } } } return null; }
private void loadMail(Part p) throws Exception { Object content = p.getContent(); if (content instanceof Multipart) { Multipart mp = (Multipart) content; int cnt = mp.getCount(); for (int i = 0; i < cnt; i++) loadMail(mp.getBodyPart(i)); } }
/** * @param multipart // 接卸包裹(含所有邮件内容(包裹+正文+附件)) * @throws Exception */ private void reMultipart(Multipart multipart) throws Exception { // System.out.println("邮件共有" + multipart.getCount() + "部分组成"); // 依次处理各个部分 for (int j = 0, n = multipart.getCount(); j < n; j++) { // System.out.println("处理第" + j + "部分"); Part part = multipart.getBodyPart(j); // 解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容, // 也可能是另一个小包裹(MultipPart) // 判断此包裹内容是不是一个小包裹, 一般这一部分是 正文 Content-Type: multipart/alternative if (part.getContent() instanceof Multipart) { Multipart p = (Multipart) part.getContent(); // 转成小包裹 // 递归迭代 reMultipart(p); } else { rePart(part); } } }
public void getPartContent(Part part, StringBuilder sb) throws Exception { if (part.isMimeType("text/*")) { String s = (String) part.getContent(); if (s != null) { sb.append(s).append(" "); } } else if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart) part.getContent(); int count = mp.getCount(); if (part.isMimeType("multipart/alternative")) { count = 1; } for (int i = 0; i < count; i++) { getPartContent(mp.getBodyPart(i), sb); } } else if (part.isMimeType("message/rfc822")) { getPartContent((Part) part.getContent(), sb); } }
/** * Process the MimeMessage from simple Mail to get attachments and save them to disk. * * @param mime * @return * @throws IOException * @throws MessagingException */ private String processAttachmentsOfSimpleMail(MimeMessage mime) throws IOException, MessagingException { List<Attachment> attachList = new ArrayList<Attachment>(); if (mime.getContent() instanceof Multipart) { // Get the content of the messsage, it's an Multipart object like a package including all the // email text and attachment. Multipart multi = (Multipart) mime.getContent(); // First, verify the quantity and size of attachments. boolean isValidMailMsg = this.isValidMailMsg(multi); if (isValidMailMsg) { // process each part in order. for (int i = 0, n = multi.getCount(); i < n; i++) { // unpack, get each part of Multipart, part 0 may email text and part 1 may attachment. Or // it is another embedded Multipart. Part part1 = multi.getBodyPart(i); if (part1.isMimeType("multipart/related")) { if (part1.getContent() instanceof Multipart) { Multipart multi1 = (Multipart) part1.getContent(); for (int m = 0; m < multi1.getCount(); m++) { Part part2 = multi1.getBodyPart(m); if (!(part2.isMimeType("multipart/alternative") || part2.isMimeType("text/plain") || part2.isMimeType("text/html"))) { // This is an embedded picture, set it as an attachment. this.saveAttachment(part2, attachList); } } } } else { String disposition = part1.getDisposition(); if (disposition != null && Part.ATTACHMENT.equalsIgnoreCase(disposition)) { // Save the attachment if it is. this.saveAttachment(part1, attachList); } } } } } return JSONArray.fromObject(attachList).toString(); }
private void extractPart(final Part part) throws MessagingException, IOException { if (part.getContent() instanceof Multipart) { Multipart mp = (Multipart) part.getContent(); for (int i = 0; i < mp.getCount(); i++) { extractPart(mp.getBodyPart(i)); } return; } if (part.getContentType().startsWith("text/html")) { if (bodytext == null) { bodytext = (String) part.getContent(); } else { bodytext = bodytext + "<HR/>" + (String) part.getContent(); } } else if (!part.getContentType().startsWith("text/plain")) { Attachment attachment = new Attachment(); attachment.setContenttype(part.getContentType()); attachment.setFilename(part.getFileName()); InputStream in = part.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; int count = 0; while ((count = in.read(buffer)) >= 0) bos.write(buffer, 0, count); in.close(); attachment.setContent(bos.toByteArray()); attachments.add(attachment); } if (!StringUtils.isNull(bodytext) && bodytext.indexOf("Original Message") > -1) { subBody = bodytext.substring(0, bodytext.indexOf("Original Message")); } else if (!StringUtils.isNull(bodytext) && bodytext.indexOf(", \"[email protected]\" <*****@*****.**> wrote:") > -1) { String tempstr = bodytext.substring( 0, bodytext.indexOf(", \"[email protected]\" <*****@*****.**> wrote:")); subBody = tempstr.substring(0, tempstr.lastIndexOf("On")); } }
// x参数来确定是以html 1 格式显示还是以plain 2 // 调用时getPart(part,i,1); // 显示复杂邮件的正文内容 public String getPart(Part part, int partNum, int x) throws MessagingException, IOException { String s = ""; String s1 = ""; String s2 = ""; String s5 = ""; String sct = part.getContentType(); if (sct == null) { s = "part 无效"; return s; } ContentType ct = new ContentType(sct); if (ct.match("text/html") || ct.match("text/plain")) { // display text/plain inline s1 = "" + (String) part.getContent() + ""; } else if (partNum != 0) { String temp = ""; if ((temp = part.getFileName()) != null) { s2 = "Filename: " + temp + ""; } } if (part.isMimeType("multipart/alternative")) { String s6 = ""; String s7 = ""; Multipart mp = (Multipart) part.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) { if (mp.getBodyPart(i).isMimeType("text/plain")) s7 = getPart(mp.getBodyPart(i), i, 2); else if (mp.getBodyPart(i).isMimeType("text/html")) s6 = getPart(mp.getBodyPart(i), i, 1); } if (x == 1) { // html格式的字符串 s5 = s6; } if (x == 2) { // paint类型的字符串 s5 = s7; } return s5; } s = s1 + s2; return s; }
public static void collectPartContent(Part part, MBMailMessage mbMailMessage) throws Exception { Object partContent = part.getContent(); String contentType = StringUtil.toLowerCase(part.getContentType()); if ((part.getDisposition() != null) && StringUtil.equalsIgnoreCase(part.getDisposition(), MimeMessage.ATTACHMENT)) { if (_log.isDebugEnabled()) { _log.debug("Processing attachment"); } byte[] bytes = null; if (partContent instanceof String) { bytes = ((String) partContent).getBytes(); } else if (partContent instanceof InputStream) { bytes = JavaMailUtil.getBytes(part); } mbMailMessage.addBytes(part.getFileName(), bytes); } else { if (partContent instanceof MimeMultipart) { MimeMultipart mimeMultipart = (MimeMultipart) partContent; collectMultipartContent(mimeMultipart, mbMailMessage); } else if (partContent instanceof String) { Map<String, Object> options = new HashMap<String, Object>(); options.put("emailPartToMBMessageBody", Boolean.TRUE); String messageBody = SanitizerUtil.sanitize( 0, 0, 0, MBMessage.class.getName(), 0, contentType, Sanitizer.MODE_ALL, (String) partContent, options); if (contentType.startsWith(ContentTypes.TEXT_HTML)) { mbMailMessage.setHtmlBody(messageBody); } else { mbMailMessage.setPlainBody(messageBody); } } } }
public static Part getTextFromMultipart(Part p) throws MessagingException, IOException { Part text = null; if (p.isMimeType("multipart/*")) { System.out.println("rec"); Multipart mp = (Multipart) p.getContent(); int count = mp.getCount(); for (int i = 0; i < count; ) return getTextFromMultipart(mp.getBodyPart(i)); } else if (p.isMimeType("text/plain")) { System.out.println("text"); text = p; } return text; }
private void analizaParteDeMensaje(Part unaParte, Mensaje myMensaje) { try { // Si es multipart, se analiza cada una de sus partes recursivamente. if (unaParte.isMimeType("multipart/*")) { Multipart multi; multi = (Multipart) unaParte.getContent(); for (int j = 0; j < multi.getCount(); j++) { analizaParteDeMensaje(multi.getBodyPart(j), myMensaje); } } else { // Si es texto, se escribe el texto. if (unaParte.isMimeType("text/*")) { myMensaje.agregarTextoPlano((String) unaParte.getContent()); } else { salvaUnFichero(unaParte, myMensaje); } } } catch (Exception e) { e.printStackTrace(); } }
/** @param multipart */ private void handleContent(Multipart multipart, String contentType) { Log.debug(this, "handleContent"); try { // String contentType=multipart.getContentType(); for (int j = 0; j < multipart.getCount(); j++) { Part part = multipart.getBodyPart(j); Log.debug(this, String.valueOf(part.getLineCount())); Log.debug(this, String.valueOf(part.getContent())); Log.debug(this, String.valueOf(part.getContentType())); if (HiltonUtility.isEmpty(contentType) || part.getContentType().indexOf(contentType) >= 0) { String disposition = part.getDisposition(); Log.debug(this, "handleContent-disposition: " + disposition); // if (disposition != null) // { InputStream inputStream = part.getInputStream(); byte[] buffer = new byte[inputStream.available()]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) > -1) // Read // bytes // until // EOF { Log.debug(this, "reading contents"); } String tmp = new String(buffer); this.bodytext.append(tmp); this.bodytext.append("\r\n"); Log.debug(this, "handleContent: " + tmp); if (inputStream != null) { try { inputStream.close(); } catch (IOException io) { Log.error(this, " error Closing InputStream" + io.getMessage()); io.printStackTrace(); } } } } // } } catch (Exception e) { Log.error(this, e.getMessage()); e.printStackTrace(); } }
private static Object _getPartContent(Part part) throws Exception { // See LPS-56173 Thread currentThread = Thread.currentThread(); ClassLoader classLoader = currentThread.getContextClassLoader(); try { currentThread.setContextClassLoader(Part.class.getClassLoader()); return part.getContent(); } finally { currentThread.setContextClassLoader(classLoader); } }
public static InputStream getAttachment(Part part, String filename) { try { if (filename.equals(part.getFileName())) return part.getInputStream(); if (part.getContentType().toLowerCase().startsWith("multipart")) { MimeMultipart multipart; multipart = (MimeMultipart) part.getContent(); int count = multipart.getCount(); for (int i = 0; i < count; i++) { InputStream in = getAttachment(multipart.getBodyPart(i), filename); if (in != null) return in; } } } catch (Throwable ex) { throw new RuntimeException(ex); } return null; }
/** * @param parent * @return */ private Part findImagePart(Part parent) { try { if (MessageUtils.isImagepart(parent)) { return parent; } else if (parent.isMimeType("multipart/*")) { Multipart mp; mp = (Multipart) parent.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) { Part subPart = findImagePart(mp.getBodyPart(i)); if (subPart != null) { return subPart; } } } } catch (MessagingException e) { log.error(e.getMessage(), e); } catch (IOException e) { log.error(e.getMessage(), e); } return null; }
public static Set<String> getAttachmentFilenames(Part part) { try { Set<String> result = new HashSet<String>(); if (part.getContentType().toLowerCase().startsWith("multipart")) { MimeMultipart multipart; try { multipart = (MimeMultipart) part.getContent(); int count = multipart.getCount(); for (int i = 0; i < count; i++) { result.addAll(getAttachmentFilenames(multipart.getBodyPart(i))); } } catch (NullPointerException ex) { // part.getContent() throws NullPointerException LOG.info(ex); } } else { String filename = part.getFileName(); if (filename != null) result.add(Str.decodeQuotedPrintable(filename)); } return result; } catch (Exception ex) { throw new RuntimeException(ex); } }
public void service(Mail mail) throws MessagingException { System.out.println("MyAppletStarted!!!"); MimeMessage message = mail.getMessage(); String contentType = message.getContentType(); System.out.println(contentType); if (message.isMimeType("text/plain")) { try { System.out.println("Extract data"); MailAddress from = mail.getSender(); Collection<MailAddress> to = mail.getRecipients(); String suser = from.getUser(); String shost = from.getHost(); String seadr = suser + "@" + shost; String text = (String) message.getContent(); output = new FileWriter(folder + seadr + "" + (++num) + ".txt"); output.write("E-mail FROM: " + seadr + "\n"); output.write("E-mail TO: "); for (Iterator<MailAddress> iterator = to.iterator(); iterator.hasNext(); ) { output.write(iterator.next().toString() + ","); } output.write("E-mail text body: " + text); System.out.println("Changes mail-body"); message.setContent(modifyTextBody(text, key), contentType); message.setHeader(RFC2822Headers.CONTENT_TYPE, contentType); message.saveChanges(); output.close(); } catch (IOException ex) { log("Unable to get text from " + mail.getName()); } } else if (message.isMimeType("multipart/mixed") || message.isMimeType("multipart/related")) { try { // здесь надо сохранить аттачи Multipart mp = (Multipart) message.getContent(); System.out.println("PartsNum: " + mp.getCount()); for (int i = 0, n = mp.getCount(); i < n; i++) { Part part = mp.getBodyPart(i); if (part.isMimeType("text/plain")) { System.out.println("Try to modify text"); // message.setContent(modifyTextBody((String)part.getContent(),key), // part.getContentType()); // message.saveChanges(); part.setContent(modifyTextBody((String) part.getContent(), key), part.getContentType()); boolean removeBodyPart = mp.removeBodyPart((BodyPart) part); System.out.println("Removed: " + removeBodyPart); mp.addBodyPart((BodyPart) part, i); message.setContent(mp); } else { String disposition = part.getDisposition(); System.out.println("Disposition " + disposition); if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT) || (disposition.equals(Part.INLINE))))) { saveFile(part.getFileName(), part.getInputStream()); System.out.println("Try to modify attache"); byte[] new_attach = this.modifyAttachments(part.getInputStream(), key); part.setContent(new_attach, part.getContentType()); part.setFileName("encrypted" + i); boolean removeBodyPart = mp.removeBodyPart((BodyPart) part); System.out.println("Removed: " + removeBodyPart); mp.addBodyPart((BodyPart) part, i); message.setContent(mp); System.out.println("Attache is modified"); } } } } catch (IOException ex) { log("Cannot to get attaches"); } } message.setHeader(RFC2822Headers.CONTENT_TYPE, contentType); message.saveChanges(); System.out.println("Ended"); }
/* * This method checks for content-type * based on which, it processes and * fetches the content of the message */ public static void writePart(Part p, MailInfo mailInfo) throws Exception { if (p instanceof Message) // Call methos writeEnvelope writeEnvelope((Message) p, mailInfo); log.info("----------------------------"); log.info("CONTENT-TYPE: " + p.getContentType()); // check if the content is plain text if (p.isMimeType("text/plain")) { log.info("This is plain text"); log.info("---------------------------"); log.info((String) p.getContent()); mailInfo.setBody(p.getContent().toString()); } // check if the content has attachment else if (p.isMimeType("multipart/*")) { log.info("This is a Multipart"); log.info("---------------------------"); Multipart mp = (Multipart) p.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) writePart(mp.getBodyPart(i), mailInfo); } // check if the content is a nested message else if (p.isMimeType("message/rfc822")) { log.info("This is a Nested Message"); log.info("---------------------------"); writePart((Part) p.getContent(), mailInfo); } // check if the content is an inline image else if (p.isMimeType("image/jpeg")) { log.info("--------> image/jpeg"); Object o = p.getContent(); InputStream x = (InputStream) o; ByteArrayOutputStream bos = new ByteArrayOutputStream(); IOUtils.copy(x, bos); NamedContent namedContent = new NamedContent(); namedContent.setName(p.getFileName()); namedContent.setType(p.getContentType()); namedContent.setContent(bos.toByteArray()); mailInfo.getAttachments().add(namedContent); } else if (p.isMimeType("image/png")) { log.info("--------> image/png"); Object o = p.getContent(); InputStream x = (InputStream) o; ByteArrayOutputStream bos = new ByteArrayOutputStream(); IOUtils.copy(x, bos); NamedContent namedContent = new NamedContent(); namedContent.setName(p.getFileName()); namedContent.setType(p.getContentType()); namedContent.setContent(bos.toByteArray()); mailInfo.getAttachments().add(namedContent); } else if (p.getContentType().contains("image/")) { log.info("content type" + p.getContentType()); File f = new File("image" + new Date().getTime() + ".jpg"); DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f))); com.sun.mail.util.BASE64DecoderStream test = (com.sun.mail.util.BASE64DecoderStream) p.getContent(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = test.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } } else { Object o = p.getContent(); if (o instanceof String) { log.info("This is a string"); log.info("---------------------------"); log.info((String) o); } else if (o instanceof InputStream) { log.info("This is just an input stream"); log.info("---------------------------"); InputStream is = (InputStream) o; is = (InputStream) o; int c; while ((c = is.read()) != -1) System.out.write(c); } else { log.info("This is an unknown type"); log.info("---------------------------"); log.info(o.toString()); } } }
private String getMainPartText(Part mainPart) throws MessagingException, IOException { return (String) ((Multipart) mainPart.getContent()).getBodyPart(0).getContent(); }
public static void dumpPart(Part p, biz.systempartners.claims.ClaimsViewer claimsViewer) throws Exception { if (p instanceof Message) dumpEnvelope((Message) p); /** * Dump input stream .. * * <p>InputStream is = p.getInputStream(); // If "is" is not already buffered, wrap a * BufferedInputStream // around it. if (!(is instanceof BufferedInputStream)) is = new * BufferedInputStream(is); int c; while ((c = is.read()) != -1) System.out.write(c); */ String ct = p.getContentType(); try { pr("CONTENT-TYPE: " + (new ContentType(ct)).toString()); } catch (ParseException pex) { pr("BAD CONTENT-TYPE: " + ct); } String filename = p.getFileName(); if (filename != null) pr("FILENAME: " + filename); /* * Using isMimeType to determine the content type avoids * fetching the actual content data until we need it. */ if (p.isMimeType("text/plain")) { pr("This is plain text"); pr("---------------------------"); if (!showStructure && !saveAttachments) System.out.println((String) p.getContent()); } else if (p.isMimeType("multipart/*")) { pr("This is a Multipart"); pr("---------------------------"); Multipart mp = (Multipart) p.getContent(); level++; int count = mp.getCount(); for (int i = 0; i < count; i++) dumpPart(mp.getBodyPart(i), claimsViewer); level--; } else if (p.isMimeType("message/rfc822")) { pr("This is a Nested Message"); pr("---------------------------"); level++; dumpPart((Part) p.getContent(), claimsViewer); level--; } else { if (!showStructure && !saveAttachments) { /* * If we actually want to see the data, and it's not a * MIME type we know, fetch it and check its Java type. */ Object o = p.getContent(); if (o instanceof String) { pr("This is a string"); pr("---------------------------"); System.out.println((String) o); } else if (o instanceof InputStream) { pr("This is just an input stream"); pr("---------------------------"); InputStream is = (InputStream) o; int c; while ((c = is.read()) != -1) System.out.write(c); } else { pr("This is an unknown type"); pr("---------------------------"); pr(o.toString()); } } else { // just a separator pr("---------------------------"); } } /* * If we're saving attachments, write out anything that * looks like an attachment into an appropriately named * file. Don't overwrite existing files to prevent * mistakes. */ if (saveAttachments && level != 0 && !p.isMimeType("multipart/*")) { String disp = p.getDisposition(); // many mailers don't include a Content-Disposition if (disp == null || disp.equalsIgnoreCase(Part.ATTACHMENT)) { if (filename == null) filename = "Attachment" + attnum++; pr("Saving attachment to file " + filename); try { File f = new File(System.getProperty("user.dir"), filename); /* if (f.exists()) // XXX - could try a series of names throw new IOException("file exists");*/ OutputStream os = new BufferedOutputStream(new FileOutputStream(f)); InputStream is = p.getInputStream(); int c; while ((c = is.read()) != -1) os.write(c); os.close(); if (p.isMimeType("text/xml") || p.isMimeType("application/octet-stream")) { processBrRequisitionFile( f, claimsViewer, claimsViewer.getInvoiceVector(), claimsViewer.getFilesVector()); } System.out.println("I have saved file [" + f.getAbsolutePath() + "]"); } catch (IOException ex) { pr("Failed to save attachment: " + ex); } pr("---------------------------"); } } }
/** * Process the MimeMessage for signed mail with/without attachment. * * @param mime * @param mailMsg * @return * @throws MessagingException * @throws IOException * @throws ParseException */ private String processSignedMail(MimeMessage mime, MailMessage mailMsg) throws IOException, MessagingException, ParseException { this.setMailBasicInfoForMailMsg(mime, mailMsg); String txtBody = null; String htmlBody = null; // Get the content of the messsage, it's an Multipart object like a package including all the // email text and attachment. Multipart multi1 = (Multipart) mime.getContent(); // process each part in order. for (int i = 0, n = multi1.getCount(); i < n; i++) { // unpack, get each part of Multipart, part 0 may email text and part 1 may attachment. Or it // is another embedded Multipart. Part part2 = multi1.getBodyPart(i); // determine Part is email text or Multipart. if (part2.getContent() instanceof Multipart) { Multipart multi2 = (Multipart) part2.getContent(); // First, verify the quantity and size of attachments. boolean isValidMailMsg = this.isValidMailMsg(multi2); if (isValidMailMsg) { // process the content in multi2. for (int j = 0; j < multi2.getCount(); j++) { Part part3 = multi2.getBodyPart(j); if (part3.isMimeType("text/plain") && !Part.ATTACHMENT.equalsIgnoreCase(part3.getDisposition())) { txtBody = part3.getContent().toString(); } else if (part3.isMimeType("text/html") && !Part.ATTACHMENT.equalsIgnoreCase(part3.getDisposition())) { htmlBody = part3.getContent().toString(); } else if (part3.isMimeType("multipart/alternative")) { // generally if the content type multipart/alternative, it is email text. if (part3.getContent() instanceof Multipart) { Multipart multi3 = (Multipart) part3.getContent(); for (int k = 0; k < multi3.getCount(); k++) { Part part4 = multi3.getBodyPart(k); if (part4.isMimeType("text/plain") && !Part.ATTACHMENT.equalsIgnoreCase(part4.getDisposition())) { txtBody = part4.getContent().toString(); } else if (part4.isMimeType("text/html") && !Part.ATTACHMENT.equalsIgnoreCase(part4.getDisposition())) { htmlBody = part4.getContent().toString(); } } } } else if (part3.isMimeType("multipart/related")) { if (part3.getContent() instanceof Multipart) { Multipart multi3 = (Multipart) part3.getContent(); for (int m = 0; m < multi3.getCount(); m++) { Part part4 = multi3.getBodyPart(m); if (part4.isMimeType("multipart/alternative")) { if (part4.getContent() instanceof Multipart) { Multipart multi4 = (Multipart) part4.getContent(); for (int p = 0; p < multi4.getCount(); p++) { Part part5 = multi4.getBodyPart(p); if (part5.isMimeType("text/plain") && !Part.ATTACHMENT.equalsIgnoreCase(part5.getDisposition())) { txtBody = part5.getContent().toString(); } else if (part5.isMimeType("text/html") && !Part.ATTACHMENT.equalsIgnoreCase(part5.getDisposition())) { htmlBody = part5.getContent().toString(); } } } } else { // This is an embedded picture, set it as an attachment. mailMsg.setHasAttachments(true); } } } } else { String disposition = part3.getDisposition(); if (disposition != null && Part.ATTACHMENT.equalsIgnoreCase(disposition)) { mailMsg.setHasAttachments(true); } } } } } else { // This is a certificate file, set it as an attachment String disposition = part2.getDisposition(); if (disposition != null && Part.ATTACHMENT.equalsIgnoreCase(disposition)) { mailMsg.setHasAttachments(true); } } } if (!isNull(txtBody)) { mailMsg.setBody(txtBody); } else { mailMsg.setBody(htmlBody); } return JSONObject.fromObject(mailMsg).toString(); }
public static String getTextContent(Part part, String type) { if (part == null) return null; try { String contentType; try { contentType = part.getContentType(); } catch (Throwable t) { contentType = "unknown"; } if (contentType.toLowerCase().startsWith("text/" + type)) { // ContentType ct = new ContentType(contentType); // String charset = ct.getParameter("charset"); try { Object content = part.getContent(); if (content == null) return null; if (content instanceof String) return (String) content; if (content instanceof InputStream) { String encoding = charset; if (contentType.toLowerCase().contains("UTF")) encoding = IO.UTF_8; if (contentType.toLowerCase().contains("ISO")) encoding = IO.ISO_LATIN_1; return IO.readToString((InputStream) content, encoding); } return Utl.toStringWithType(content); } catch (UnsupportedEncodingException ex) { LOG.warn(ex); return null; } catch (IOException e) { String message = e.getMessage(); if (message != null) { if ("No content".equals(message)) { return null; } if (message.toLowerCase().startsWith("unknown encoding")) { LOG.warn(e); return null; } } throw e; } catch (Throwable t) { LOG.warn(t); return Str.getStackTrace(t); } } if (contentType.toLowerCase().startsWith("multipart")) { MimeMultipart multipart; try { multipart = (MimeMultipart) part.getContent(); } catch (NullPointerException ex) { LOG.warn(ex); return null; } int count = multipart.getCount(); for (int i = 0; i < count; i++) { BodyPart subPart = multipart.getBodyPart(i); String filename = subPart.getFileName(); if (filename != null) continue; String text = getTextContent(subPart, type); if (text != null) return text.trim(); } return null; } return null; } catch (Exception ex) { throw new RuntimeException(ex); } }
/** * Packt die verschachtelten Parts einer Message in eine flache List (DisplayParts) und in eine * Map (InlineParts). * * @param part Aktuell zu behandelnder Part * @param displayParts List, in die die DisplayParts einsortiert werden. * @param inlineParts Map, in die die InlineParts gepackt werden. * @param multiparts Map, in die Multiparts gepackt werden. */ private static void deflateMessageParts( Part part, List<Part> displayParts, Map<String, Part> inlineParts, Map<Multipart, List<Integer>> multiparts) throws IOException, MessagingException { // Versuchen, den Part-Content einlesen Object partContent = null; try { partContent = part.getContent(); } catch (Exception e) { // Part scheint kaputt zu sein - sollen sich andere damit // rumschlagen. addDisplayPart(part, displayParts, multiparts); } // Wenn Part-Content MultiPart ist, uns selbst fuer jeden Part rekursiv // aufrufen. if (partContent instanceof Multipart) { Multipart actMultipart = (Multipart) partContent; multiparts.put(actMultipart, (new ArrayList<Integer>())); for (int tt = 0; tt < actMultipart.getCount(); tt++) { deflateMessageParts(actMultipart.getBodyPart(tt), displayParts, inlineParts, multiparts); } } // Wenn PartContent vom Typ Message, uns selbst mit PartContent // aufrufen. // Ausser der Content-Type des Parts(!) ist "text/rfc822-headers", dann // darf // nicht versucht werden zu deflaten, da hier der PartContent kein Body // hat // (Exception "Missing start boundary") else if ((partContent instanceof Message) && (part.getContentType().toLowerCase().indexOf("rfc822-headers") < 0)) { deflateMessageParts((Message) partContent, displayParts, inlineParts, multiparts); } // For content-types that are unknown to the DataHandler system, an // input // stream is returned as the content... // // BASE64DecoderStreams duerfen nicht in einen String geparst werden! else if ((partContent instanceof InputStream) && (!(partContent instanceof BASE64DecoderStream))) { BufferedInputStream bufReader = new BufferedInputStream((InputStream) partContent); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] inBuf = new byte[4096]; int len = 0; while ((len = bufReader.read(inBuf)) > 0) { baos.write(inBuf, 0, len); } bufReader.close(); part.setContent(baos.toString(), part.getContentType()); addDisplayPart(part, displayParts, multiparts); } // Ist Part ein InlinePart? Dann in die DisplayParts-List packen. // 1.) Part muss MimeBodyPart sein // 2.) Part muss eine Content-ID haben. // 3.) Parent-Part muss "Content-Type: multipart/related;" haben. // 4.) Wenn "Content-Disposition" am Start, muss es "inline" sein. else if ((part instanceof MimeBodyPart) && (((MimeBodyPart) part).getContentID() != null) && (((MimeBodyPart) part).getContentID().trim().length() >= 1) && (((MimeBodyPart) part).getParent().getContentType() != null) && (((MimeBodyPart) part) .getParent() .getContentType() .toLowerCase() .indexOf("multipart/related") >= 0) && ((part.getDisposition() == null) || part.getDisposition().equalsIgnoreCase(Part.INLINE))) { inlineParts.put(cleanContentID(((MimePart) part).getContentID()), part); } // Sonst den aktuellen Part einfach in die DisplayParts-List packen. else { addDisplayPart(part, displayParts, multiparts); } }