PCのOSは、Windows 7 64bit です。
Eclipse で Android のメールソフトを作っています。
Gメールにimaps で接続しています。
メール本文は取り出せたのですが、添付されている画像ファイルが取り出せません。
参考にしているのは、JavaMail API (Elliotte Rusty Harold) です。
この中のJavaMail のサンプルコードを利用しようとしたのです。
説明では、base64 デコードも勝手にやってくれるようになっていると
理解したのですが、添付ファイルを取り出すことが出来ません。
デバッグを続けていると、PCが動かなくなってきます。
修復セットアップが必要になりました。
サンプルコード
if (fileName == null) { // likely inline
p.writeTo(System.out);
} else {
File f = new File(fileName);
// find a file that does not yet exist
for (int i = 1; f.exists(); i++) {
String newName = fileName + " " + i;
f = new File(newName);
}
try (
OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
InputStream in = new BufferedInputStream(p.getInputStream())) {
// We can't just use p.writeTo() here because it doesn't
// decode the attachment. Instead we copy the input stream
// onto the output stream which does automatically decode
// Base-64, quoted printable, and a variety of other formats.
int b;
while ((b = in.read()) != -1) out.write(b);
out.flush();
}
}
} catch (IOException| MessagingException ex) {
ex.printStackTrace
の、
OutputStream out = new BufferedOutputStream(new FileOutputStream(f));
の部分でエラーとなります。
解決方法を教えていただきたいと思います。
Header情報は取り出せるので、
バイナリデータとして取り出し保存してから、
自分で、base64デコード をすればよいような気もしますが、
日本語が絡む場合は、上記のサンプルコードは使えないのでしょうか?
それとも、サンプルコードで添付ファイルを取り出せるのでしょうか?
よろしくお願いします。
ありがとうございます。
PCのバックアップを取りながら慎重に再挑戦しています。
サンプルの前の部分で
// Get the messages from the server
Message[] messages = folder.getMessages();
for (int i = 0; i < messages.length; i++) {
System.out.println("------------ Message " + (i+1)
+ " ------------");
// Print message headers
@SuppressWarnings("unchecked")
Enumeration<Header> headers = messages[i].getAllHeaders();
while (headers.hasMoreElements()) {
Header h = headers.nextElement();
System.out.println(h.getName() + ": " + h.getValue());
}
System.out.println();
// Enumerate parts
Object body = messages[i].getContent();
if (body instanceof Multipart) {
processMultipart((Multipart) body);
} else { // ordinary message
processPart(messages[i]);
}
System.out.println();
}
// Close the connection
// but don't remove the messages from the server
folder.close(false);
} catch (MessagingException| IOException ex) {
ex.printStackTrace();
}
// Since we may have brought up a GUI to authenticate,
// we can't rely on returning from main() to exit
System.exit(0);
}
public static void processMultipart(Multipart mp)
throws MessagingException {
for (int i = 0; i < mp.getCount(); i++) {
processPart(mp.getBodyPart(i));
}
}
public static void processPart(Part p) {
Multipart
があります。
先日までは、コンパイルはできて、ソフトは暴走していたのですが、
本日は、
processPart(Part p) の部分の、
Part について、aqndroid.provider.Telephony.Mms.Part だと言われたり、
それ以前の部分では、
processPart(messages[i]);
processPart(mp.getBodyPart(i));
となっているので、processPart の引数が、message なのか、body なのかと
聞いてきます。
もちろん引数が違うのだから処理が異なるのは当然です。
でも、サンプルコードは、その違いを無視しているし、
昨日まで、コンパイルできていたのはなぜなのか、理解できないことが増えています。
お礼
ありがとうございます。 ヘッダーファイル が間違っていたので、 修正したら、 変なコメントは出なくなりましたが、 まだ、添付ファイルは取得できません。
補足
ありがとうございます。 PCのバックアップを取りながら慎重に再挑戦しています。 サンプルの前の部分で // Get the messages from the server Message[] messages = folder.getMessages(); for (int i = 0; i < messages.length; i++) { System.out.println("------------ Message " + (i+1) + " ------------"); // Print message headers @SuppressWarnings("unchecked") Enumeration<Header> headers = messages[i].getAllHeaders(); while (headers.hasMoreElements()) { Header h = headers.nextElement(); System.out.println(h.getName() + ": " + h.getValue()); } System.out.println(); // Enumerate parts Object body = messages[i].getContent(); if (body instanceof Multipart) { processMultipart((Multipart) body); } else { // ordinary message processPart(messages[i]); } System.out.println(); } // Close the connection // but don't remove the messages from the server folder.close(false); } catch (MessagingException| IOException ex) { ex.printStackTrace(); } // Since we may have brought up a GUI to authenticate, // we can't rely on returning from main() to exit System.exit(0); } public static void processMultipart(Multipart mp) throws MessagingException { for (int i = 0; i < mp.getCount(); i++) { processPart(mp.getBodyPart(i)); } } public static void processPart(Part p) { Multipart があります。 先日までは、コンパイルはできて、ソフトは暴走していたのですが、 本日は、 processPart(Part p) の部分の、 Part について、aqndroid.provider.Telephony.Mms.Part だと言われたり、 それ以前の部分では、 processPart(messages[i]); processPart(mp.getBodyPart(i)); となっているので、processPart の引数が、message なのか、body なのかと 聞いてきます。 もちろん引数が違うのだから処理が異なるのは当然です。 でも、サンプルコードは、その違いを無視しているし、 昨日まで、コンパイルできていたのはなぜなのか、理解できないことが増えています。