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.HybsEntry ;
019 import org.opengion.fukurou.util.Argument ;
020 import org.opengion.fukurou.util.LogWriter;
021
022 import java.util.Map;
023 import java.util.LinkedHashMap;
024
025 import java.util.logging.Logger;
026 import java.util.logging.Level;
027 import javax.mail.MessagingException ;
028
029 /**
030 * MailReceiver は、POP3プロトコルによるメール受信プログラãƒ?�§すã?
031 *
032 * 引数には、host,user,passwd,headerList,mailSaveDir,fileSaveDir,filter,help が指定できますã?
033 * メールは、メãƒ?‚»ージID名をファイル名として、セーブしますã?
034 * 添付ファイルは、å?のファイル名で、指定ã?ãƒ?‚£レクトリに出力される為、è¤?•°のメールã‚?
035 * 同時に抜く場合ã?、uniq 属æ?を付与してください。その場合ã?、メãƒ?‚»ージID?‹é?番?‹å?のファイルå�?
036 * で、ファイルをセーブしますã?添付ファイルには、同名ã?ファイルをè¤?•°添付することã�?
037 * できるため、保存時には、添付ファイルの番号をé?番としてファイル名に、付与しますã?
038 *
039 * 引数のプロパテイのキー部は、大æ–?—ã?小文字が厳格に適用されますã?で、正確に記述願いますã?
040 *
041 * Usage: java org.opengion.fukurou.fukurou.mail.MailReceiver
042 * -host=メールサーバã?(å¿??)
043 * -user=メールを取得するログインユーザー(å¿??)
044 * -passwd=メールを取得するログインパスワーãƒ?å¿??)
045 * -protocol=受信サーバã?のプロトコル[imap/pop3]を指å®?初期値:pop3)
046 * -port=受信サーバã?のポã?トをæŒ?®?初期値:-1)
047 * -mailSaveDir=受信メールをセーブするディレクトリ。指定がなã�??合ã?、標準å?力へ出力するã?
048 * -fileSaveDir=添付ファイルをセーブするディレクトリ。指定がなã�??合ã?抜き出さなã�??
049 * -useMsgId=添付ファイルをセーブするディレクトリに、MesssageIdフォルãƒ?‚’個別に割り当てるかどã�?�‹(初期値:false)
050 * -maxRowCount=受信メールのæœ?¤§取り込み件数(初期値:100)(0:[無制限])
051 * -match_Subject=受信メールのSubjectを選択する条件
052 * -match_Body=受信メールのBodyを選択する条件
053 * -match_From=受信メールのFromを選択する条件
054 * -match_XXXX=受信メールのヘッãƒ??部のキーXXXXを選択する条件
055 * -delete=検索後ã?メールをサーバã?から削除するかどã�?�‹をã?true/falseでæŒ?®?初期値:false)
056 * -help=使用方法を出力して、終äº?�—ますã?
057 *
058 * @version 0.9.0 2000/11/13
059 * @author Kazuhiko Hasegawa
060 * @since JDK5.0,
061 */
062 public class MailReceiver {
063 private static Logger logger = Logger.getLogger( "org.opengion.fukurou.fukurou.mail.MailReceiver" ); // 4.3.3.5 (2008/11/08)
064
065 private static final String CR = System.getProperty("line.separator");
066
067 /** 受信メールのæœ?¤§取り込み件数を指定しますã? {@value} */
068 public static final int MAX_ROW_COUNT = 100 ;
069
070 /** 検索後ã?メールをサーバã?から削除するかどã�?�‹をã?true/falseでæŒ?®šしますã? {@value} */
071 public static final boolean DELETE_MESSAGE = false ;
072
073 /** メールサーバã?のãƒ?ƒ•ォルトã?ロトコル {@value} */
074 public static final String PROTOCOL = "pop3" ;
075
076 /** メールサーバã?のãƒ?ƒ•ォルトã?ート番号 {@value} */
077 public static final int PORT = -1 ;
078
079 private Argument argment = null;
080
081 private static final Map<String,String> mustProparty ;
082 private static final Map<String,String> usableProparty ;
083
084 static {
085 mustProparty = new LinkedHashMap<String,String>();
086 mustProparty.put( "host", "メールサーバã?(å¿??)" );
087 mustProparty.put( "user", "メールを取得するログインユーザー(å¿??)" );
088 mustProparty.put( "passwd", "メールを取得するログインパスワーãƒ?å¿??)" );
089
090 usableProparty = new LinkedHashMap<String,String>();
091 usableProparty.put( "protocol", "受信サーバã?のプロトコル(imap,pop3)を指å®?初期値:pop3)" );
092 usableProparty.put( "port", "受信サーバã?のポã?トをæŒ?®?初期値:-1)" );
093 usableProparty.put( "mailSaveDir", "受信メールをセーブするディレクトリã€? +
094 CR + "æŒ?®šがなã�??合ã?、標準å?力へ出力するã?" );
095 usableProparty.put( "fileSaveDir", "添付ファイルをセーブするディレクトリã€? +
096 CR + "æŒ?®šがなã�??合ã?抜き出さなã�??" );
097 usableProparty.put( "useMsgId", "添付ファイルをセーブするディレクトリにã€? +
098 CR + "MesssageIdフォルãƒ?‚’個別に割り当てるかどã�?�‹ã€? );
099 usableProparty.put( "maxRowCount", "受信メールのæœ?¤§取り込み件数(初期値:100)(0:[無制限])" );
100 usableProparty.put( "match_Subject", "受信メールのSubjectを選択する条件" );
101 usableProparty.put( "match_Body", "受信メールのBodyを選択する条件" );
102 usableProparty.put( "match_From", "受信メールのFromを選択する条件" );
103 usableProparty.put( "match_", "受信メールのヘッãƒ??部のキーXXXXを選択する条件" );
104 usableProparty.put( "delete", "検索後ã?メールをサーバã?から削除するかどã�?�‹をã?" +
105 CR + "true/falseでæŒ?®?初期値:false)" );
106 usableProparty.put( "help", "使用方法を出力して、終äº?�—ますã?" );
107 }
108
109 /**
110 * レシーバã?を開始しますã?
111 *
112 * @og.rev 4.3.3.5 (2008/11/08) Argument オブジェクトへの引数ã‚?util â†?mail に訂正しますã?
113 *
114 * @param args 引数配å?
115 * @throws MessagingException なんらかã?エラーが発生したå?合ã?
116 */
117 public void start( final String[] args ) throws MessagingException {
118
119 // パラメータの解析ã?取å¾?
120 logger.fine( "パラメータの解析ã?取å¾? );
121 argment = new Argument( "org.opengion.fukurou.fukurou.mail.MailReceiver" ); // 4.3.3.5 (2008/11/08)
122 argment.setMustProparty( mustProparty );
123 argment.setUsableProparty( usableProparty );
124
125 argment.setArgument( args );
126
127 // help パラメータã�?true にæŒ?®šされた場合ã?処ç�??
128 if( argment.getProparty( "help",false ) ) {
129 System.out.println( argment.toString() );
130 return;
131 }
132
133 // 処ç�?�«å¿?¦�なå�?¨®パラメータを取得しておきますã?
134 logger.fine( "処ç�?�«å¿?¦�なå�?¨®パラメータを取得しますã?" );
135 MailRX recive = new MailRX();
136
137 recive.setHost( argment.getProparty( "host" ) ) ;
138 recive.setUser( argment.getProparty( "user" ) ) ;
139 recive.setPasswd( argment.getProparty( "passwd" ) ) ;
140 recive.setProtocol( argment.getProparty( "protocol",PROTOCOL ) ) ;
141 recive.setPort( argment.getProparty( "port",PORT ) ) ;
142 recive.setDelete( argment.getProparty( "delete",DELETE_MESSAGE ) ) ;
143 recive.setMaxRowCount( argment.getProparty( "maxRowCount",MAX_ROW_COUNT ) ) ;
144
145 // æŒ?®šã?条件にマッチしたメãƒ?‚»ージのみ抜き出す為の、SearchTerm オブジェクトã?作æ?
146 logger.fine( "æŒ?®šã?条件にマッチしたメãƒ?‚»ージのみ抜き出す条件を設定しますã?" );
147 HybsEntry[] matchs = argment.getEntrys( "match_" );
148 for( int i=0; i<matchs.length; i++ ) {
149 recive.addMatchTerm( matchs[i] ) ;
150 }
151
152 // リスナã?を設定して、受信メールをä¸?»¶ずつ処ç�?�—ますã?
153 logger.fine( "リスナã?を設定して、受信メールをä¸?»¶ずつ処ç�?�—ますã?" );
154 String mailSaveDir = argment.getProparty( "mailSaveDir" );
155 String fileSaveDir = argment.getProparty( "fileSaveDir" );
156 boolean useMsgId = argment.getProparty( "useMsgId",false );
157
158 MailReceiveListener listener = new ReceiveListener( mailSaveDir,fileSaveDir,useMsgId ) ;
159 recive.setMailReceiveListener( listener );
160
161 recive.start();
162 }
163
164 /**
165 * メール受信プログラãƒ?�§使用する MailReceiveListener の実è£??部クラスですã?
166 *
167 * @version 0.9.0 2000/11/13
168 * @author Kazuhiko Hasegawa
169 * @since JDK5.0,
170 */
171 private static class ReceiveListener implements MailReceiveListener {
172 private final String mailSaveDir ;
173 private final String fileSaveDir ;
174 private final boolean useMsgId ;
175 private int counter = 0;
176
177 /**
178 * コンストラクター
179 *
180 * @param mailSaveDir メールをセーブするå?合ã?保存フォルãƒ?��
181 * @param fileSaveDir メールの添付ファイルをセーブするå?合ã?保存フォルãƒ?��
182 * @param useMsgId 添付ファイルをセーブするå?合に、メãƒ?‚»ージIDを使用するかどã�?�‹
183 */
184 public ReceiveListener( final String mailSaveDir,final String fileSaveDir,final boolean useMsgId ) {
185 this.mailSaveDir = mailSaveDir;
186 this.fileSaveDir = fileSaveDir;
187 this.useMsgId = useMsgId;
188 }
189
190 /**
191 * 受信処ç�?‚’行いますã?
192 *
193 * @param message MailMessage
194 * @return 結果(true:正常/false:異常)
195 */
196 public boolean receive( final MailMessage message ) {
197 String msg = "[" + counter++ + "]" + message.getMessageID() + " 受信中" ;
198 System.out.println( msg );
199
200 if( mailSaveDir != null ) {
201 message.saveMessage( mailSaveDir );
202 }
203 else {
204 System.out.println( message.getSubject() );
205 System.out.println( message.getContent() );
206 }
207
208 if( fileSaveDir != null ) {
209 message.saveAttachFiles( fileSaveDir,useMsgId );
210 }
211 return true ;
212 }
213 }
214
215 /**
216 * main メソãƒ?ƒ‰ですã?
217 *
218 * @param args コマンド引数配å?
219 */
220 public static void main ( final String[] args ) {
221 MailReceiver receiver = new MailReceiver();
222 try {
223 logger.info( "メール受信処ç�?‚’開始しまã�? ---------------------------------------------" );
224 receiver.start( args );
225 logger.info( "正常に終äº?�—ましたã€? );
226 }
227 catch( Throwable th ) {
228 String errMsg = "メール受信中に例外が発生しましたã€?"
229 + CR + receiver.argment
230 + CR + th.getMessage() ;
231 LogWriter.log( errMsg );
232 logger.log( Level.SEVERE,errMsg, th );
233 throw new RuntimeException( errMsg,th ); // 4.0.0 (2005/01/31)
234 }
235 }
236 }