【问题标题】:reading body part of a mime multipart阅读 mime 多部分的正文部分
【发布时间】:2012-11-08 14:36:43
【问题描述】:

好的,所以我使用 .getcontent 并接收 javax.mail.internet.MimeMultipart@fd13b5 等。

我知道我的代码中需要这样的东西,但我不知道到底需要什么。

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--;

目前我正在尝试将所有信息放入字符串中,然后显示在 GUI 上,此时我已经将其全部工作正常,除了显示为的正文内容。 javax.mail.internet.MimeMultipart@fd13b5。任何帮助将不胜感激,因为我很卡住。

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

}
}

【问题讨论】:

标签: java jakarta-mail mime multipart


【解决方案1】:

是的,您必须遍历每个 BodyPart 以了解其类型,然后相应地获取内容。这是我用来获取消息内容的内容。但我仍然无法为某些消息获取正确的内容。
已编辑
实施比尔建议的代码后效果更好。

    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();

【讨论】:

  • 我看过了,但我不明白它的一半是什么意思,比如 P 来自等等。
  • p 是您必须传递给方法的 Part/bodypart 对象,以便从中获取内容。请参阅我编辑的答案,特别是 else 声明
  • @ThePCWizard 你能告诉我检查附件是否存在,我们是否还需要检查 Content-Id。即如果 Content-Id 不为空,那么正文部分是附件?就像在这段代码中一样-> if ( (null != disp1 && !"".equals(disp1)) && (disp1.equalsIgnoreCase(javax.mail.Part.ATTACHMENT) || disp1.equalsIgnoreCase(javax.mail.Part.INLINE )) ) { isAttachment = true; }else if (!"".equals(contentId)){ isAttachment = true; }
【解决方案2】:

这个解决方案对我来说效果更好。我只是想记录我的电子邮件以用于开发/测试目的。使用 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());
}

感谢上面@zzzzz 的评论,他链接到这个答案JavaMail - Parsing email content, can't seem to get it to work! (Message.getContent())

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2017-08-29
    • 2012-09-28
    • 2011-11-10
    相关资源
    最近更新 更多