web-dev-qa-db-fra.com

lecture d'une partie du corps d'un mime en plusieurs parties

ok donc j'utilise .getcontent et reçois javax.mail.internet.MimeMultipart@fd13b5 etc.

Je sais que j'ai besoin de quelque chose comme ça dans mon code mais je ne sais pas exactement ce qui est nécessaire.

if (p.isMimeType("text/plain")) {
    pr("This is plain text");
    pr("---------------------------");
    if (!showStructure && !saveAttachments)
    System.out.println((String)p.getContent());
} else if (p.isMimeType("multipart/*")) {
    pr("This is a Multipart");
    pr("---------------------------");
    Multipart mp = (Multipart)p.getContent();
    level++;
    int count = mp.getCount();
    for (int i = 0; i < count; i++)
    dumpPart(mp.getBodyPart(i));
    level--;
} else if (p.isMimeType("message/rfc822")) {
    pr("This is a Nested Message");
    pr("---------------------------");
    level++;
    dumpPart((Part)p.getContent());
    level--;

en ce moment j'essaye de mettre toutes les informations dans l'astring qui est ensuite affiché sur une interface graphique au moment où je fais tout fonctionner correctement, sauf le contenu du corps qui s'affiche comme. javax.mail.internet.MimeMultipart@fd13b5. toute aide serait très appréciée car je suis assez coincé.

package EmailTable;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.io.IOException;
import Java.util.List;
import Java.util.Properties;

import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;



public class Email implements ActionListener
{

private mail mail;
private List mails;
private String password;
private String user;
private String getText;
private boolean textIsHtml = false;

public Email(List mails,String password,String user) throws MessagingException,     IOException {

password = "password";
user = "user";
this.mails = mails;
String Host = "10..10.10.10";
   Properties properties = System.getProperties(); 
  Session session = Session.getDefaultInstance(properties);
  Store store = session.getStore("pop3");
  store.connect(Host, user, password);
  Folder folder = store.getFolder("inbox");
  folder.open(Folder.READ_ONLY);
  Message[] messages = folder.getMessages();

    int length = messages.length-1;
    for (int i = length; i > length-30; i--) {

            mail = new mail();

            mail.setEmail(messages[i].getFrom()[0]);

              String to = InternetAddress.toString(
                                messages[i].getRecipients(Message.RecipientType.TO));
                      if (to != null) {
                          mail.setEmail2(to);
                      }

            mail.setSubject(messages[i].getSubject());

            mail.setDate(messages[i].getSentDate());

            mail.setMessage(messages[i]);

             mail.setContent(((MimeMessage)messages[i]).getContent());



            Email.this.mails.add(mail);
  }

}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}
}
15
J0rd4n500

Oui, vous devez parcourir chaque BodyPart pour connaître son type, puis obtenir le contenu en conséquence. Voici ce que j'ai utilisé pour obtenir le contenu d'un message. Mais je ne parviens toujours pas à obtenir le bon contenu pour certains messages.
Modifié
Fonctionne mieux après avoir mis en œuvre le code suggéré par Bill.

    Object msgContent = messages[i].getContent();

    String content = "";             

     /* Check if content is pure text/html or in parts */                     
     if (msgContent instanceof Multipart) {

         Multipart multipart = (Multipart) msgContent;

         Log.e("BodyPart", "MultiPartCount: "+multipart.getCount());

         for (int j = 0; j < multipart.getCount(); j++) {

          BodyPart bodyPart = multipart.getBodyPart(j);

          String disposition = bodyPart.getDisposition();

          if (disposition != null && (disposition.equalsIgnoreCase("ATTACHMENT"))) { 
              System.out.println("Mail have some attachment");

              DataHandler handler = bodyPart.getDataHandler();
              System.out.println("file name : " + handler.getName());                                 
            }
          else { 
                  content = getText(bodyPart);  // the changed code         
            }
        }
     }
     else                
         content= messages[i].getContent().toString();
8
ThePCWizard

Cette solution a fonctionné beaucoup mieux pour moi. Je voulais simplement enregistrer mon e-mail à des fins de développement/test. Utilisez la méthode MimeMessage.writeTo (OutputStream).

void logMimeMessage(MimeMessage msg) throws MessagingException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        msg.writeTo(out);
    } catch (IOException e) {
        logger.catching(new MyException("Cannot log MimeMessage",e));
    }
    logger.error(out.toString());
}

Merci au commentaire de @zzzzz ci-dessus, qui a lié à cette réponse JavaMail - Analyser le contenu du courrier électronique, ne semble pas pouvoir le faire fonctionner! (Message.getContent ())

4
carbontax