List of usage examples for javax.mail Part getInputStream
public InputStream getInputStream() throws IOException, MessagingException;
From source file:org.pentaho.di.job.entries.getpop.MailConnection.java
private void handlePart(String foldername, Part part, Pattern pattern) throws KettleException { try {//from w w w. j a va 2s .c om String disposition = part.getDisposition(); // The RFC2183 doesn't REQUIRE Content-Disposition header field so we'll create one to // fake out the code below. if (disposition == null || disposition.length() < 1) { disposition = Part.ATTACHMENT; } if (disposition.equalsIgnoreCase(Part.ATTACHMENT) || disposition.equalsIgnoreCase(Part.INLINE)) { String MimeText = null; try { MimeText = MimeUtility.decodeText(part.getFileName()); } catch (Exception e) { // Ignore errors } if (MimeText != null) { String filename = MimeUtility.decodeText(part.getFileName()); if (isWildcardMatch(filename, pattern)) { // Save file saveFile(foldername, filename, part.getInputStream()); updateSavedAttachedFilesCounter(); if (log.isDetailed()) { log.logDetailed(BaseMessages.getString(PKG, "JobGetMailsFromPOP.AttachedFileSaved", filename, "" + getMessage().getMessageNumber(), foldername)); } } } } } catch (Exception e) { throw new KettleException(e); } }
From source file:org.alfresco.repo.content.transform.EMLParser.java
/** * Adapted extract multipart is the recusrsive parser that splits the data and apend it to the * final xhtml file./*from www . j av a 2 s. c o m*/ * * @param xhtml * the xhtml * @param part * the part * @param parentPart * the parent part * @param context * the context * @throws MessagingException * the messaging exception * @throws IOException * Signals that an I/O exception has occurred. * @throws SAXException * the sAX exception * @throws TikaException * the tika exception */ public void adaptedExtractMultipart(XHTMLContentHandler xhtml, Part part, Part parentPart, ParseContext context) throws MessagingException, IOException, SAXException, TikaException { String disposition = part.getDisposition(); if ((disposition != null && disposition.contains(Part.ATTACHMENT))) { return; } if (part.isMimeType("text/plain")) { if (parentPart != null && parentPart.isMimeType(MULTIPART_ALTERNATIVE)) { return; } else { // add file String data = part.getContent().toString(); writeContent(part, data, MimetypeMap.MIMETYPE_TEXT_PLAIN, "txt"); } } else if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart) part.getContent(); Part parentPartLocal = part; if (parentPart != null && parentPart.isMimeType(MULTIPART_ALTERNATIVE)) { parentPartLocal = parentPart; } int count = mp.getCount(); for (int i = 0; i < count; i++) { adaptedExtractMultipart(xhtml, mp.getBodyPart(i), parentPartLocal, context); } } else if (part.isMimeType("message/rfc822")) { adaptedExtractMultipart(xhtml, (Part) part.getContent(), part, context); } else if (part.isMimeType("text/html")) { if ((parentPart != null && parentPart.isMimeType(MULTIPART_ALTERNATIVE)) || (part.getDisposition() == null || !part.getDisposition().contains(Part.ATTACHMENT))) { Object data = part.getContent(); String htmlFileData = prepareString(new String(data.toString())); writeContent(part, htmlFileData, MimetypeMap.MIMETYPE_HTML, "html"); } } else if (part.isMimeType("image/*")) { String[] encoded = part.getHeader("Content-Transfer-Encoding"); if (isContained(encoded, "base64")) { if (part.getDisposition() != null && part.getDisposition().contains(Part.ATTACHMENT)) { InputStream stream = part.getInputStream(); byte[] binaryData = new byte[part.getSize()]; stream.read(binaryData, 0, part.getSize()); String encodedData = new String(Base64.encodeBase64(binaryData)); String[] split = part.getContentType().split(";"); String src = "data:" + split[0].trim() + ";base64," + encodedData; AttributesImpl attributes = new AttributesImpl(); attributes.addAttribute(null, "src", "src", "String", src); xhtml.startElement("img", attributes); xhtml.endElement("img"); } } } else { Object content = part.getContent(); if (content instanceof String) { xhtml.element("div", prepareString(part.getContent().toString())); } else if (content instanceof InputStream) { InputStream fileContent = part.getInputStream(); Parser parser = new AutoDetectParser(); Metadata attachmentMetadata = new Metadata(); BodyContentHandler handlerAttachments = new BodyContentHandler(); parser.parse(fileContent, handlerAttachments, attachmentMetadata, context); xhtml.element("div", handlerAttachments.toString()); } } }
From source file:com.naryx.tagfusion.cfm.mail.cfPOP3.java
private void retrieveBody(cfSession _Session, Part Mess, cfQueryResultData popData, int Row, File attachmentDir) throws Exception { if (Mess.isMimeType("multipart/*")) { Multipart mp = (Multipart) Mess.getContent(); int count = mp.getCount(); for (int i = 0; i < count; i++) retrieveBody(_Session, mp.getBodyPart(i), popData, Row, attachmentDir); } else {/*from www. j ava 2 s . c o m*/ String filename = cfMailMessageData.getFilename(Mess); String dispos = Mess.getDisposition(); // note: text/enriched shouldn't be treated as a text part of the email (see bug #2227) if ((dispos == null || dispos.equalsIgnoreCase(Part.INLINE)) && Mess.isMimeType("text/*") && !Mess.isMimeType("text/enriched")) { String content; String contentType = Mess.getContentType().toLowerCase(); // support aliases of UTF-7 - UTF7, UNICODE-1-1-UTF-7, csUnicode11UTF7, UNICODE-2-0-UTF-7 if (contentType.indexOf("utf-7") != -1 || contentType.indexOf("utf7") != -1) { content = new String(UTF7Converter.convert(readInputStream(Mess))); } else { try { content = (String) Mess.getContent(); } catch (UnsupportedEncodingException e) { content = "Unable to retrieve message body due to UnsupportedEncodingException:" + e.getMessage(); } catch (ClassCastException e) { // shouldn't happen but handle it gracefully content = new String(readInputStream(Mess)); } } if (Mess.isMimeType("text/html")) { popData.setCell(Row, 14, new cfStringData(content)); } else if (Mess.isMimeType("text/plain")) { popData.setCell(Row, 15, new cfStringData(content)); } popData.setCell(Row, 11, new cfStringData(content)); } else if (attachmentDir != null) { File outFile; if (filename == null) filename = "unknownfile"; outFile = getAttachedFilename(attachmentDir, filename, getDynamic(_Session, "GENERATEUNIQUEFILENAMES").getBoolean()); try { BufferedInputStream in = new BufferedInputStream(Mess.getInputStream()); BufferedOutputStream out = new BufferedOutputStream( cfEngine.thisPlatform.getFileIO().getFileOutputStream(outFile)); IOUtils.copy(in, out); out.flush(); out.close(); in.close(); //--[ Update the fields cfStringData cell = (cfStringData) popData.getCell(Row, 12); if (cell.getString().length() == 0) cell = new cfStringData(filename); else cell = new cfStringData(cell.getString() + "," + filename); popData.setCell(Row, 12, cell); cell = (cfStringData) popData.getCell(Row, 13); if (cell.getString().length() == 0) cell = new cfStringData(outFile.toString()); else cell = new cfStringData(cell.getString() + "," + outFile.toString()); popData.setCell(Row, 13, cell); } catch (Exception ignoreException) { } } } }
From source file:org.apache.axis2.transport.mail.SimpleMailListener.java
private void buildSOAPEnvelope(MimeMessage msg, MessageContext msgContext) throws AxisFault { //TODO we assume for the time being that there is only one attachement and this attachement contains the soap evelope try {/*from w ww.j a v a2s.c o m*/ Multipart mp = (Multipart) msg.getContent(); if (mp != null) { for (int i = 0, n = mp.getCount(); i < n; i++) { Part part = mp.getBodyPart(i); String disposition = part.getDisposition(); if (disposition != null && disposition.equalsIgnoreCase(Part.ATTACHMENT)) { String soapAction; /* Set the Charactorset Encoding */ String contentType = part.getContentType(); String charSetEncoding = BuilderUtil.getCharSetEncoding(contentType); if (charSetEncoding != null) { msgContext.setProperty(org.apache.axis2.Constants.Configuration.CHARACTER_SET_ENCODING, charSetEncoding); } else { msgContext.setProperty(org.apache.axis2.Constants.Configuration.CHARACTER_SET_ENCODING, MessageContext.DEFAULT_CHAR_SET_ENCODING); } /* SOAP Action */ soapAction = getMailHeaderFromPart(part, org.apache.axis2.transport.mail.Constants.HEADER_SOAP_ACTION); msgContext.setSoapAction(soapAction); String contentDescription = getMailHeaderFromPart(part, "Content-Description"); /* As an input stream - using the getInputStream() method. Any mail-specific encodings are decoded before this stream is returned.*/ if (contentDescription != null) { msgContext.setTo(new EndpointReference(contentDescription)); } if (contentType.indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE) > -1) { TransportUtils.processContentTypeForAction(contentType, msgContext); } else { // According to the mail sepec, mail transport should support only // application/soap+xml; String message = "According to the mail sepec, mail transport " + "should support only application/soap+xml"; log.error(message); throw new AxisFault(message); } String cte = getMailHeaderFromPart(part, "Content-Transfer-Encoding"); if (!(cte != null && cte.equalsIgnoreCase("base64"))) { String message = "Processing of Content-Transfer-Encoding faild."; log.error(message); throw new AxisFault(message); } InputStream inputStream = part.getInputStream(); SOAPEnvelope envelope = TransportUtils.createSOAPMessage(msgContext, inputStream, contentType); msgContext.setEnvelope(envelope); } } } } catch (IOException e) { throw new AxisFault(e.getMessage(), e); } catch (MessagingException e) { throw new AxisFault(e.getMessage(), e); } catch (XMLStreamException e) { throw new AxisFault(e.getMessage(), e); } }
From source file:com.flexoodb.common.FlexUtils.java
/** * method to obtain a FileContainer containing the file wrapped in a mimemessage. * * @param data the mimemessage in a byte array. * @return a FileContainer containing the file. *//*from w w w .jav a 2 s .co m*/ static public FileContainer extractFileFromMimeMessage(byte[] data) throws Exception { FileContainer fc = null; MimeMessage message = new MimeMessage(null, new ByteArrayInputStream(data)); Object content = message.getContent(); if (content instanceof Multipart) { Multipart multipart = (Multipart) content; for (int i = 0, n = multipart.getCount(); i < n; i++) { Part part = multipart.getBodyPart(i); String disposition = part.getDisposition(); if ((disposition != null) && (disposition.equals(Part.ATTACHMENT) || (disposition.equals(Part.INLINE)))) { if (part.getFileName() != null) { fc = new FileContainer(part.getFileName(), part.getFileName(), getBytesFromInputStream(part.getInputStream())); break; } } } } return fc; }
From source file:edu.stanford.muse.email.EmailFetcherStats.java
/** * this method returns the text content of the message as a list of strings * // each element of the list could be the content of a multipart message * // m is the top level subject//from w w w . jav a2 s . co m * // p is the specific part that we are processing (p could be == m) * also sets up names of attachments (though it will not download the * attachment unless downloadAttachments is true) */ private List<String> processMessagePart(int messageNum, Message m, Part p, List<Blob> attachmentsList) throws MessagingException, IOException { List<String> list = new ArrayList<String>(); // return list if (p == null) { dataErrors.add("part is null: " + folder_name() + " idx " + messageNum); return list; } if (p == m && p.isMimeType("text/html")) { /* String s = "top level part is html! message:" + m.getSubject() + " " + m.getDescription(); dataErrors.add(s); */ // we don't normally expect the top-level part to have content-type text/html // but we saw this happen on some sample archives pst -> emailchemy. so allow it and handle it by parsing the html String html = (String) p.getContent(); String text = Util.unescapeHTML(html); org.jsoup.nodes.Document doc = Jsoup.parse(text); StringBuilder sb = new StringBuilder(); HTMLUtils.extractTextFromHTML(doc.body(), sb); list.add(sb.toString()); return list; } if (p.isMimeType("text/plain")) { //make sure, p is not wrongly labelled as plain text. Enumeration headers = p.getAllHeaders(); boolean dirty = false; if (headers != null) while (headers.hasMoreElements()) { Header h = (Header) headers.nextElement(); String name = h.getName(); String value = h.getValue(); if (name != null && value != null) { if (name.equals("Content-transfer-encoding") && value.equals("base64")) { dirty = true; break; } } } String fname = p.getFileName(); if (fname != null) { int idx = fname.lastIndexOf('.'); if ((idx < fname.length()) && (idx >= 0)) { String extension = fname.substring(idx); //anything extension other than .txt is suspicious. if (!extension.equals(".txt")) dirty = true; } } if (dirty) { dataErrors.add("Dirty message part, has conflicting message part headers." + folder_name() + " Message# " + messageNum); return list; } log.debug("Message part with content type text/plain"); String content; String type = p.getContentType(); // new InputStreamReader(p.getInputStream(), "UTF-8"); try { // if forced encoding is set, we read the string with that encoding, otherwise we just use whatever p.getContent gives us if (FORCED_ENCODING != null) { byte b[] = Util.getBytesFromStream(p.getInputStream()); content = new String(b, FORCED_ENCODING); } else content = (String) p.getContent(); } catch (UnsupportedEncodingException uee) { dataErrors.add("Unsupported encoding: " + folder_name() + " Message #" + messageNum + " type " + type + ", using brute force conversion"); // a particularly nasty issue:javamail can't handle utf-7 encoding which is common with hotmail and exchange servers. // we're using the workaround suggested on this page: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4304013 // though it may be better to consider official support for utf-7 or other encodings. // TOFIX: I get an exception for utfutf8-encoding which has a base64 encoding embedded on it. // Unsupported encoding: gmail-sent Message #10477 type text/plain; charset=x-utf8utf8; name="newyorker.txt", // the hack below doesn't work for it. ByteArrayOutputStream bao = new ByteArrayOutputStream(); p.writeTo(bao); content = bao.toString(); } list.add(content); } else if (p.isMimeType("multipart/*") || p.isMimeType("message/rfc822")) { // rfc822 mime type is for embedded mbox format or some such (appears for things like // forwarded messages). the content appears to be just a multipart. Object o = p.getContent(); if (o instanceof Multipart) { Multipart allParts = (Multipart) o; if (p.isMimeType("multipart/alternative")) { // this is an alternative mime type. v common case to have text and html alternatives // so just process the text part if there is one, and avoid fetching the alternatives. // useful esp. because many ordinary messages are alternative: text and html and we don't want to fetch the html. // revisit in future we want to retain the html alternative for display purposes Part[] parts = new Part[allParts.getCount()]; for (int i = 0; i < parts.length; i++) parts[i] = allParts.getBodyPart(i); for (int i = 0; i < parts.length; i++) { Part thisPart = parts[i]; if (thisPart.isMimeType("text/plain")) { // common case, return quickly list.add((String) thisPart.getContent()); log.debug("Multipart/alternative with content type text/plain"); return list; } } // no text part, let's look for an html part. this happens for html parts. for (int i = 0; i < allParts.getCount(); i++) { Part thisPart = parts[i]; if (thisPart.isMimeType("text/html")) { // common case, return quickly String html = (String) thisPart.getContent(); String text = Util.unescapeHTML(html); org.jsoup.nodes.Document doc = Jsoup.parse(text); StringBuilder sb = new StringBuilder(); HTMLUtils.extractTextFromHTML(doc.body(), sb); list.add(sb.toString()); log.debug("Multipart/alternative with content type text/html"); return list; } } // no text or html part. hmmm... blindly process the first part only if (allParts.getCount() >= 1) list.addAll(processMessagePart(messageNum, m, allParts.getBodyPart(0), attachmentsList)); } else { // process it like a regular multipart for (int i = 0; i < allParts.getCount(); i++) { BodyPart bp = allParts.getBodyPart(i); list.addAll(processMessagePart(messageNum, m, bp, attachmentsList)); } } } else if (o instanceof Part) list.addAll(processMessagePart(messageNum, m, (Part) o, attachmentsList)); else dataErrors.add("Unhandled part content, " + folder_name() + " Message #" + messageNum + "Java type: " + o.getClass() + " Content-Type: " + p.getContentType()); } else { try { // do attachments only if downloadAttachments is set. // some apps do not need attachments, so this saves some time. // however, it seems like a lot of time is taken in imap prefetch, which gets attachments too? if (fetchConfig.downloadAttachments) handleAttachments(messageNum, m, p, list, attachmentsList); } catch (Exception e) { dataErrors.add("Ignoring attachment for " + folder_name() + " Message #" + messageNum + ": " + Util.stackTrace(e)); } } return list; }
From source file:net.wastl.webmail.server.WebMailSession.java
/** Use depth-first search to go through MIME-Parts recursively. @param p Part to begin with/*from w w w. j ava 2 s .c o m*/ */ protected void parseMIMEContent(Part p, XMLMessagePart parent_part, String msgid) throws MessagingException { StringBuilder content = new StringBuilder(1000); XMLMessagePart xml_part; try { if (p.getContentType().toUpperCase().startsWith("TEXT/HTML")) { /* The part is a text in HTML format. We will try to use "Tidy" to create a well-formatted XHTML DOM from it and then remove JavaScript and other "evil" stuff. For replying to such a message, it will be useful to just remove all of the tags and display only the text. */ xml_part = parent_part.createPart("html"); /**************************************************** * LEAVING THESE OLD XML PARSERS COMMENTED OUT * until know that the new Parser tactic parses HTML properly * (or adequately). See the ** comment below. /* Here we create a DOM tree. //Tidy tidy=new Tidy(); //tidy.setUpperCaseTags(true); //Document htmldoc=tidy.parseDOM(p.getInputStream(),null); // org.cyberneko.html.parsers.DOMParser parser = // new org.cyberneko.html.parsers.DOMParser(); // DOMParser parser = new DOMParser(new HTMLConfiguration()); // parser.parse(new InputSource(p.getInputStream())); // Document htmldoc = parser.getDocument(); // instantiate a DOM implementation DOM dom = new com.docuverse.dom.DOM(); // install the SAX driver for Swing HTML parser dom.setProperty("sax.driver", "com.docuverse.html.swing.SAXDriver"); // install HTML element factory dom.setFactory(new com.docuverse.dom.html.HTMLFactory()); // ** N.B. WITH docuverse AND NekoHTML, THE PARSER WAS // HTML-Specific. We are now using generic XML parser. // Is that adequate? // now just open the document Document htmldoc = (Document)dom.readDocument(p.getInputStream()); */ javax.xml.parsers.DocumentBuilder parser = javax.xml.parsers.DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document htmldoc = parser.parse(p.getInputStream()); if (htmldoc == null) { log.error("Document was null!"); // Why not throwing? } //dom.writeDocument(htmldoc,"/tmp/test.xml"); /* Now let's look for all the malicious JavaScript and other <SCRIPT> tags, URLS containing the "javascript:" and tags containing "onMouseOver" and such stuff. */ // if(user.getBoolVar("filter javascript")) new JavaScriptCleaner(htmldoc); new JavaScriptCleaner(htmldoc); //dom.writeDocument(htmldoc,"/tmp/test2.xml"); //XMLCommon.debugXML(htmldoc); /* HTML doesn't allow us to do such fancy stuff like different quote colors, perhaps this will be implemented in the future */ /* So we just add this HTML document to the message part, which will deal with removing headers and tags that we don't need */ xml_part.addContent(htmldoc); } else if (p.getContentType().toUpperCase().startsWith("TEXT") || p.getContentType().toUpperCase().startsWith("MESSAGE")) { /* The part is a standard message part in some incarnation of text (html or plain). We should decode it and take care of some extra issues like recognize quoted parts, filter JavaScript parts and replace smileys with smiley-icons if the user has set wantsFancy() */ xml_part = parent_part.createPart("text"); // TODO: log.debug("text hit"); BufferedReader in; if (p instanceof MimeBodyPart) { int size = p.getSize(); MimeBodyPart mpb = (MimeBodyPart) p; InputStream is = mpb.getInputStream(); /* Workaround for Java or Javamail Bug */ is = new BufferedInputStream(is); ByteStore ba = ByteStore.getBinaryFromIS(is, size); in = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(ba.getBytes()))); /* End of workaround */ size = is.available(); } else { in = new BufferedReader(new InputStreamReader(p.getInputStream())); } log.debug("Content-Type: " + p.getContentType()); String token = ""; int quote_level = 0, old_quotelevel = 0; boolean javascript_mode = false; /* Read in the message part line by line */ while ((token = in.readLine()) != null) { /* First decode all language and MIME dependant stuff */ // Default to ISO-8859-1 (Western Latin 1) String charset = "ISO-8859-1"; // Check whether the part contained a charset in the content-type header StringTokenizer tok2 = new StringTokenizer(p.getContentType(), ";="); String blah = tok2.nextToken(); if (tok2.hasMoreTokens()) { blah = tok2.nextToken().trim(); if (blah.toLowerCase().equals("charset") && tok2.hasMoreTokens()) { charset = tok2.nextToken().trim(); } } try { token = new String(token.getBytes(), charset); } catch (UnsupportedEncodingException ex1) { log.info("Java Engine does not support charset " + charset + ". Trying to convert from MIME ..."); try { charset = MimeUtility.javaCharset(charset); token = new String(token.getBytes(), charset); } catch (UnsupportedEncodingException ex) { log.warn("Converted charset (" + charset + ") does not work. Using default charset (ouput may contain errors)"); token = new String(token.getBytes()); } } /* Here we figure out which quote level this line has, simply by counting how many ">" are in front of the line, ignoring all whitespaces. */ int current_quotelevel = Helper.getQuoteLevel(token); /* When we are in a different quote level than the last line, we append all we got so far to the part with the old quotelevel and begin with a clean String buffer */ if (current_quotelevel != old_quotelevel) { xml_part.addContent(content.toString(), old_quotelevel); old_quotelevel = current_quotelevel; content = new StringBuilder(1000); } if (user.wantsBreakLines()) { Enumeration enumVar = Helper.breakLine(token, user.getMaxLineLength(), current_quotelevel); while (enumVar.hasMoreElements()) { String s = (String) enumVar.nextElement(); if (user.wantsShowFancy()) { content.append(Fancyfier.apply(s)).append("\n"); } else { content.append(s).append("\n"); } } } else { if (user.wantsShowFancy()) { content.append(Fancyfier.apply(token)).append("\n"); } else { content.append(token).append("\n"); } } } xml_part.addContent(content.toString(), old_quotelevel); // Why the following code??? content = new StringBuilder(1000); } else if (p.getContentType().toUpperCase().startsWith("MULTIPART/ALTERNATIVE")) { /* This is a multipart/alternative part. That means that we should pick one of the formats and display it for this part. Our current precedence list is to choose HTML first and then to choose plain text. */ MimeMultipart m = (MimeMultipart) p.getContent(); String[] preferred = { "TEXT/HTML", "TEXT" }; boolean found = false; int alt = 0; // Walk though our preferred list of encodings. If we have found a fitting part, // decode it and replace it for the parent (this is what we really want with an // alternative!) /** findalt: while(!found && alt < preferred.length) { for(int i=0;i<m.getCount();i++) { Part p2=m.getBodyPart(i); if(p2.getContentType().toUpperCase().startsWith(preferred[alt])) { parseMIMEContent(p2,parent_part,msgid); found=true; break findalt; } } alt++; } **/ /** * When user try to reply a mail, there may be 3 conditions: * 1. only TEXT exists. * 2. both HTML and TEXT exist. * 3. only HTML exists. * * We have to choose which part should we quote, that is, we must * decide the prority of parts to quote. Since quoting HTML is not * easy and precise (consider a html: <body><div><b>some text..</b> * </div></body>. Even we try to get text node under <body>, we'll * just get nothing, because "some text..." is marked up by * <div><b>. There is no easy way to retrieve text from html * unless we parse the html to analyse its semantics. * * Here is our policy for alternative part: * 1. Displays HTML but hides TEXT. * 2. When replying this mail, try to quote TEXT part. If no TEXT * part exists, quote HTML in best effort(use * XMLMessagePart.quoteContent() by Sebastian Schaffert.) */ while (alt < preferred.length) { for (int i = 0; i < m.getCount(); i++) { Part p2 = m.getBodyPart(i); if (p2.getContentType().toUpperCase().startsWith(preferred[alt])) { log.debug("Processing: " + p2.getContentType()); parseMIMEContent(p2, parent_part, msgid); found = true; break; } } /** * If we've selected HTML part from alternative part, the TEXT * part should be hidden from display but keeping in XML for * later quoting operation. * * Of course, this requires some modification on showmessage.xsl. */ if (found && (alt == 1)) { Node textPartNode = parent_part.getPartElement().getLastChild(); NamedNodeMap attributes = textPartNode.getAttributes(); boolean hit = false; for (int i = 0; i < attributes.getLength(); ++i) { Node attr = attributes.item(i); // If type=="TEXT", add a hidden attribute. if (attr.getNodeName().toUpperCase().equals("TYPE") && attr.getNodeValue().toUpperCase().equals("TEXT")) { ((Element) textPartNode).setAttribute("hidden", "true"); } } } alt++; } if (!found) { // If we didn't find one of our preferred encodings, choose the first one // simply pass the parent part because replacement is what we really want with // an alternative. parseMIMEContent(m.getBodyPart(0), parent_part, msgid); } } else if (p.getContentType().toUpperCase().startsWith("MULTIPART/")) { /* This is a standard multipart message. We should recursively walk thorugh all of the parts and decode them, appending as children to the current part */ xml_part = parent_part.createPart("multi"); MimeMultipart m = (MimeMultipart) p.getContent(); for (int i = 0; i < m.getCount(); i++) { parseMIMEContent(m.getBodyPart(i), xml_part, msgid); } } else { /* Else treat the part as a binary part that the user should either download or get displayed immediately in case of an image */ InputStream in = null; String type = ""; if (p.getContentType().toUpperCase().startsWith("IMAGE/JPG") || p.getContentType().toUpperCase().startsWith("IMAGE/JPEG")) { type = "jpg"; xml_part = parent_part.createPart("image"); } else if (p.getContentType().toUpperCase().startsWith("IMAGE/GIF")) { type = "gif"; xml_part = parent_part.createPart("image"); } else if (p.getContentType().toUpperCase().startsWith("IMAGE/PNG")) { type = "png"; xml_part = parent_part.createPart("image"); } else { xml_part = parent_part.createPart("binary"); } int size = p.getSize(); if (p instanceof MimeBodyPart) { MimeBodyPart mpb = (MimeBodyPart) p; log.debug("MIME Body part (image), Encoding: " + mpb.getEncoding()); InputStream is = mpb.getInputStream(); /* Workaround for Java or Javamail Bug */ in = new BufferedInputStream(is); ByteStore ba = ByteStore.getBinaryFromIS(in, size); in = new ByteArrayInputStream(ba.getBytes()); /* End of workaround */ size = in.available(); } else { log.warn("No MIME Body part!!"); // Is this unexpected? Consider changing log level. in = p.getInputStream(); } ByteStore data = ByteStore.getBinaryFromIS(in, size); if (mime_parts_decoded == null) { mime_parts_decoded = new HashMap<String, ByteStore>(); } String name = p.getFileName(); if (name == null || name.equals("")) { // Try an other way String headers[] = p.getHeader("Content-Disposition"); int pos = -1; if (headers.length == 1) { pos = headers[0].indexOf("filename*=") + 10; } if (pos != -1) { int charsetEnds = headers[0].indexOf("''", pos); String charset = headers[0].substring(pos, charsetEnds); String encodedFileName = headers[0].substring(charsetEnds + 2); encodedFileName = "=?" + charset + "?Q?" + encodedFileName.replace('%', '=') + "?="; name = MimeUtility.decodeText(encodedFileName); } else { name = "unknown." + type; } } // Eliminate space characters. Should do some more things in the future name = name.replace(' ', '_'); data.setContentType(p.getContentType()); data.setContentEncoding("BINARY"); mime_parts_decoded.put(msgid + "/" + name, data); /** * For multibytes language system, we have to separate filename into * 2 format: one for display (UTF-8 encoded), another for encode the * url of hyperlink. * `filename' is for display, while `hrefFileName' is for hyperlink. * To make use of these two attributes, `showmessage.xsl' is slightly * modified. */ data.setName(name); xml_part.setAttribute("filename", name); // Transcode name into UTF-8 bytes then make a new ISO8859_1 string to encode URL. xml_part.setAttribute("hrefFileName", name); xml_part.setAttribute("size", size + ""); String description = p.getDescription() == null ? "" : p.getDescription(); xml_part.setAttribute("description", description); StringTokenizer tok = new StringTokenizer(p.getContentType(), ";"); xml_part.setAttribute("content-type", tok.nextToken().toLowerCase()); } } catch (java.io.IOException ex) { log.error("Failed to parse mime content", ex); } catch (MessagingException ex) { log.error("Failed to parse mime content", ex); } catch (Exception ex) { log.error("Failed to parse mime content", ex); } }
From source file:edu.stanford.muse.email.EmailFetcherStats.java
/** * recursively processes attachments, fetching and saving it if needed * parses the given part p, and adds it to hte attachmentsList. * in some cases, like a text/html type without a filename, we instead append it to the textlist * @throws MessagingException// w w w . jav a 2 s . c om */ private void handleAttachments(int idx, Message m, Part p, List<String> textList, List<Blob> attachmentsList) throws MessagingException { String ct = null; if (!(m instanceof MimeMessage)) { Exception e = new IllegalArgumentException("Not a MIME message!"); e.fillInStackTrace(); log.warn(Util.stackTrace(e)); return; } String filename = null; try { filename = p.getFileName(); } catch (Exception e) { // seen this happen with: // Folders__gmail-sent Message #12185 Expected ';', got "Message" // javax.mail.internet.ParseException: Expected ';', got "Message" dataErrors.add("Unable to read attachment name: " + folder_name() + " Message# " + idx); return; } String sanitizedFName = Util.sanitizeFolderName(emailStore.getAccountID() + "." + folder_name()); if (filename == null) { String tempFname = sanitizedFName + "." + idx; dataErrors.add("attachment filename is null for " + sanitizedFName + " Message#" + idx + " assigning it the name: " + tempFname); if (p.isMimeType("text/html")) { try { log.info("Turning message " + sanitizedFName + " Message#" + idx + " into text although it is an attachment"); String html = (String) p.getContent(); String text = Util.unescapeHTML(html); org.jsoup.nodes.Document doc = Jsoup.parse(text); StringBuilder sb = new StringBuilder(); HTMLUtils.extractTextFromHTML(doc.body(), sb); textList.add(sb.toString()); return; } catch (Exception e) { Util.print_exception("Error reading contents of text/html multipart without a filename!", e, log); return; } } filename = tempFname; } // Replacing any of the disallowed filename characters (\/:*?"<>|&) to _ // (note: & causes problems with URLs for serveAttachment etc, so it's also replaced) String newFilename = Util.sanitizeFileName(filename); // Updating filename if it's changed after sanitizing. if (!newFilename.equals(filename)) { log.info("Filename changed from " + filename + " to " + newFilename); filename = newFilename; } try { ct = p.getContentType(); if (filename.indexOf(".") < 0) // no ext in filename... let's fix it if possible { // Using startsWith instead of equals because sometimes the ct has crud beyond the image/jpeg;...crud.... // Below are the most common file types, more type can be added if needed // Most common APPLICATION TYPE if (ct.startsWith("application/pdf")) filename = filename + ".pdf"; if (ct.startsWith("application/zip")) filename = filename + ",zip"; // Most common IMAGE TYPE if (ct.startsWith("image/jpeg")) filename = filename + ".jpg"; if (ct.startsWith("image/gif")) filename = filename + ".gif"; if (ct.startsWith("image/png")) filename = filename + ".png"; // Most Common VIDEO TYPE if (ct.startsWith("video/x-ms-wmv")) filename = filename + ".wmv"; // Most Common AUDIO TYPE if (ct.startsWith("audio/mpeg")) filename = filename + ".mp3"; if (ct.startsWith("audio/mp4")) filename = filename + ".mp4"; // Most Common TEXT TYPE if (ct.startsWith("text/html")) filename = filename + ".html"; // Windows Office if (ct.startsWith("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) //Word filename = filename + ".docx"; if (ct.startsWith("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) //Excel filename = filename + ".xlsx"; if (ct.startsWith("application/vnd.openxmlformats-officedocument.presentationml.presentation")) //PowerPoint filename = filename + ".pptx"; } // retain only up to first semi-colon; often ct is something like text/plain; name="filename"' we don't want to log the filename int x = ct.indexOf(";"); if (x >= 0) ct = ct.substring(0, x); log.info("Attachment content type: " + ct + " filename = " + Util.blurKeepingExtension(filename)); } catch (Exception pex) { dataErrors.add("Can't read CONTENT-TYPE: " + ct + " filename:" + filename + " size = " + p.getSize() + " subject: " + m.getSubject() + " Date : " + m.getSentDate().toString() + "\n Exception: " + pex + "\n" + Util.stackTrace(pex)); return; } // if (filename == null && !p.isMimeType("text/html") && !p.isMimeType("message/partial")) // expected not to have a filename with mime type text/html // log.warn ("Attachment filename is null: " + Util.stackTrace()); boolean success = true; // the size passed in here is the part size, which is not really the binary blob size. // when we read the stream below in blobStore.add(), we'll set it again to the binary blob size Blob b = new EmailAttachmentBlob(filename, p.getSize(), (MimeMessage) m, p); if (fetchConfig.downloadAttachments) { // this containment check is only on the basis of file name and size currently, // not on the actual hash if (archive.getBlobStore().contains(b)) { log.debug("Cache hit! " + b); } else { try { if (filename.endsWith(".tif")) log.info("Fetching attachment..." + Util.blurKeepingExtension(filename)); // performance critical! use large buffer! currently 256KB // stream will be closed by callee long start = System.currentTimeMillis(); long nBytes = archive.getBlobStore().add(b, new BufferedInputStream(p.getInputStream(), 256 * 1024)); long end = System.currentTimeMillis(); if (nBytes != -1) { long diff = end - start; String s = "attachment size " + nBytes + " bytes, fetched in " + diff + " millis"; if (diff > 0) s += " (" + (nBytes / diff) + " KB/s)"; log.info(s); } Util.ASSERT(archive.getBlobStore().contains(b)); } catch (IOException ioe) { success = false; dataErrors.add("WARNING: Unable to fetch attachment: filename: " + filename + " size = " + p.getSize() + " subject: " + m.getSubject() + " Date : " + m.getSentDate().toString() + "\nException: " + ioe); ioe.printStackTrace(System.out); } } if (success) { attachmentsList.add(b); /// generate thumbnail only if not already cached try { archive.getBlobStore().generate_thumbnail(b); // supplement } catch (IOException ioe) { log.warn("failed to create thumbnail, filename: " + filename + " size = " + p.getSize() + " subject: " + m.getSubject() + " Date : " + m.getSentDate().toString() + "\nException: " + ioe); ioe.printStackTrace(System.out); } } } }
From source file:com.sonicle.webtop.mail.Service.java
public void processDeclineInvitation(HttpServletRequest request, HttpServletResponse response, PrintWriter out) {/*from w w w .j a v a 2 s. co m*/ MailAccount account = getAccount(request); String pfoldername = request.getParameter("folder"); String puidmessage = request.getParameter("idmessage"); String pidattach = request.getParameter("idattach"); try { account.checkStoreConnected(); FolderCache mcache = account.getFolderCache(pfoldername); long newmsguid = Long.parseLong(puidmessage); Message m = mcache.getMessage(newmsguid); HTMLMailData mailData = mcache.getMailData((MimeMessage) m); Part part = mailData.getAttachmentPart(Integer.parseInt(pidattach)); ICalendarRequest ir = new ICalendarRequest(part.getInputStream()); sendICalendarReply(account, ir, ((InternetAddress) m.getRecipients(RecipientType.TO)[0]), PartStat.DECLINED); new JsonResult().printTo(out); } catch (Exception exc) { new JsonResult(false, exc.getMessage()).printTo(out); logger.error("Error sending decline", exc); } }
From source file:com.sonicle.webtop.mail.Service.java
public void processUpdateCalendarReply(HttpServletRequest request, HttpServletResponse response, PrintWriter out) {/*ww w. j av a 2 s .c o m*/ MailAccount account = getAccount(request); String pfoldername = request.getParameter("folder"); String puidmessage = request.getParameter("idmessage"); String pidattach = request.getParameter("idattach"); //UserProfile profile=environment.getUserProfile(); try { account.checkStoreConnected(); FolderCache mcache = account.getFolderCache(pfoldername); long newmsguid = Long.parseLong(puidmessage); Message m = mcache.getMessage(newmsguid); HTMLMailData mailData = mcache.getMailData((MimeMessage) m); Part part = mailData.getAttachmentPart(Integer.parseInt(pidattach)); ICalendarRequest ir = new ICalendarRequest(part.getInputStream()); String event_id = null; //TODO: String event_id=((CalendarService)wts.getServiceByName("calendar")).updateFromReply(ir); if (event_id != null) { new JsonResult(event_id).printTo(out); } else { throw new Exception("Event not found"); } } catch (Exception exc) { //sout="{\nresult: false, text:'"+Utils.jsEscape(exc.getMessage())+"'\n}"; new JsonResult(false, exc.getMessage()).printTo(out); logger.error("Error getting calendar events", exc); } }