首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用javax.mail读取邮件正文

如何使用javax.mail读取邮件正文
EN

Stack Overflow用户
提问于 2012-06-28 15:58:45
回答 6查看 96.4K关注 0票数 60

我正在开发一个使用javax.mail在邮箱中读取邮件的客户端邮件:

代码语言:javascript
复制
Properties properties = System.getProperties();  
properties.setProperty("mail.store.protocol", "imap");  
try {  
    Session session = Session.getDefaultInstance(properties, null);
    Store store = session.getStore("pop3");//create store instance  
    store.connect("pop3.domain.it", "mail.it", "*****");  
    Folder inbox = store.getFolder("inbox");  
    FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
    inbox.open(Folder.READ_ONLY);//set access type of Inbox  
    Message messages[] = inbox.search(ft);
    String mail,sub,bodyText="";
    Object body;
    for(Message message:messages) {
        mail = message.getFrom()[0].toString();
        sub = message.getSubject();
        body = message.getContent();
        //bodyText = body.....
    }
} catch (Exception e) {  
    System.out.println(e);    
}

我知道getContent()方法返回一个对象,因为内容可能是StringMimeMultiPartSharedByteArrayInputstream和其他(我认为)……有没有办法总是把文本放在消息体里面?谢谢!!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-01-09 12:19:20

此答案扩展了yurin's answer。他提出的问题是,MimeMultipart的内容本身可能是另一个MimeMultipart。在这种情况下,下面的getTextFromMimeMultipart()方法在内容上递归,直到完全解析完消息体。

代码语言:javascript
复制
private String getTextFromMessage(Message message) throws MessagingException, IOException {
    String result = "";
    if (message.isMimeType("text/plain")) {
        result = message.getContent().toString();
    } else if (message.isMimeType("multipart/*")) {
        MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
        result = getTextFromMimeMultipart(mimeMultipart);
    }
    return result;
}

private String getTextFromMimeMultipart(
        MimeMultipart mimeMultipart)  throws MessagingException, IOException{
    String result = "";
    int count = mimeMultipart.getCount();
    for (int i = 0; i < count; i++) {
        BodyPart bodyPart = mimeMultipart.getBodyPart(i);
        if (bodyPart.isMimeType("text/plain")) {
            result = result + "\n" + bodyPart.getContent();
            break; // without break same text appears twice in my tests
        } else if (bodyPart.isMimeType("text/html")) {
            String html = (String) bodyPart.getContent();
            result = result + "\n" + org.jsoup.Jsoup.parse(html).text();
        } else if (bodyPart.getContent() instanceof MimeMultipart){
            result = result + getTextFromMimeMultipart((MimeMultipart)bodyPart.getContent());
        }
    }
    return result;
}
票数 94
EN

Stack Overflow用户

发布于 2019-03-25 05:50:21

不要重复发明轮子!您可以简单地使用Apache Commons电子邮件(请参阅here)

Kotlin示例:

代码语言:javascript
复制
fun readHtmlContent(message: MimeMessage) = 
        MimeMessageParser(message).parse().htmlContent

如果电子邮件没有html内容,但它有普通内容(您可以通过hasPlainContenthasHtmlContent方法进行检查),则应使用以下代码:

代码语言:javascript
复制
fun readPlainContent(message: MimeMessage) = 
        MimeMessageParser(message).parse().plainContent

Java示例:

代码语言:javascript
复制
String readHtmlContent(MimeMessage message) throws Exception {
    return new MimeMessageParser(message).parse().getHtmlContent();
}

String readPlainContent(MimeMessage message) throws Exception {
    return new MimeMessageParser(message).parse().getPlainContent();
}
票数 22
EN

Stack Overflow用户

发布于 2012-06-28 17:07:46

如果你想总是获取文本,那么你可以跳过其他类型,比如“multipart”等等。

代码语言:javascript
复制
  Object body = message.getContent(); 
    if(body instanceof String){
    // hey it's a text
    }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11240368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档