com.ozacc.mail.fetch.impl.sk_jp
クラス MailUtility

java.lang.Object
  上位を拡張 com.ozacc.mail.fetch.impl.sk_jp.MailUtility

public class MailUtility
extends Object

JavaMailのサポートクラスです。

主にヘッダに対するさまざまな加工機能を提供します。

バージョン:
$Revision: 1.1.2.1 $ $Date: 2005/01/18 07:20:59 $
作成者:
Shin

メソッドの概要
static String createReplySubject(String src)
          Subject:に"Re: "を付加します。
static String decodeText(String source)
          ヘッダ内の文字列をデコードします。
static String encodeParameter(String name, String value, String encoding, String lang)
          ヘッダのパラメタ部のエンコードを行います。
static String encodeText(String source, String charset, String encoding)
          文字列をエンコードします。
static String encodeWordJIS(String s)
          日本語を含むヘッダ用テキストを生成します。
static String fold(String source, int used)
          header valueの folding を行います。
static String getAddressesHTML(javax.mail.internet.InternetAddress[] addresses)
           
static String getFileName(javax.mail.Part part)
          Part#getFileName()のマルチバイト対応版です。
static String getMailAddresses(javax.mail.internet.InternetAddress[] addresses)
          get comma separated E-Mail addresses.
static String getParameter(String header, String name)
          ヘッダのパラメタ部のデコードを行います。
static javax.mail.Message getParentMessage(javax.mail.Part part)
          パートを保有する親Messageオブジェクトを返します。
static String getPersonal(javax.mail.internet.InternetAddress a)
           
static String getPersonalNames(javax.mail.internet.InternetAddress[] addresses)
          get comma separated personal names.
static String getTransferEncoding(byte[] b)
          get the Content-Transfer-Encoding: header value.
static int indexOfLWSP(String source, int startIndex, boolean decrease, char additionalDelimiter)
          指定位置から最初に見つかったLWSPのIndexを返します。
static int indexOfNonAscii(String source, int startIndex)
          指定位置から最初に見つかった非ASCII文字のIndexを返します。
static int indexOfNonLWSP(String source, int startIndex, boolean decrease)
          指定位置から最初に見つかったLWSP以外の文字のIndexを返します。
static boolean isAllAscii(String text)
          check if contains only ascii characters in text.
static boolean isLWSP(char c)
           
static javax.mail.internet.InternetAddress[] parseAddresses(String addressesString)
          入力されたアドレスをInternetAddress形式に変換します。
static javax.mail.internet.InternetAddress[] parseAddresses(String addressesString, boolean strict)
           
static Date parseDate(String rfc822DateString)
          Date構文の誤った"JST"タイムゾーンの補正を行います。
static void setFileName(javax.mail.Part part, String filename, String charset, String lang)
          Part#setFileName()のマルチバイト対応版です。
static void setTextContent(javax.mail.Part p, String s)
          パートにテキストをセットします。
static String unfold(String source)
          header valueの unfolding を行います。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

メソッドの詳細

getPersonal

public static String getPersonal(javax.mail.internet.InternetAddress a)

getMailAddresses

public static String getMailAddresses(javax.mail.internet.InternetAddress[] addresses)
get comma separated E-Mail addresses.


getPersonalNames

public static String getPersonalNames(javax.mail.internet.InternetAddress[] addresses)
get comma separated personal names.


getAddressesHTML

public static String getAddressesHTML(javax.mail.internet.InternetAddress[] addresses)

getTransferEncoding

public static String getTransferEncoding(byte[] b)
get the Content-Transfer-Encoding: header value.


getParentMessage

public static javax.mail.Message getParentMessage(javax.mail.Part part)
パートを保有する親Messageオブジェクトを返します。

パラメータ:
part - パート
戻り値:
ツリー構造の最上位にあたるメッセージオブジェクト

parseDate

public static Date parseDate(String rfc822DateString)
Date構文の誤った"JST"タイムゾーンの補正を行います。

JavaMailは"JST"と記述されるタイムゾーンを解釈しません。 ここは本来"+0900"でなければならないところです。
仕方がないので" JST"が含まれる文字列の場合は"+0900"を補完して MailDateFormat#parse()を通すようなparse()のラッパを用意します。

この実装は一時回避的なものであり、完全なものではありません。


createReplySubject

public static String createReplySubject(String src)
Subject:に"Re: "を付加します。

ある程度寛容に"Re: "に近い文字列と"[hoge]"を取り除きます。
ただし、意図しない部分が消されてしまう事もあり得ます。
JavaMailのreply()では"Re: "がエンコードされていた場合に 正しく"Re: "を取り除いてくれません。


parseAddresses

public static javax.mail.internet.InternetAddress[] parseAddresses(String addressesString)
                                                            throws javax.mail.internet.AddressException
入力されたアドレスをInternetAddress形式に変換します。

"名無し君 (コメント)"等の文字列(エンコード無し)を 渡されても、正しくpersonal文字列が設定されるようにします。
InternetAddress#parse()はエンコード済みの文字列を前提にしているため、 このメソッドの目的には沿いません。

パラメータ:
addresses - メイルアドレス文字列(カンマ区切り)
例外:
javax.mail.internet.AddressException

parseAddresses

public static javax.mail.internet.InternetAddress[] parseAddresses(String addressesString,
                                                                   boolean strict)
                                                            throws javax.mail.internet.AddressException
例外:
javax.mail.internet.AddressException

unfold

public static String unfold(String source)
header valueの unfolding を行います。 空白を厳密に扱うためには decodeText より先に呼び出す必要があります。


fold

public static String fold(String source,
                          int used)
header valueの folding を行います。

white spaceをfolding対象にします。
76bytesを超えないwhite space位置に を挿入します。

注:quoteを無視しますので、structured fieldでは不都合が 発生する可能性があります。

パラメータ:
used - ヘッダの':'までの文字数。76 - usedが最初のfolding候補桁
戻り値:
foldingされた( SPACEが挿入された)文字列

setTextContent

public static void setTextContent(javax.mail.Part p,
                                  String s)
                           throws javax.mail.MessagingException
パートにテキストをセットします。 Part#setText() の代わりにこちらを使うことで、 "ISO-2022-JP" コンバータではエンコードできない CP932 の 文字をエンコードできます。

例外:
javax.mail.MessagingException

encodeWordJIS

public static String encodeWordJIS(String s)
日本語を含むヘッダ用テキストを生成します。 変換結果は ASCII なので、これをそのまま setSubject や InternetAddress のパラメタとして使用してください。 "ISO-2022-JP" コンバータではエンコードできない CP932 の 文字をエンコードできます。ただし、encodeText() と異なり、 folding の意識をしておらず、また ASCII 部分を除いて分割 エンコードを行うこともできません。


decodeText

public static String decodeText(String source)
ヘッダ内の文字列をデコードします。

MimeUtilityの制約を緩めて日本で流通するエンコード形式に対応。 本来は、encoded-wordとnon-encoded-wordの間にはlinear-white-spaceが必要 なのですが、空白が無い場所でエンコードするタコメイラが多いので。

JISコードをエンコード無しで記述するタコメイラもあります。
ソースにESCが含まれていたら生JISと見なします。

=?utf-8?Q?・・・JISコード・・?=なんてさらにタコなメイラも。
試しにデコード後にまだESCが残ってたらISO-2022-JPと見なすことにします。

さらに、multibyte character の前後で別の encoded-word に切ってしまう メイラも…。隣接する encoded-word の CES が同じ場合はバイト列の 結合を行ってから CES デコードを行うようにした…。

日本語に特化してますねえ・・・。

パラメータ:
source - encoded text
戻り値:
decoded text

encodeText

public static String encodeText(String source,
                                String charset,
                                String encoding)
                         throws UnsupportedEncodingException
文字列をエンコードします。

MimeUtility(強いてはMimeMessage等も)では、1字でも非ASCII文字が含まれる と文字列全体をエンコードしてしまいます。
このメソッドでは空白で区切られた範囲だけをエンコードします。
Subjectの"Re: "等がエンコードされていると、この文字列でIn-Reply-To: References:の代わりにスレッドを形成しようとしても失敗することになる ため、こちらのエンコード方式を用いたがる人もいるかもしれません・・。

方針は、ASCII部に前後の空白一つを含ませ、それ以外は空白も含めて全て encoded-wordとします。()の内側は空白無しでもエンコード対象です。

パラメータ:
source - text
戻り値:
encoded text
例外:
UnsupportedEncodingException

indexOfNonAscii

public static int indexOfNonAscii(String source,
                                  int startIndex)
指定位置から最初に見つかった非ASCII文字のIndexを返します。 startIndex が範囲外の場合は -1 を返します。 (IndexOutOfBoundsException ではない)

パラメータ:
source - 検索する文字列
startIndex - 検索開始位置
戻り値:
検出した非ASCII文字Index。見つからなければ-1。

indexOfNonLWSP

public static int indexOfNonLWSP(String source,
                                 int startIndex,
                                 boolean decrease)
指定位置から最初に見つかったLWSP以外の文字のIndexを返します。 startIndex が範囲外の場合は -1 を返します。 (IndexOutOfBoundsException ではない)

パラメータ:
source - 検索する文字列
startIndex - 検索開始位置
decrease - trueで後方検索
戻り値:
検出した非ASCII文字Index。見つからなければ-1。

indexOfLWSP

public static int indexOfLWSP(String source,
                              int startIndex,
                              boolean decrease,
                              char additionalDelimiter)
指定位置から最初に見つかったLWSPのIndexを返します。 startIndex が範囲外の場合は -1 を返します。 (IndexOutOfBoundsException ではない)

パラメータ:
source - 検索する文字列
startIndex - 検索開始位置
decrease - trueで後方検索
additionalDelimiter - LWSP以外に区切りとみなす文字(1字のみ)
戻り値:
検出した非ASCII文字Index。見つからなければ-1。

isLWSP

public static boolean isLWSP(char c)

setFileName

public static void setFileName(javax.mail.Part part,
                               String filename,
                               String charset,
                               String lang)
                        throws javax.mail.MessagingException
Part#setFileName()のマルチバイト対応版です。 JavaMail1.2でなければコンパイルできません

例外:
javax.mail.MessagingException

encodeParameter

public static String encodeParameter(String name,
                                     String value,
                                     String encoding,
                                     String lang)
ヘッダのパラメタ部のエンコードを行います。

現状は受信できないものが多いのでこのメソッドだけでは使えません。
Content-Disposition:のfilenameのみに使用し、さらに Content-Type:のnameにMIME encodingでの記述も行うのが妥当でしょう。
パラメタは必ず行頭から始まるものとします。 (ヘッダの開始行から折り返された位置を開始位置とします)

foldingの方針はascii/non ascii境界のみをチェックします。 現状は連続するascii/non asciiの長さのチェックは現状行っていません。 (エンコード後のバイト数でチェックしなければならないのでかなり面倒)

パラメータ:
name - パラメタ名
value - エンコード対象のパラメタ値
encoding - 文字エンコーディング
lang - 言語指定子
戻り値:
エンコード済み文字列 ";\r\n name*0*=ISO-8859-2''・・・;\r\n name*1*=・・"

isAllAscii

public static boolean isAllAscii(String text)
check if contains only ascii characters in text.


getFileName

public static String getFileName(javax.mail.Part part)
                          throws javax.mail.MessagingException
Part#getFileName()のマルチバイト対応版です。

例外:
javax.mail.MessagingException

getParameter

public static String getParameter(String header,
                                  String name)
                           throws javax.mail.internet.ParseException
ヘッダのパラメタ部のデコードを行います。

RFC2231形式でfolding(分割)されたパラメタを結合し、デコードします。 尚、RFC2231にはパラメタの順番に依存するなと書かれていますが、 それを実装すると大変面倒(一度分割された全てのパートを 保持してソートしなければならない)なので、 シーケンス番号に関係なく(0から)順番に 並んでいるものとみなして処理することにします。

パラメータ:
header - ヘッダの値全体
name - 取得したいパラメタ名
戻り値:
デコード済み文字列 (パラメタが存在しない場合は null)
例外:
javax.mail.internet.ParseException


Copyright © 2004-2006 OZACC. All Rights Reserved.