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    }