この回答は、オースティンの回答multipart/alternative
を拡張して、 ( )の処理に関する元の問題を修正します// without break same text appears twice in my tests
。
multipart/alternative
の場合、ユーザー エージェントは1 つの部分のみを選択することが期待されるため、テキストは 2 回表示されます。
RFC2046から:
「multipart/alternative」タイプは「multipart/mixed」と構文的に同じですが、セマンティクスは異なります。特に、身体の各部分は、同じ情報の「代替」バージョンです。
システムは、さまざまなパーツの内容が交換可能であることを認識する必要があります。システムは、ローカル環境と参照に基づいて「最適な」タイプを選択する必要があります。場合によっては、ユーザーの操作によっても選択する必要があります。"multipart/mixed" と同様に、ボディ パーツの順序は重要です。この場合、代替案は元のコンテンツに忠実である順に表示されます。一般に、最適な選択は、受信者システムのローカル環境でサポートされているタイプの LAST 部分です。
代替手段の扱いと同じ例:
private String getTextFromMessage(Message message) throws IOException, MessagingException {
String result = "";
if (message.isMimeType("text/plain")) {
result = message.getContent().toString();
} else if (message.isMimeType("multipart/*")) {
MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
result = getTextFromMimeMultipart(mimeMultipart);
}
return result;
}
private String getTextFromMimeMultipart(
MimeMultipart mimeMultipart) throws IOException, MessagingException {
int count = mimeMultipart.getCount();
if (count == 0)
throw new MessagingException("Multipart with no body parts not supported.");
boolean multipartAlt = new ContentType(mimeMultipart.getContentType()).match("multipart/alternative");
if (multipartAlt)
// alternatives appear in an order of increasing
// faithfulness to the original content. Customize as req'd.
return getTextFromBodyPart(mimeMultipart.getBodyPart(count - 1));
String result = "";
for (int i = 0; i < count; i++) {
BodyPart bodyPart = mimeMultipart.getBodyPart(i);
result += getTextFromBodyPart(bodyPart);
}
return result;
}
private String getTextFromBodyPart(
BodyPart bodyPart) throws IOException, MessagingException {
String result = "";
if (bodyPart.isMimeType("text/plain")) {
result = (String) bodyPart.getContent();
} else if (bodyPart.isMimeType("text/html")) {
String html = (String) bodyPart.getContent();
result = org.jsoup.Jsoup.parse(html).text();
} else if (bodyPart.getContent() instanceof MimeMultipart){
result = getTextFromMimeMultipart((MimeMultipart)bodyPart.getContent());
}
return result;
}
これは非常に単純な例であることに注意してください。多くのケースが見逃されているため、現在の形式で本番環境で使用するべきではありません。