2009-12-17 6 views
6

J'essaie de développer un client de messagerie IMAP en utilisant l'API javax.mail. J'ai pu contacter les serveurs, récupérer des emails, des pièces jointes et d'autres opérations sans aucun problème. Cependant, nous ne voudrions pas aller chercher la pièce jointe jusqu'à ce que l'utilisateur veuille la voir explit afin d'améliorer les performances. Cela signifierait que nous aurions besoin d'informations qui indiqueraient si l'email a une pièce jointe, si oui, alors le nom de fichier (s) et la taille (s) mais pas m'envoyer le contenu réel de l'email. Cependant, je n'ai pas réussi à trouver une méthode dans la description de l'API qui retournerait uniquement le contenu en plusieurs parties.IMAP - javax.mail. - Récupérer uniquement le corps sans pièce jointe

Y a-t-il un moyen de récupérer le corps et les détails de l'attachement, mais pas l'attachement réel?

Merci, Aravind

Répondre

2

La méthode getContent() de javax.Part renvoie

le contenu comme un objet Java. Le type de l'objet retourné est bien sûr en fonction du contenu lui-même. Pour par exemple, l'objet renvoyé pour "texte/brut" contenu est généralement un objet chaîne . L'objet renvoyé pour un contenu "multipart" est toujours une sous-classe Multipart.

Voir http://download.oracle.com/javaee/6/api/javax/mail/Part.html#getContent%28%29

Si un Message (qui est un Part) contient des pièces jointes, la méthode getContent renverra un objet Multipart. En outre, vous pouvez connaître le type MIME de la pièce avec getContentType.

L'information qui manque dans la documentation est que cet objet MultiPart retourné par getContent est juste une représentation vide de la structure du message. Le contenu de chaque Part du Multipart sera uniquement récupéré sur le serveur lorsque vous le demanderez spécifiquement. Par exemple, pour analyser un Message multipart vous feriez:

if(p.isMimeType("multipart/*")) { 

    Multipart mp = (Multipart)p.getContent(); 
    // the content was not fetched from the server 

    // parse each Part 
    for (int i = 0; i < mp.getCount(); i++) { 
     Part inner_part = mp.getBodyPart(i) 

     if(inner_part.isMimeType("text/plain")) { 
      String text = inner_part.getText(); 
      // the content of this Part was fetched from the server 
     } 
    } 
} 

Autre chose à considérer est que pour une performance optimale, vous devriez obtenir les informations de structure du corps à partir du serveur en lots pour la collecte des messages que vous souhaitez analyser (voir http://download.oracle.com/javaee/6/api/javax/mail/FetchProfile.Item.html#CONTENT_INFO). Dans le cas contraire, chaque

Multipart mp = (Multipart)p.getContent();

se traduira par une demande au serveur pour récupérer la structure du corps. Si l'approche FetchProfile est utilisée, la structure du corps pour la collecte des messages sera récupérée avec une seule requête. Vous pouvez voir les requêtes au serveur dans le journal si vous activez le mode de débogage sur la session:

session.setDebug(true); 

Cela dit, pour obtenir la taille et les noms de fichiers de pièces jointes utilisent juste Part.getSize() et Part.getFileName(), respectivement.

Questions connexes