我正在使用JavaMail API创建电子邮件客户端。一切都很好,比如我可以连接到邮件服务器(使用IMAP),删除邮件,检索收到的邮件并将其显示给用户等。
现在问题来了,当涉及到下载"PDF附件"。PDF文件没有完全下载。。。它缺少一些内容。
如果当我使用IE或任何其他web浏览器下载附件时,某些PDF附件的大小为38 Kb,但当我使用java代码下载时,它的大小为37.3 Kb。它不完整因此,当我尝试使用Adobe Reader打开它时,它会显示错误消息"文件已损坏…"
这是我写的代码下载附件:
public boolean saveFile(String filename,Part part) throws IOException, MessagingException {
boolean ren = true;
FileOutputStream fos = null;
BufferedInputStream fin = null;
InputStream input = part.getInputStream();
File pdffile = new File("d:/"+filename);
try{
if(!pdffile.exists()){
fos = new FileOutputStream(pdffile);
fin = new BufferedInputStream(input);
int size = 512;
byte[] buf = new byte[size];
int len;
while ( (len = fin.read(buf)) != -1 ) {
fos.write(buf, 0, len);
}
input.close();
fos.close();
}else{
System.out.println("File already exists");
}
}catch(Exception e ){
ren = false;
}
return ren;
}
我是不是错过了什么?任何有用的帮助都将不胜感激。
花了几个小时,终于弄明白了。
props.setProperty("mail.imaps.partialfetch", "false");
为我做了这件事。几乎和上面的@Shantanu一样,但因为我使用的是
store = session.getStore("imaps");
我还需要使用"imaps"进行部分提取。
工作起来很有魅力。
以下完整代码:
// Load mail properties
Properties mailProperties = System.getProperties();
mailProperties.put("mail.mime.base64.ignoreerrors", "true");
mailProperties.put("mail.imaps.partialfetch", "false");
// Connect to Gmail
Session session = Session.getInstance(mailProperties, null);
store = session.getStore("imaps");
store.connect("imap.gmail.com", -1, "username", "password");
// Access label folder
Folder defaultFolder = store.getDefaultFolder();
Folder labelFolder = defaultFolder.getFolder("mylabel");
labelFolder.open(Folder.READ_WRITE);
Message[] messages = labelFolder.getMessages();
saveAttachments(messages);
private void saveAttachments(Message[] messages) throws Exception {
for (Message msg : messages) {
if (msg.getContent() instanceof Multipart) {
Multipart multipart = (Multipart) msg.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
Part part = multipart.getBodyPart(i);
String disposition = part.getDisposition();
if ((disposition != null) &&
((disposition.equalsIgnoreCase(Part.ATTACHMENT) ||
(disposition.equalsIgnoreCase(Part.INLINE))))) {
MimeBodyPart mimeBodyPart = (MimeBodyPart) part;
String fileName = mimeBodyPart.getFileName();
File fileToSave = new File(fileName);
mimeBodyPart.saveFile(fileToSave);
}
}
}
}
}
最后我在JavaMail常见问题解答阅读邮件IMAP部分找到了解决方案Gmail服务器运行带有附件的错误
首先,我试图将partialfetch属性设置为false,但有时它有效,有时它不
props.setProperty("mail.imap.partialfetch", "false");
FAQ中列出的另一种方法是使用MimeMessage的复制构造函数,将原始对象存储在一些tempmsg中,然后获取tempmsg 的内容
MimeMessage tempmsg = new MimeMessage(msg);
Multipart part = (Multipart) tempmsg.getContent();
现在执行它应该工作的所有操作。。
有关实际情况的详细信息,请访问JavaMail常见问题阅读邮件、IMAP部分,您将找到所有答案。。