String
添付ファイル付きのメールが含まれています。
(全体String
で約2000行あるので、ここでは主要な部分だけを紹介します。)
の開始String
:
--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" ......
メール本文の終わりと添付ファイルの始まり:
</div>
</body>
</html>
--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: image/jpeg; name="IMAG0205.jpg"
Content-Description: IMAG0205.jpg
...
/9j/4TokRXhpZgAATU0AKgAAAAgACAEPAAIAAABcAAAAbgEQAAIAAABcAAAAy... (base64 file)
したがって、メールに添付ファイルがない場合は、これを非常に長い形式で解析String
するjavax.mail.MultiPart
か、そのままにしておく必要があります。注:メールを として直接受け取る機会はありません。これしかありません。String
MultiPart
String
これは私がこれまでに持っているものです:
/**
* Return the primary text content of the message.
*/
private boolean textIsHtml = false;
private String getText(Part p) throws MessagingException, IOException {
if (p.getContent() instanceof ByteArrayInputStream) {
ByteArrayInputStream stream = (ByteArrayInputStream) p.getContent(); // This ByteArrayInputStream contains the long String mentioned in this question.
MimeMessage message = new MimeMessage(session, stream); // here I try to create a MimeMessage from that String, but this doesn't work.
p = message;
}
if (p.isMimeType("text/*")) {
String s = (String) p.getContent();
textIsHtml = p.isMimeType("text/html");
return s;
}
if (p.isMimeType("multipart/alternative")) {
// prefer html text over plain text
Multipart mp = (Multipart) p.getContent();
String text = null;
for (int i = 0; i < mp.getCount(); i++) {
Part bp = mp.getBodyPart(i);
if (bp.isMimeType("text/plain")) {
if (text == null) {
text = getText(bp);
}
continue;
} else if (bp.isMimeType("text/html")) {
String s = getText(bp);
if (s != null) {
return s;
}
} else {
return getText(bp);
}
}
return text;
} else if (p.isMimeType("multipart/*")) {
Multipart mp = (Multipart) p.getContent();
for (int i = 0; i < mp.getCount(); i++) {
String s = getText(mp.getBodyPart(i));
if (s != null) {
return s;
}
}
}
return null;
}
コード例は公式の Oracle FAQ ページObject
のコードですが、提供さgetContent()
れた を新しいに変換するために少し変更されていMimeMessage
ます。作成された の代わりにMimeMessage
mime-type があるため、コードは機能しません。そのため、最初の if ブロックの後にこれらの行を実行すると、ClassCastException がスローされます。text/html
multipart/*
if (p.isMimeType("text/*")) {
String s = (String) p.getContent();
textIsHtml = p.isMimeType("text/html");
return s;
}
String
巨大なパーサーを書かずに を解析する方法について賢い考えを持っている人はいますか?
前もって感謝します!