예제 #1
0
  @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);
    }
  }
예제 #2
0
  /**
   * @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);
    }
  }
예제 #3
0
 @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--;
  }