    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.mail;
    017
    018import org.opengion.fukurou.util.StringUtil ;
    019import org.opengion.fukurou.util.HybsEntry ;
    020import org.opengion.fukurou.util.Argument ;
    021import org.opengion.fukurou.util.FileString ;
    022
    023import java.util.Map;
    024import java.util.LinkedHashMap;
    025
    026import java.util.logging.Logger;
    027import java.util.logging.Level;
    028
    029/**
    030 * MailTransfer は、ＳＭＴＰプロトコルによるメール送信プログラムです。
    031 *
    032 * 引数には、host,from,to,cc,bcc,replyTo,subject,message,charset,file,debug,help が指定できます。
    033 * 引数のプロパテイのキー部は、大文字・小文字が厳格に適用されますので、正確に記述願います。
    034 *
    035 * Usage: java org.opengion.fukurou.fukurou.mail.MailTransfer
    036 *        -host=メールサーバー(必須)
    037 *        -from=送信元アドレス(必須)
    038 *        -to=送信先アドレスをカンマ区切りで並べる(必須)
    039 *        -cc=関係者アドレスをカンマ区切りで並べる
    040 *        -bcc=隠し送信先アドレスをカンマ区切りで並べる
    041 *        -replyTo=返信先アドレスをカンマ区切りで並べる
    042 *        -subject=タイトル
    043 *        -message=本文を格納しているファイルのアドレス
    044 *        -charset=メール送信時のキャラクタセット [ISO-2022-JP / Windows-31J]
    045 *        -fileXX=添付ファイルのファイルパス( XX は複数登録時の添え字 )
    046 *        -debug=メイラーのデバッグモードを指定します。[false / true]
    047 *        -help=使用方法を出力して、終了します。
    048 *        -{&#064;XXXX}=YYYY  メッセージ本文の {&#064;XXXX} 文字列を、YYYY 文字列に変換します。
    049 *            {&#064;ARG.XXX} 予約文字変換 上記引数を割り当てます。
    050 *            {&#064;DATE.XXX} 予約文字変換 SimpleDateFormat 形式の文字を変換します。(日付、時刻等)
    051 *            {&#064;ENV.XXX}  予約文字変換 システムプロパティーの文字を変換します。(java -Dkey=value オプション)
    052 *
    053 * E-Mail で日本語を送信する場合、ISO-2022-JP(JISコード)化して、7bit で
    054 * エンコードして送信する必要がありますが、Windows系の特殊文字や、unicodeと
    055 * 文字のマッピングが異なる文字などが、文字化けします。
    056 * 対応方法としては、
    057 * １．Windows-31J + 8bit 送信
    058 * ２．ISO-2022-JP に独自変換 + 7bit 送信
    059 * の方法があります。
    060 * 今回、この２つの方法について、charset で指定できます。
    061 * 初期値は、ISO-2022-JP です。
    062 *
    063 * @version  4.0
    064 * @author   Kazuhiko Hasegawa
    065 * @since    JDK5.0,
    066 */
    067public class MailTransfer {
    068        private static Logger logger = Logger.getLogger( "org.opengion.fukurou.fukurou.mail.MailTransfer" );            // 4.3.3.5 (2008/11/08)
    069
    070        /** メール送信時のデフォルトキャラクタセット {@value}  */
    071        public static final String CHARSET = "ISO-2022-JP" ;
    072
    073        /** メイラーの初期デバッグモード {@value}  */
    074        public static final boolean DEBUG_MODE = false ;
    075
    076        private static final Map<String,String> mustProparty   ;  // 必須パラメータ
    077        private static final Map<String,String> usableProparty ;  // 整合性チェックパラメータ
    078
    079        static {
    080                mustProparty = new LinkedHashMap<String,String>();
    081                mustProparty.put( "host",       "メールサーバー(必須)" );
    082                mustProparty.put( "from",       "送信元アドレス(必須)" );
    083                mustProparty.put( "to",         "送信先アドレスをカンマ区切りで並べる(必須)" );
    084
    085                usableProparty = new LinkedHashMap<String,String>();
    086                usableProparty.put( "cc",               "関係者アドレスをカンマ区切りで並べる" );
    087                usableProparty.put( "bcc",              "隠し送信先アドレスをカンマ区切りで並べる" );
    088                usableProparty.put( "replyTo",  "返信先アドレスをカンマ区切りで並べる" );
    089                usableProparty.put( "subject",  "タイトル" );
    090                usableProparty.put( "message",  "本文を格納しているファイルのアドレス" );
    091                usableProparty.put( "charset",  "メール送信時のキャラクタセット [ISO-2022-JP / Windows-31J]" );
    092                usableProparty.put( "file",             "添付ファイルのファイルパス( XX は複数登録時の添え字 )" );
    093                usableProparty.put( "{@",               "{@XXXX}=YYYY  メッセージ本文の {@XXXX} 文字列を、YYYY 文字列に変換します。" );
    094                usableProparty.put( "{@ARG.",   "{@ARG.XXX} 予約文字変換 上記引数を割り当てます。" );
    095                usableProparty.put( "{@DATE.",  "{@DATE.XXX} 予約文字変換 SimpleDateFormat 形式の文字を変換します。(日付、時刻等)" );
    096                usableProparty.put( "{@ENV.",   "{@ENV.XXX} 予約文字変換 システムプロパティーの文字を変換します。(java -Dkey=value オプション)" );
    097                usableProparty.put( "debug",    "メイラーのデバッグモードを指定します。[false / true]" );
    098                usableProparty.put( "help",             "使用方法を出力して、終了します。" );
    099        }
    100
    101        /**
    102         * トランスファーを開始します。
    103         *
    104         * @og.rev 4.3.3.5 (2008/11/08) Argument オブジェクトへの引数を util → mail に訂正します。
    105         *
    106         * @param       args    引数配列
    107         */
    108        public void start( final String[] args ) {
    109
    110                // パラメータの解析、取得
    111                logger.fine( "パラメータの解析、取得" );
    112                Argument argment = new Argument( "org.opengion.fukurou.mail.MailTransfer" );            // 4.3.3.5 (2008/11/08)
    113                argment.setMustProparty( mustProparty );
    114                argment.setUsableProparty( usableProparty );
    115
    116                argment.setArgument( args );
    117
    118                // help パラメータが true に指定された場合の処理。
    119                if( argment.getProparty( "help",false ) ) {
    120                        System.out.println( argment.toString() );
    121                        return;
    122                }
    123
    124                String host  = argment.getProparty( "host" );
    125                String chset = argment.getProparty( "charset", CHARSET );
    126
    127                MailTX mail = new MailTX( host,chset );
    128                logger.fine( "org.opengion.fukurou.mail.MailTX の設定" );
    129
    130                mail.setFrom( argment.getProparty( "from" ) );
    131                mail.setTo( StringUtil.csv2Array( argment.getProparty( "to" ) ) );
    132                mail.setCc( StringUtil.csv2Array( argment.getProparty( "cc" ) ) );
    133                mail.setBcc( StringUtil.csv2Array( argment.getProparty( "bcc" ) ) );
    134                mail.setReplyTo( StringUtil.csv2Array( argment.getProparty( "replyTo" ) ) );
    135                mail.setSubject( argment.getProparty( "subject" ) );
    136                mail.setDebug( argment.getProparty( "debug", DEBUG_MODE ) );
    137
    138                // message は、本文を格納しているファイル名が指定されています。
    139                String msgFile = argment.getProparty( "message" ) ;
    140                logger.fine( "本文を格納しているファイルの取得。message=" + msgFile );
    141                if( msgFile != null ) {
    142                        FileString fs = new FileString();
    143                        fs.setFilename( msgFile );
    144                        String message = fs.getValue();
    145
    146                        // {@XXX} 変換は、Argument クラスの機能を使う。
    147                        message = argment.changeParam( message );
    148                        mail.setMessage( message );
    149                }
    150
    151                // 添付ファイルは、fileXX 形式で、複数指定されています。
    152                logger.fine( "添付ファイルを取り込みます。" );
    153                HybsEntry[] entry = argment.getEntrys( "file" );
    154                String[] files = new String[entry.length];
    155                for( int i=0; i<files.length; i++ ) {
    156                        files[i] = entry[i].getValue() ;
    157                }
    158                mail.setFilename( files );
    159
    160                // 送信
    161                logger.fine( "送信処理を行います。" );
    162                mail.sendmail();
    163        }
    164
    165        /**
    166         * main メソッドです。
    167         *
    168         * @param       args    引数配列
    169         */
    170        public static void main ( final String[] args ) {
    171                MailTransfer transfer = new MailTransfer();
    172                try {
    173                        logger.info( "メール送信処理を開始します  ---------------------------------------------" );
    174                        transfer.start( args );
    175                        logger.info( "正常に終了しました。" );
    176                }
    177                catch( Throwable th ) {
    178                        String errMsg = "メール送信中に例外が発生しました。 ";
    179                        logger.log( Level.SEVERE,errMsg, th );
    180                        throw new RuntimeException( errMsg,th );        // 4.0.0 (2005/01/31)
    181                }
    182        }
    183}