Не удается прочитать тело письма с помощью Spring: javax.mail.FolderClosedException - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь прослушать входящую почту Gmail для входящих писем. Каждый раз, когда приходит новое письмо, я хочу видеть его тему и содержание.

Пока у меня есть это:

import java.io.IOException;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.mail.util.MimeMessageParser;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mail.transformer.MailToStringTransformer;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;


public class GmailInboundImapIdleAdapterTestApp {
    private static Log logger = LogFactory.getLog(GmailInboundImapIdleAdapterTestApp.class);

    public static void main (String[] args) throws Exception {
        @SuppressWarnings("resource")
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("/META-INF/spring/integration/gmail-imap-idle-config.xml");

        DirectChannel inputChannel = ac.getBean("receiveChannel", DirectChannel.class);

        inputChannel.subscribe(new MessageHandler() {
            public void handleMessage(Message<?> message){
                    MimeMessage mm = (MimeMessage) message.getPayload();
                    try {
                        System.out.println("Subject: "+mm.getSubject());
                        System.out.println("Body: "+readPlainContent(mm));
                    } 
                    catch (javax.mail.MessagingException e) {

                        System.out.println("MessagingException: "+e.getMessage());
                        e.printStackTrace();
                    }
                    catch (Exception e) {
                        System.out.println("Exception: "+e.getMessage());
                        e.printStackTrace();
                    }

            }
        });
    }

     private static String readHtmlContent(MimeMessage message) throws Exception {
            return new MimeMessageParser(message).parse().getHtmlContent();
        }

    private static String readPlainContent(MimeMessage message) throws Exception {
            return new MimeMessageParser(message).parse().getPlainContent();
        }
}

Он может правильно прочитать тему письма. Но не повезло с почтовым телом. javax.mail.FolderClosedException ударил меня. Как это исправить?

1 Ответ

0 голосов
/ 14 октября 2019

Как сказал Гари: simple-content="true" или с недавних пор autoCloseFolder = false: https://docs.spring.io/spring-integration/docs/5.2.0.RELEASE/reference/html/mail.html#mail-inbound

Начиная с версии 5.2, опция autoCloseFolder предоставляется на приемнике почты. Установка его в false не закрывает папку автоматически после извлечения, но вместо этого заголовок IntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCE (см. MessageHeaderAccessor API для дополнительной информации) заполняется в каждом сообщении производителю от адаптера канала. Целевое приложение отвечает за вызов close() для этого заголовка всякий раз, когда это необходимо в нисходящем потоке:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...