3 votes

Spring intégration IMAP - exception de dossier fermé

Je suis en train de créer un récepteur de courriers Imapmail de base en utilisant Spring Integration et je suis tombé sur une exception sticky folder closed. Je reçois constamment une exception de dossier fermé lors de la lecture du contenu de l'e-mail, mais je suis capable d'obtenir correctement le sujet.

Toute aide est grandement appréciée.

1. Mon contexte d'application est le suivant

    javax.net.ssl.SSLSocketFactory
    false
    imaps
    false

2. L'application principale est la suivante

    ApplicationContext ac = new ClassPathXmlApplicationContext("/META-INF/spring/integration/gmail.xml");

 ImapIdleChannelAdapter ic=(ImapIdleChannelAdapter)ac
    .getBean("mailAdapter");

    ic.start();

3. L'activatrice de service est la suivante

public class MessageReceiver {
    public void handle(javax.mail.Message message){
        MailToStringTransformer m2s = new MailToStringTransformer();
            m2s.setCharset("utf-8");

//payload instanceof MimeMultipart
            if (message instanceof MimeMessage) {
                try {
                 System.out.println("inside mimemessagehandler");
                   // javax.mail.Message mailMessage = (javax.mail.Message) payload;
                    System.out.println(message.getSubject());
                    System.out.println(getTextFromMessage(message));

                    Address[] receipts = message.getAllRecipients();
                    System.out.println("RECEIPIENTS MAIL ID");
                    if (receipts != null && receipts.length > 0) {
                        for (int i = 0; i < receipts.length; i++) {
                            System.out.println(((InternetAddress) receipts[i]).getAddress());
                        }
                    }

                    System.out.println("FROM MAIL ID");
                    Address[] froms = message.getFrom();
                    String email = froms == null ? null
                            : ((InternetAddress) froms[0]).getAddress();
                    System.out.println(email);

                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }

    private static  String getTextFromMessage(javax.mail.Message message) throws Exception {
    String result = "";
    if (message.isMimeType("text/plain")) {
        result = message.getContent().toString();
    } else if (message.isMimeType("multipart/*")) {
        MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
        result = getTextFromMimeMultipart(mimeMultipart);
    }
    return result;
}

private static String getTextFromMimeMultipart(MimeMultipart mimeMultipart) throws Exception {
    String result = "";

    int count = mimeMultipart.getCount();
    System.out.println("CCC "+count);
    for (int i = 0; i < count; i++) {
       // mimeMultipart.toString()
        BodyPart bodyPart = mimeMultipart.getBodyPart(i);
        if (bodyPart.isMimeType("text/plain")) {
           result = mimeMultipart.toString();//(String) bodyPart.getContent();

        } else if (bodyPart.isMimeType("text/html")) {
            String html = (String) bodyPart.getContent();
            // result = result + "\n" + org.jsoup.Jsoup.parse(html).text();
        } else if (bodyPart.getContent() instanceof MimeMultipart) {
            result = result + getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent());
        }
    }
    return result;
}

}

--- EXCEPTION

javax.mail.FolderClosedException

      at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:659)
      at org.springframework.integration.mail.imapidle.MessageReceiver.getTextFromMimeMultipart(MessageReceiver.java:101)
      at org.springframework.integration.mail.imapidle.MessageReceiver.getTextFromMessage(MessageReceiver.java:83)
      at org.springframework.integration.mail.imapidle.MessageReceiver.handle(MessageReceiver.java:41)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at

1voto

Artem Bilan Points 8828

Eh bien, il semble que nous ne pouvons pas obtenir de contenu du MimeBodyPart si le Folder est déjà fermé. Et il semble que nous avons exactement cette situation dans la méthode AbstractMailReceiver.receive() :

            }
                return converted;
            }
            else {
                return filteredMessages;
            }
        }
        finally {
            MailTransportUtils.closeFolder(this.folder, this.shouldDeleteMessages);
        }

Je ne suis pas sûr pourquoi nous fermons le dossier après la réception mais avant l'envoi en aval, néanmoins, je vous suggère d'essayer avec le DefaultMailHeaderMapper pour l' ImapMailReceiver. Dans ce cas, le contenu du MimeMessage est converti en org.springframework.messaging.Message internalement dans la méthode AbstractMailReceiver.receive() mentionnée :

if (this.headerMapper != null) {
                org.springframework.messaging.Message[] converted =
                        new org.springframework.messaging.Message[filteredMessages.length];
                int n = 0;
                for (MimeMessage message : filteredMessages) {
                    Map headers = this.headerMapper.toHeaders(message);
                    converted[n++] = getMessageBuilderFactory().withPayload(extractContent(message, headers))
                            .copyHeaders(headers)
                            .build();
                }
                return converted;
            }

En attendant, veuillez ouvrir un JIRA sur la question et nous envisagerons de corriger cette incohérence de Folder.close(). J'ai le sentiment que cela ne devrait pas du tout être fait, ou nous devrions le fournir à l'utilisateur final sous la forme d'un en-tête pour lui permettre de décider quand et où fermer le dossier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X