@Override protected void internalStore(Mail mail) throws MessagingException, IOException { try { Session session = login(); try { String name = Text.escapeIllegalJcrChars(mail.getName()); final String xpath = "/jcr:root/" + MAIL_PATH + "//element(" + name + ",james:mail)"; QueryManager manager = session.getWorkspace().getQueryManager(); @SuppressWarnings("deprecation") Query query = manager.createQuery(xpath, Query.XPATH); NodeIterator iterator = query.execute().getNodes(); if (iterator.hasNext()) { while (iterator.hasNext()) { setMail(iterator.nextNode(), mail); } } else { Node parent = session.getRootNode().getNode(MAIL_PATH); Node node = parent.addNode(name, "james:mail"); Node resource = node.addNode("jcr:content", "nt:resource"); resource.setProperty("jcr:mimeType", "message/rfc822"); setMail(node, mail); } session.save(); logger.info("Mail " + mail.getName() + " stored in repository"); } finally { session.logout(); } } catch (IOException e) { throw new MessagingException("Unable to store message: " + mail.getName(), e); } catch (RepositoryException e) { throw new MessagingException("Unable to store message: " + mail.getName(), e); } }
/** * @see org.apache.james.queue.jms.JMSMailQueue#populateMailMimeMessage(javax.jms.Message, * org.apache.mailet.Mail) */ protected void populateMailMimeMessage(Message message, Mail mail) throws MessagingException, JMSException { if (message instanceof BlobMessage) { try { BlobMessage blobMessage = (BlobMessage) message; try { // store URL and queueName for later usage mail.setAttribute(JAMES_BLOB_URL, blobMessage.getURL()); mail.setAttribute(JAMES_QUEUE_NAME, queueName); } catch (MalformedURLException e) { // Ignore on error logger.debug("Unable to get url from blobmessage for mail " + mail.getName()); } MimeMessageSource source = new MimeMessageBlobMessageSource(blobMessage); mail.setMessage(new MimeMessageCopyOnWriteProxy(source)); } catch (JMSException e) { throw new MailQueueException( "Unable to populate MimeMessage for mail " + mail.getName(), e); } } else { super.populateMailMimeMessage(message, mail); } }
@Override public void service(Mail mail) { log("Logging mail " + mail.getName()); logComment(); try { MimeMessage message = mail.getMessage(); logHeaders(message); logBody(message); } catch (MessagingException e) { log("Error logging message.", e); } catch (java.io.IOException e) { log("Error logging message.", e); } if (!passThrough) { mail.setState(Mail.GHOST); } }
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"); }
/** * Process this mail message by the appropriate processor as designated in the state of the Mail * object. * * @param mail the mail message to be processed */ protected void process(Mail mail) { while (true) { String processorName = mail.getState(); if (processorName.equals(Mail.GHOST)) { // This message should disappear return; } try { LinearProcessor processor = (LinearProcessor) processors.get(processorName); if (processor == null) { StringBuffer exceptionMessageBuffer = new StringBuffer(128) .append("Unable to find processor ") .append(processorName) .append(" requested for processing of ") .append(mail.getName()); String exceptionMessage = exceptionMessageBuffer.toString(); getLogger().debug(exceptionMessage); mail.setState(Mail.ERROR); throw new MailetException(exceptionMessage); } StringBuffer logMessageBuffer = null; if (getLogger().isDebugEnabled()) { logMessageBuffer = new StringBuffer(64) .append("Processing ") .append(mail.getName()) .append(" through ") .append(processorName); getLogger().debug(logMessageBuffer.toString()); } processor.service(mail); if (getLogger().isDebugEnabled()) { logMessageBuffer = new StringBuffer(128) .append("Processed ") .append(mail.getName()) .append(" through ") .append(processorName); getLogger().debug(logMessageBuffer.toString()); getLogger().debug("Result was " + mail.getState()); } return; } catch (Throwable e) { // This is a strange error situation that shouldn't ordinarily // happen StringBuffer exceptionBuffer = new StringBuffer(64) .append("Exception in processor <") .append(processorName) .append(">"); getLogger().error(exceptionBuffer.toString(), e); if (processorName.equals(Mail.ERROR)) { // We got an error on the error processor... // kill the message mail.setState(Mail.GHOST); mail.setErrorMessage(e.getMessage()); } else { // We got an error... send it to the requested processor if (!(e instanceof MessagingException)) { // We got an error... send it to the error processor mail.setState(Mail.ERROR); } mail.setErrorMessage(e.getMessage()); } } if (getLogger().isErrorEnabled()) { StringBuffer logMessageBuffer = new StringBuffer(128) .append("An error occurred processing ") .append(mail.getName()) .append(" through ") .append(processorName); getLogger().error(logMessageBuffer.toString()); getLogger().error("Result was " + mail.getState()); } } }
/** This routinely checks the message spool for messages, and processes them as necessary */ public void run() { if (getLogger().isInfoEnabled()) { getLogger().info("Run JamesSpoolManager: " + Thread.currentThread().getName()); getLogger().info("Spool=" + spool.getClass().getName()); } numActive++; while (active) { String key = null; try { Mail mail = (Mail) spool.accept(); key = mail.getName(); if (getLogger().isDebugEnabled()) { StringBuffer debugBuffer = new StringBuffer(64) .append("==== Begin processing mail ") .append(mail.getName()) .append("===="); getLogger().debug(debugBuffer.toString()); } process(mail); // Only remove an email from the spool is processing is // complete, or if it has no recipients if ((Mail.GHOST.equals(mail.getState())) || (mail.getRecipients() == null) || (mail.getRecipients().size() == 0)) { ContainerUtil.dispose(mail); spool.remove(key); if (getLogger().isDebugEnabled()) { StringBuffer debugBuffer = new StringBuffer(64) .append("==== Removed from spool mail ") .append(key) .append("===="); getLogger().debug(debugBuffer.toString()); } } else { // spool.remove() has a side-effect! It unlocks the // message so that other threads can work on it! If // we don't remove it, we must unlock it! spool.store(mail); ContainerUtil.dispose(mail); spool.unlock(key); // Do not notify: we simply updated the current mail // and we are able to reprocess it now. } mail = null; } catch (InterruptedException ie) { getLogger().info("Interrupted JamesSpoolManager: " + Thread.currentThread().getName()); } catch (Throwable e) { if (getLogger().isErrorEnabled()) { getLogger() .error( "Exception processing " + key + " in JamesSpoolManager.run " + e.getMessage(), e); } /* Move the mail to ERROR state? If we do, it could be * deleted if an error occurs in the ERROR processor. * Perhaps the answer is to resolve that issue by * having a special state for messages that are not to * be processed, but aren't to be deleted? The message * would already be in the spool, but would not be * touched again. if (mail != null) { try { mail.setState(Mail.ERROR); spool.store(mail); } } */ } } if (getLogger().isInfoEnabled()) { getLogger().info("Stop JamesSpoolManager: " + Thread.currentThread().getName()); } numActive--; }