我已经开发了一个简单的Java应用程序,它可以读取我的Gmail收件箱邮件。我能够阅读来自和主题的电子邮件。但是,我无法阅读电子邮件内容。
当我尝试阅读它时,我得到下面的exception:
Exception Msg: com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.Multipart
代码:
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
public class Read_Mail {
static String from;
public static void main(String args[])
{
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props,null);
IMAPStore imapstore = null;
try
{
imapstore = (IMAPStore) session.getStore("imaps");
imapstore.connect("imap.gmail.com", "usernamexxxxx@gmail.com", "passwordxxx");
final IMAPFolder folder = (IMAPFolder) imapstore.getFolder("Inbox");
folder.open(IMAPFolder.READ_ONLY);
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
System.out.println("==============================");
System.out.println("Email #" + (i + 1));
System.out.println("Subject: " + message.getSubject());
System.out.println("From: " + message.getFrom()[0]);
// System.out.println("Text: " + message.getContent());
Object mp = (Object) message.getContent();
if (mp instanceof String)
{
String body = (String)mp;
System.out.println("MSG Body : " + body);
}
else if (mp instanceof Multipart)
{
Multipart mpp = (Multipart)mp;
final BodyPart bp = mpp.getBodyPart(i);
System.out.println("Text: " +bp.getContent().toString());
} else {
System.out.println("Inside else");
Multipart mpp = (Multipart)mp;
final BodyPart bp = mpp.getBodyPart(i);
System.out.println("Text: " +bp.getContent().toString());
}
}
}
catch(Exception e)
{
System.out.println("Exception Msg: " + e.getMessage());
}
}
}
它总是放在else
代码块中,并触发异常。
发布于 2015-04-29 16:23:46
不知道你在问什么。
在最后,你忽略了一个事实,那就是你已经确定了它不是一个多部分(它没有通过instanceof Multipart),但是无论如何,试着把它转换成一个多部分。当然,它会失败。
既然您知道ImapInputStream是可能的,那么就添加一个else-如果是专门针对该类(或者更好的是,针对InputStream)的话,并像处理其他流一样处理它。更妙的是,Java EE docs说,如果不知道如何处理数据类型,就会返回一个流,所以这可能就是最后的结果。
如果你专门检查一个流,那么最终的else应该会产生某种类型的错误。
发布于 2015-04-29 17:47:23
我对你的代码做了一些修改,希望对你有所帮助。
try {
try {
imapstore = (IMAPStore) session.getStore("imaps");
} catch (NoSuchProviderException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
imapstore.connect("imap.gmail.com", "usernamexxxxx@gmail.com", "passwordxxx");
IMAPFolder folder;
folder = (IMAPFolder) imapstore.getFolder("Inbox");
folder.open(IMAPFolder.READ_ONLY);
Message[] messages;
messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
System.out.println("==============================");
System.out.println("Email #" + (i + 1));
System.out.println("Subject: " + message.getSubject());
System.out.println("From: " + message.getFrom()[0]);
// System.out.println("Text: " + message.getContent());
Object mp;
try{
mp = (Object) message.getContent();
if (mp instanceof String) {
String body = (String)mp;
System.out.println("MSG Body : " + body);
} else if (mp instanceof MimeMultipart) {
MimeMultipart mpp = (MimeMultipart)mp;
for(int count =0;count<mpp.getCount();count++){
MimeBodyPart bp = (MimeBodyPart)mpp.getBodyPart(count);
InputStream fileNme = bp.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(fileNme, writer, "UTF-8");
String theString = writer.toString();
System.out.println("Text: " +theString);
}
} else if (mp instanceof Multipart) {
Multipart mpp = (Multipart)mp;
for(int count =0;count<mpp.getCount();count++){
MimeBodyPart bp = (MimeBodyPart)mpp.getBodyPart(count);
InputStream fileNme = bp.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(fileNme, writer, "UTF-8");
String theString = writer.toString();
System.out.println("Text: " +theString);
}
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
您还需要一个包含IOUtils的jar,您可以从http://www.java2s.com/Code/Jar/o/Downloadorgapachecommonsiojar.htm下载它
https://stackoverflow.com/questions/29937957
复制相似问题