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     */
016    package org.opengion.fukurou.mail;
017    
018    import org.opengion.fukurou.util.StringUtil ;
019    import org.opengion.fukurou.util.HybsEntry ;
020    import org.opengion.fukurou.util.Argument ;
021    import org.opengion.fukurou.util.FileString ;
022    
023    import java.util.Map;
024    import java.util.LinkedHashMap;
025    
026    import java.util.logging.Logger;
027    import 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     *        -{@XXXX}=YYYY  メãƒ?‚»ージ本æ–?? {@XXXX} æ–?­—å?をã?YYYY æ–?­—å?に変換しますã?
049     *            {@ARG.XXX} 予ç´?–‡字変換 上記引数を割り当てますã?
050     *            {@DATE.XXX} 予ç´?–‡字変換 SimpleDateFormat 形式ã?æ–?­—を変換しますã?(日付ã?時刻ç­?
051     *            {@ENV.XXX}  予ç´?–‡字変換 シスãƒ?ƒ プロパティーのæ–?­—を変換しますã?(java -Dkey=value オプション)
052     *
053     * E-Mail で日本語を送信する場合ã?ISO-2022-JP(JISコーãƒ?化してã€?bit で
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     */
067    public 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    }