各位高手,我在用javamail收取邮件的时候是正常的,当时当邮箱更新(新邮件或删除邮件)的时候会出问题;
1:当有新邮件的时候,数组的位置有时会变;
String host = "imap.qq.com";
String username = "xxxx";
String password = "xxxx"; Properties p = new Properties();
p.setProperty("mail.imap.host", "imap.qq.com"); // 按需要更改
p.setProperty("mail.imap.port", "993");
// SSL安全连接参数
p.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
p.setProperty("mail.imap.socketFactory.fallback", "true");
p.setProperty("mail.imap.socketFactory.port", "993");
p.setProperty("mail.store.protocol", "imap"); Session session = Session.getDefaultInstance(p, null);
Store store = session.getStore("imap");
store.connect(host, username, password); Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY); Message[] messages = folder.getMessages(); IMAPFolder inbox = (IMAPFolder) folder;
for (int i = messages.length - 1; i >= 0; i--) {
Message message = messages[i];
MimeMessage mimeMessage = (MimeMessage) message; long messageId = inbox.getUID(mimeMessage);
System.out.println(messageId);

}这里的messages 会根据邮箱的新增的邮件变化,不是folder.getMessages();这里的时候变,而是在循环的时候变,比如邮箱原来有20条数据,当新邮件来的时候,如果正在执行循环的时候,数组的索引就会变化(有时会变)2:当我删除其他邮件的时候,当前邮件获取内容的时候会报错;我执行了以下代码进行测试,确实会出现,
Message[] messages = folder.getMessages();

while(true){
Message message = messages[messages.length -1];

String content = ((Part)message).getContent();//邮箱只有text/html text/plain 两种类型的内容,这里会报错
}异常如下:
java.io.IOException: No content
at com.sun.mail.imap.IMAPInputStream.fill(IMAPInputStream.java:155)
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:204)
at com.sun.mail.imap.IMAPInputStream.read(IMAPInputStream.java:230)
at com.sun.mail.util.BASE64DecoderStream.getByte(BASE64DecoderStream.java:354)
at com.sun.mail.util.BASE64DecoderStream.decode(BASE64DecoderStream.java:245)
at com.sun.mail.util.BASE64DecoderStream.read(BASE64DecoderStream.java:140)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:108)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795)
at javax.activation.DataHandler.getContent(DataHandler.java:542)
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:630)各位帮我看看哪里有问题,感谢

解决方案 »

  1.   

    Message message = messages[messages.length -1];
    目测你这里出问题了。你的内存里还有这个message,但是数据库里没有了。所以你去取值的时候取不到,可以在取之前做一下判断是否存在就能避免了。
      

  2.   

    这里没有涉及到数据库,只是调用javamail获取邮件的一个数组,然后一直循环(死循环)数组里面最后一条记录获取邮件的内容
    举个例子:
    比如邮箱有1-10条记录,内容分别是1-10,通过javamail获取这个messages的长度是10,我然后我一直输出
    while(true) {
        Message message = messages[5];
                    String content = ((Part)message).getContent();
    }这里会一直输出6,但是如果我删除邮箱里面的任意一条邮件,这里输出内容就会发生变化
      

  3.   

    java 发送邮件工具类,发送html、带附件的均可。
      

  4.   

    https://download.csdn.net/download/m0_37946870/10412939