Pourquoi JavaMail BodyPart.getInputStream () renvoie un flux vide lors de l'utilisation d'IMAP, mais pas lors de l'utilisation de POP3?


J'ai une application javax.mail qui analyse les e-mails et obtient le InputStream pour toutes les pièces jointes application/*:

private DataInputStream getAttachmentStream(Message message) throws MessagingException, IOException {
    if (message.isMimeType("multipart/*")) {
        Multipart mp = (Multipart) message.getContent();

        for (int p = 0; p < mp.getCount(); p++) {
            BodyPart part = mp.getBodyPart(p);

            if (part.getContentType().toLowerCase().startsWith("application")) {
                InputStream is = part.getInputStream();

                DataInputStream dis = new DataInputStream(is);

                App.logger.info("Found attachment."");
                return dis;
            }
        }
    }

    App.logger.warn("No attachment found.");
    return null;
}

Mon problème est que même pour les e-mails qui ont une pièce jointe, le DataInputStream résultant est vide. J'ai traversé le débogueur, et part est certainement la bonne partie Message avec la pièce jointe.

J'ai changé le protocole de mon code qui vérifie l'adresse e-mail pour utiliser POP3 au lieu d'IMAP, et ce code a fonctionné comme par magie. Quelqu'un peut-il expliquez pourquoi ce code fonctionne pour POP3 et non pour IMAP?

Author: brokethebuildagain, 2014-09-12

1 answers

Cela fait un certain temps que ce thread a été ouvert, mais je pense que le problème décrit ici était dû à des bogues dans l'implémentation partielle de fetch du serveur IMAP. Comme décrit dans ce lien http://www.oracle.com/technetwork/java/faq-135477.html#fetch et dans ces notes https://javamail.java.net/docs/NOTES.txt . Il existe une solution de contournement pour le résoudre, ajoutez la propriété suivante:

Accessoires.setProperty ("mail.imap.partialfetch", "false");

 3
Author: Inanda Menezes, 2015-01-15 01:15:35