james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Michael Herrmann (Commented) (JIRA)" <server-...@james.apache.org>
Subject [jira] [Commented] (JAMES-1317) Mail spooled but not processed
Date Tue, 04 Oct 2011 12:05:34 GMT

    [ https://issues.apache.org/jira/browse/JAMES-1317?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13120028#comment-13120028
] 

Michael Herrmann commented on JAMES-1317:
-----------------------------------------

Hi again, 

I did some more testing. Your fix works but unfortunately James now seems to hang at a different
position. I hope it's due to a wrong API usage on my part. 

In addition to the above rewriting of senders/recipients, I now also store all emails I process
in a particular user's inbox. The code is more or less taken from org.apache.james.transport.mailets.SieveMailet:

    private void storeMailInUserInbox(Mail mail, String user) throws MailboxException, MessagingException
{
        storeMailInUserMailbox(mail, user, "INBOX");
    }

    /**
     * @throws BadCredentialsException  if unable to authenticate to mailbox
     * @throws MailboxException         if mailbox cannot be accessed or logging out from
the mailbox failed
     * @throws MailboxNotFoundException if mailbox can neither be found nor created
     * @throws MessagingException       if the mail cannot be read
     */
    private void storeMailInUserMailbox(Mail mail, String user, String mailboxName) throws
MailboxException, MessagingException {
        MailboxSession session = mailboxManager.createSystemSession(user, new MailetContextLog(getMailetContext()));
        mailboxManager.startProcessingRequest(session);
        try {
            final MessageManager mailbox = getUserMailbox(session, user, mailboxName);
            if (mailbox == null)
                throw new MailboxNotFoundException("Mailbox " + mailboxName + " for user "
+ user + " was not found on this server. ");
            mailbox.appendMessage(new MimeMessageInputStream(mail.getMessage()), new Date(),
session, true, null);
        } finally {
            session.close();
            MailboxException thrownException = null;
            try {
                mailboxManager.logout(session, true);
            } catch (MailboxException e) {
                thrownException = e;
            } finally {
                mailboxManager.endProcessingRequest(session);
            }
            if (thrownException != null) throw thrownException;
        }
    }

    private MessageManager getUserMailbox(MailboxSession session, String user, String mailboxName)
throws MailboxException {
        MailboxPath mbxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, user, mailboxName);
        for (MailboxPath existingMbxPath : mailboxManager.list(session))
            if (mailboxName.equals(existingMbxPath.getName()))
                mbxPath = existingMbxPath;
        if (!mailboxManager.mailboxExists(mbxPath, session))
            mailboxManager.createMailbox(mbxPath, session);
        return mailboxManager.getMailbox(mbxPath, session);
    }

It is called from my service() method as follows:

    public void service(Mail mail) throws MessagingException {
        MailAddress from = new MailAddress((InternetAddress) mail.getMessage().getFrom()[0]);
        MailAddress to = new MailAddress((InternetAddress) mail.getMessage().getRecipients(Message.RecipientType.TO)[0]);
        if (to.getDomain().equals(mailserverConfiguration.getDefaultDomain())) {
            Conversation conversation = conversationService.getConversation(mail);

            InternetAddress[] recipients = conversation.getAliasB().getRecipients();
            logger.info("Rewriting recipients of mail " + mail.getMessage().getSubject() +
" to " + Arrays.asList(recipients));
            mail.getMessage().setRecipients(Message.RecipientType.TO, recipients);
            mail.getMessage().saveChanges();

            try {
                storeMailInUserInbox(mail, "_admin@localhost");
            } catch (MailboxException e) {
                logger.error("Unable to log mail " + mail, e);
            }

            String newFrom = conversation.getAliasA() + "@" + mailserverConfiguration.getDefaultDomain();
            logger.info("Rewriting sender of mail " + mail.getMessage().getSubject() + " from
" + from + " to " + newFrom + ".");
            mail.getMessage().setFrom(new InternetAddress(newFrom));
            mail.getMessage().saveChanges();

            getMailetContext().sendMail(mail.getMessage());
            mail.setState(Mail.GHOST);
        } else if (!from.getDomain().equals(mailserverConfiguration.getDefaultDomain())) {
            String newFrom = conversationService.getConversation(mail).getAliasA().toString()
+ "@" + mailserverConfiguration.getDefaultDomain();
            logger.info("Rewriting sender of mail " + mail.getMessage().getSubject() + " from
" + from + " to " + newFrom + ".");
            mail.getMessage().setFrom(new InternetAddress(newFrom));
            mail.getMessage().saveChanges();
        }
    }

With too many concurrent connections, this now hangs in storeMailInUserMailbox resp. getUserMailbox.
I'm attaching a threaddump ("Dump2.txt") as well as the server logs (logs.zip). Am I using
the API correctly? Is there a standard  way of storing a Mail in a particular user's inbox,
even if the mail is not addressed to him, and without stopping further processing of the mail?

Best regards and sorry for taking up even more of your time, 
Michael
                
> Mail spooled but not processed
> ------------------------------
>
>                 Key: JAMES-1317
>                 URL: https://issues.apache.org/jira/browse/JAMES-1317
>             Project: JAMES Server
>          Issue Type: Bug
>          Components: SpoolManager & Processors
>    Affects Versions: 3.0-M1, 3.0-M2, 3.0-beta3
>            Reporter: Raju Buchi
>            Priority: Critical
>             Fix For: 3.0-beta4
>
>         Attachments: Dump.txt, james-server-mailetcontainer-camel-3.0-beta4-SNAPSHOT.jar,
james-server-mailetcontainer-camel-3.0-beta4-SNAPSHOT.jar, jstack.zip, logs.zip
>
>
> Mails sent to James server are spooled but they are not processed and sent out.
> The issue is similar to the one faced by Zach.
> The server seems to be working fine for a few hours or few days, but some time all the
mails are spooled but they will not be processed and sent out. Restarted the server several
times and some time a few of the mails will be processed and all the others are lost.
> As Norman suggested I have took a jstack trace. 
> Please let me how we can resolve this issue
> Thanks
> - Raju

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Mime
View raw message