All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ozacc.mail.fetch.impl.sk_jp.MultipartUtility Maven / Gradle / Ivy

/*
 * @(#) $Id: MultipartUtility.java,v 1.1.2.2 2004/10/24 10:26:50 otsuka Exp $
 * $Revision: 1.1.2.2 $
 * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.
 */
package com.ozacc.mail.fetch.impl.sk_jp;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.activation.DataHandler;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;

/**
 * メッセージボディを取り出す手段を提供するstaticメソッドのセットです。
 * 

*

* @version $Revision: 1.1.2.2 $ $Date: 2004/10/24 10:26:50 $ * @author Shin * @author Tomohiro Otsuka */ public class MultipartUtility { private static final String JIS_CHARSET = "ISO-2022-JP"; /** * 指定パートのボディを返します。 *

* Part#getContent()の代わりです。 * MIMEに準拠しないContent-Type:の補正を行います。 * charset指定がない場合は"ISO-2022-JP"を補います。 *

* パートがUTF-7の場合も正常に内容を取得出来ます。 *

*/ public static Object getContent(Part part) throws MessagingException, IOException { return getContent(part, JIS_CHARSET); } private static CorrectedContentTypeDataSource correctedDataSource = new CorrectedContentTypeDataSourceUTF7Support(); private static DataHandler correctedDataHandler = new DataHandler(correctedDataSource); /** * 指定パートのボディを返します。 *

* MIMEに準拠しないContent-Type:の補正を行います。 * charset指定がない場合はcharsetで指定されたもので補います。 *

* パートがUTF-7の場合も正常に内容を取得出来ます。 *

*/ public static Object getContent(Part part, String charset) throws MessagingException, IOException { synchronized (correctedDataSource) { correctedDataSource.setPart(part); try { correctedDataSource.setDefaultCharset(charset); return correctedDataHandler.getContent(); } catch (UnsupportedEncodingException e) { /* * 不正な文字コードがcharsetにセットされ例外がスローされた場合に * JIS_CHARSETに文字コードを置き換え、再度ホディの取得を試みます。 * * by otsuka */ correctedDataSource.setForceCharset(JIS_CHARSET); return correctedDataHandler.getContent(); } } } /** * 指定パート配下で最初に見つけたテキストパートのボディを返します。 * process()を呼び出して結果を返すだけのconvenience methodです。 */ public static String getFirstPlainText(Part part) throws MessagingException { FirstPlainPartExtractor h = new FirstPlainPartExtractor(); process(part, h); return h.getText(); } /** * 指定パート配下のinlineなテキストパートを集めて表示用のボディを返します。 * process()を呼び出して結果を返すだけのconvenience methodです。 */ public static String getPlainText(Part part) throws MessagingException { PlainPartExtractor h = new PlainPartExtractor(); process(part, h); return h.getText(); } /** * 指定パート配下の各パートを処理します。 *

* すべてのPartに対してPartHandlerが呼び出されます。
*

*/ public static void process(Part part, PartHandler handler) throws MessagingException { process(part, handler, null); } private static boolean process(Part part, PartHandler handler, ContentType context) throws MessagingException { try { if (part.isMimeType("multipart/*")) { Multipart mp = (Multipart)part.getContent(); ContentType cType = new ContentType(part.getContentType()); for (int i = 0; i < mp.getCount(); i++) { if (!process(mp.getBodyPart(i), handler, cType)) { return false; } } return true; } return handler.processPart(part, context); } catch (IOException e) { throw new MessagingException("Got exception \nin " + part + "\n", e); } } /** * 指定partにbodyPartを追加します。 * partがマルチパーとコンテナの場合はそのコンテナにbodyPartを追加します。 * そうでない場合はpartのボディとしてmultipart/mixedのコンテナを設定し、 * 元のpartのボディとbodyPartのボディをそのコンテナに追加します。 */ public static void addBodyPart(Part part, MimeBodyPart bodyPart) throws MessagingException, IOException { if (part.isMimeType("multipart/*")) { ((MimeMultipart)part.getContent()).addBodyPart(bodyPart); return; } // 仮 MimeMultipart mp = new MimeMultipart("mixed"); MimeBodyPart original = new MimeBodyPart(); original.setContent(part.getContent(), part.getContentType()); mp.addBodyPart(original); mp.addBodyPart(bodyPart); part.setContent(mp); } /** * partのツリー構造をダンプするデバッグ用メソッドです。 */ public static void dump(Part part) { dump(part, 0); } private static void dump(Part part, int layer) { for (int i = 0; i < layer; i++) { System.out.print(" "); } try { System.out.println(part.getClass() + ":" + part.getContentType()); if (part.isMimeType("multipart/*")) { MimeMultipart mp = (MimeMultipart)part.getContent(); for (int i = 0; i < mp.getCount(); i++) { dump(mp.getBodyPart(i), layer + 1); } } } catch (Exception e) { e.printStackTrace(); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy