/[webpac]/openisis/current/org/openisis/Mail.java
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /openisis/current/org/openisis/Mail.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 237 - (hide annotations)
Mon Mar 8 17:43:12 2004 UTC (20 years, 3 months ago) by dpavlin
File size: 22346 byte(s)
initial import of openisis 0.9.0 vendor drop

1 dpavlin 237 /*
2     openisis - an open implementation of the CDS/ISIS database
3     Version 0.8.x (patchlevel see file Version)
4     Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org
5    
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Lesser General Public
8     License as published by the Free Software Foundation; either
9     version 2.1 of the License, or (at your option) any later version.
10    
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     Lesser General Public License for more details.
15    
16     You should have received a copy of the GNU Lesser General Public
17     License along with this library; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19    
20     see README for more information
21     EOH */
22    
23     package org.openisis;
24    
25     import java.io.*;
26     import java.util.*;
27    
28     import javax.activation.*;
29     import javax.mail.*;
30     import javax.mail.internet.*;
31    
32    
33     /**
34     This class contains a collection of javax.mail based E-Mail utilities.
35    
36     <p>
37     $Id: Mail.java,v 1.4 2003/04/08 00:20:53 kripke Exp $
38     @version $Revision: 1.4 $
39     @author $Author: kripke $
40     */
41     public abstract class Mail {
42    
43     public static final String EMPTY = "";
44    
45     public static final String MESSAGEID = "message-id";
46     public static final String DATE = "date";
47     public static final String TO = "to";
48     public static final String CC = "cc";
49     public static final String BCC = "bcc";
50     public static final String FROM = "from";
51     public static final String SENDER = "sender";
52     public static final String REPLYTO = "reply-to";
53     public static final String SUBJECT = "subject";
54     public static final String REFERENCES = "references";
55     public static final String INREPLYTO = "in-reply-to";
56     public static final String KEYWORDS = "keywords";
57     public static final String COMMENTS = "comments";
58     public static final String ENCRYPTED = "encrypted";
59     public static final String PRECEDENCE = "precedence"; // non-standard
60     public static final String XPRIORITY = "x-priority"; // non-standard
61     public static final String RETURNPATH = "return-path";
62     public static final String DLVRDTO = "delivered-to"; // qmail
63     public static final String RECEIVED = "received";
64     public static final String XMAILER = "x-mailer";
65     public static final String CTYPE = "content-type";
66     public static final String CTRANSENC = "content-transfer-encoding";
67    
68     public static final String TEXT_PLAIN = "text/plain";
69     public static final String TEXT_ISO = "text/plain; charset=\"iso-8859-1\"";
70     public static final String TEXT_HTML = "text/html";
71     public static final String MESS_MIME = "message/rfc822";
72     public static final String MULT_MIXED = "multipart/mixed";
73     public static final String MULT_ALT = "multipart/alternative";
74     public static final String MULT_APPLE = "multipart/appledouble";
75     public static final String MULT_SIGN = "multipart/signed";
76     public static final String MULT_ANY = "multipart/*";
77     public static final String APPL_WORD = "application/msword";
78     public static final String APPL_PDF = "application/pdf";
79     public static final String APPL_RTF = "application/rtf";
80     public static final String APPL_BYTES = "application/octet-stream";
81     public static final String APPL_APPLE = "application/applefile";
82     public static final String APPL_ANY = "application/*";
83     public static final String IMAG_GIF = "image/gif";
84     public static final String IMAG_JPEG = "image/jpeg";
85     public static final String IMAG_ANY = "image/*";
86    
87     public static final String SMTP_HOST = "mail.smtp.host";
88    
89     public static final Session SES;
90     static {
91     if ( null == System.getProperty( SMTP_HOST ) )
92     System.setProperty( SMTP_HOST, "localhost" );
93     SES = Session.getDefaultInstance( System.getProperties(), null );
94     }
95    
96    
97     public static interface Source {
98     Message[] get () throws Exception;
99     void done ( boolean expunge ) throws Exception;
100     }
101    
102     public static interface Sink {
103     void put ( Message m ) throws Exception;
104     void put ( Message[] m ) throws Exception;
105     }
106    
107    
108     // //////////////////////////////////////////////////
109     // utilities
110     //
111    
112     public static void del ( Message m )
113     throws Exception
114     {
115     m.setFlag( Flags.Flag.DELETED, true );
116     } // del
117    
118     public static void del ( Message[] m )
119     throws Exception
120     {
121     for ( int i=0; i<m.length; i++ )
122     if ( null != m[i] )
123     m[i].setFlag( Flags.Flag.DELETED, true );
124     } // del
125    
126    
127     public static void put ( Sink s, Message[] m )
128     throws Exception
129     {
130     for ( int i=0; i<m.length; i++ )
131     if ( null != m[i] )
132     s.put( m[i] );
133     } // put
134    
135     public static int move ( Sink si, Source so )
136     throws Exception
137     {
138     Message[] m;
139     int copied = 0;
140     while ( null != (m = so.get()) && 0 < m.length ) {
141     si.put( m );
142     del( m );
143     so.done( true );
144     copied += m.length;
145     }
146     return copied;
147     } // move
148    
149     public static String head ( Part p, String name, String def )
150     throws Exception
151     {
152     String[] hh = p.getHeader( name );
153     return null == hh || 0 == hh.length ? def : hh[0];
154     } // head
155    
156     public static String head ( Part p, String name )
157     throws Exception
158     {
159     return head( p, name, null );
160     } // head
161    
162     // join lines, commonly used for content type
163     public static String oneline ( String ct )
164     {
165     return null == ct ? null : ct.replace( '\n', '\t' ).replace( '\r', ' ' );
166     } // oneline
167    
168     public static Message message ( String[] headers, String body )
169     throws Exception
170     {
171     MimeMessage mm = new MimeMessage( SES );
172     for ( int i=0; i<headers.length; i+=2 )
173     mm.addHeader( headers[i], headers[i+1] );
174     mm.addHeader( CTYPE, TEXT_ISO );
175     mm.setContent( body, TEXT_ISO );
176     if ( null == mm.getSentDate() )
177     mm.setSentDate( new Date() );
178     return mm;
179     }
180    
181     // //////////////////////////////////////////////////
182     // implementations
183     //
184    
185     public static class Pop implements Source {
186     static final FetchProfile FPEMPTY = new FetchProfile();
187     Store _store;
188     Folder _f;
189     String _h;
190     int _o;
191     String _u;
192     String _p;
193     int _max;
194    
195     public Pop ( String host, int port, String user, String pass, int max )
196     throws Exception
197     {
198     _store = SES.getStore( "pop3" );
199     _h = host;
200     _o = port;
201     _u = user;
202     _p = pass;
203     _max = max;
204     }
205    
206     public Pop ( String host, String user, String pass, int max )
207     throws Exception
208     {
209     this( host, 110, user, pass, max );
210     }
211    
212     public Pop ( String host, String user, String pass )
213     throws Exception
214     {
215     this( host, user, pass, 0 );
216     }
217    
218     public Message[] get ()
219     throws Exception
220     {
221     _store.connect( _h, _o, _u, _p );
222     _f = _store.getFolder( "INBOX" ); // the magic default folder
223     _f.open( Folder.READ_WRITE );
224     Message[] m = _f.getMessages();
225     System.err.println( "pop "+_u+"@"+_h+":"+_o+" new "
226     + (null==m ? -1 : m.length) );
227     if ( null == m )
228     return null;
229     if ( 0 != _max && _max < m.length ) {
230     Message[] mm = new Message[_max];
231     System.arraycopy( m, 0, mm, 0, _max );
232     m = mm;
233     }
234     _f.fetch( m, FPEMPTY );
235     System.err.println( "pop "+_u+"@"+_h+":"+_o+" got "+m.length );
236     return m;
237     }
238    
239     public void done ( boolean expunge )
240     throws Exception
241     {
242     if ( null != _f ) {
243     _f.close( expunge );
244     _f = null;
245     }
246     _store.close();
247     }
248     } // class Pop
249    
250    
251     public static class Dir implements Source, Sink { // the Maildir
252     final String _t;
253     final String _n;
254     final String _c;
255     final File _ndir;
256     int _lim;
257    
258     Msg[] got;
259    
260     class Msg extends MimeMessage {
261     final File _f;
262     Msg ( File f )
263     throws Exception
264     {
265     super( SES, new FileInputStream( f ) );
266     _f = f;
267     System.err.println( "file "+f.getName()
268     +": "+head( this, MESSAGEID, "<?>" ) );
269     }
270     }
271    
272     public Dir ( String base )
273     throws Exception
274     {
275     _t = base + File.separator + "tmp";
276     _n = base + File.separator + "new";
277     _c = base + File.separator + "cur";
278     _ndir = new File(_n);
279     File t = new File(_t);
280     File c = new File(_c);
281     if ( ! t.isDirectory() && ! t.mkdirs() )
282     throw new FileNotFoundException( _t );
283     if ( ! _ndir.isDirectory() && ! _ndir.mkdirs() )
284     throw new FileNotFoundException( _n );
285     if ( ! c.isDirectory() && ! c.mkdirs() )
286     throw new FileNotFoundException( _c );
287     }
288    
289     public String toString () {
290     return "Dir "+_ndir.getParentFile().getAbsolutePath();
291     }
292    
293    
294     public Message[] get () throws Exception
295     {
296     File[] l = _ndir.listFiles();
297     System.err.println( _ndir+": "+l.length );
298     int i = l.length;
299     if ( 0 != _lim && i > _lim )
300     i = _lim;
301     got = new Msg[i];
302     while ( 0 < i-- ) {
303     File f = new File( _t+File.separator+l[i].getName() );
304     l[i].renameTo( f );
305     got[i] = new Msg( f );
306     }
307     return got;
308     }
309    
310     public void done ( boolean expunge ) throws Exception
311     {
312     if ( expunge && null != got )
313     for ( int i=0; i<got.length; i++ )
314     if ( got[i].isSet( Flags.Flag.DELETED ) )
315     got[i]._f.delete();
316     got = null;
317     }
318    
319    
320     public void put ( Message m )
321     throws Exception
322     {
323     File f;
324     String s = File.separator+System.currentTimeMillis();
325     while ( ! (f = new File( _t + s )).createNewFile() )
326     s += (int)(10*Math.random()) % 10;
327     OutputStream o = new FileOutputStream(f);
328     m.writeTo( o );
329     o.close();
330     while ( ! f.renameTo(new File( _n + s )) )
331     s += (int)(10*Math.random()) % 10;
332     }
333    
334     public void put ( Message[] m )
335     throws Exception
336     {
337     Mail.put( this, m );
338     }
339     } // class Dir
340    
341    
342     public static class Arc implements Sink { // the archive
343     static final String OK = "ok";
344     static final Map OKHDR = new HashMap();
345     static {
346     OKHDR.put( MESSAGEID, OK );
347     OKHDR.put( DATE, OK );
348     OKHDR.put( FROM, OK );
349     OKHDR.put( REPLYTO, OK );
350     OKHDR.put( SUBJECT, OK );
351     OKHDR.put( REFERENCES, OK );
352     OKHDR.put( INREPLYTO, OK );
353     OKHDR.put( KEYWORDS, OK );
354     OKHDR.put( COMMENTS, OK );
355     }
356    
357     final String _u;
358     final String _b;
359     final Sink _fwd;
360    
361     final int _maxlines = 60;
362     final int _minlines = 15;
363     final boolean _zip = true;
364    
365    
366     /** path is /m/d/h/xxx.
367     january is Calendar.JANUARY, which is 0
368     */
369     public static String path ( int mon, int day, int hour, int min, int sec )
370     {
371     char mo = (char)('a'+mon);
372     char d = (char)(day + (day<10 ? '0' : 'a'-10));
373     char h = (char)('a'+hour);
374     int hs = 60*min + sec;
375     sec = hs - 100*(min = hs / 100);
376     char m = (char)(min + (min<10 ? '0' : 'a'-10));
377     return File.separator+mo + File.separator+d +File.separator+h
378     + File.separator+m+(char)('0'+sec/10)+(char)('0'+sec%10);
379     } // path
380    
381     public static String path ( Calendar c )
382     {
383     return path( c.get( Calendar.MONTH ), c.get( Calendar.DATE ),
384     c.get( Calendar.HOUR_OF_DAY ), c.get( Calendar.MINUTE ),
385     c.get( Calendar.SECOND ) );
386     } // path
387    
388     public static String path ( Date d )
389     {
390     Calendar c = new GregorianCalendar();
391     c.setTime( d );
392     return path( c );
393     } // path
394    
395     public static String path ()
396     {
397     return path( new GregorianCalendar() );
398     } // path
399    
400    
401     public Arc ( String base, String url, Sink fwd )
402     throws Exception
403     {
404     _b = base;
405     _u = url;
406     _fwd = fwd;
407     File b = new File(_b);
408     if ( ! b.isDirectory() && ! b.mkdirs() )
409     throw new FileNotFoundException( _b );
410     }
411    
412     public String toString () {
413     return "Arc "+_b+" "+_u;
414     }
415    
416     public void put ( Message m )
417     throws Exception
418     {
419     String mid = head( m, MESSAGEID, "<?>" );
420     System.err.println( _b+" += "+mid );
421     Date d = m.getSentDate();
422     if ( null == d )
423     d = m.getReceivedDate();
424     if ( null == d ) {
425     System.err.println( "warning: no date found in "+mid );
426     d = new Date();
427     }
428     String base = path( d );
429     String path = base;
430     File f = new File( _b + path );
431     File dir = f.getParentFile();
432     if ( ! dir.isDirectory() && ! dir.mkdirs() )
433     throw new FileNotFoundException( dir.getAbsolutePath() );
434     for ( int i=0; ! f.createNewFile(); i++ )
435     f = new File( _b + (path = base + Integer.toString( i, 36 )) );
436     String name = f.getName();
437     // got unique path path
438     System.out.println( "new message "+mid+" date "+d+" -> "+path );
439     MimeMessage mm = new MimeMessage( SES );
440     Enumeration e = m.getAllHeaders();
441     while ( e.hasMoreElements() ) {
442     Header h = (Header)e.nextElement();
443     String n = h.getName().toLowerCase();
444     if ( OK == OKHDR.get(n) )
445     mm.addHeader( n, h.getValue() );
446     }
447     mm.addHeader( CTYPE, TEXT_ISO );
448     mm.addHeader( CTRANSENC, "8bit" );
449     StringBuffer b = new StringBuffer( 4096 );
450     Stack s = new Stack();
451     s.push( m );
452     int i = 0;
453     int totlines = 0;
454     List binparts = new ArrayList( 32 );
455     while ( ! s.isEmpty() ) {
456     Part p = (Part)s.pop();
457     String ct = oneline( p.getContentType() );
458     // ct = null == ct ? TEXT_PLAIN : ct.toLowerCase();
459    
460     if ( p.isMimeType( MULT_ANY ) ) {
461     Object content = p.getContent();
462     if ( ! (content instanceof Multipart) ) {
463     // ignore
464     System.err.println( "multipart type "+ct
465     +" has class "+content.getClass().getName() );
466     mm.addHeader( COMMENTS, "dropped bad multipart "+ct );
467     } else {
468     Multipart mu = (Multipart)content;
469     int cnt = mu.getCount();
470     if ( cnt > 8 ) {
471     System.err.println( "multipart with too many parts: "+cnt );
472     cnt = 8;
473     }
474     Part[] pu = new Part[cnt];
475     for ( int j=0; j<cnt; j++ )
476     pu[j] = mu.getBodyPart( j );
477     if ( p.isMimeType( MULT_ALT )
478     || p.isMimeType( MULT_SIGN )
479     ) { // alternatives suggested
480     int select = -1;
481     for ( int j=0; j<cnt; j++ ) // see wether we can decide
482     if ( pu[j].isMimeType( TEXT_PLAIN ) ) {
483     select = j;
484     break;
485     }
486     if ( 0 <= select ) {
487     for ( int j=0; j<cnt; j++ )
488     if ( select != j )
489     mm.addHeader( COMMENTS, "dropped alternative "+
490     oneline( pu[j].getContentType() ) + " for "+i );
491     if ( 0 != select )
492     pu[0] = pu[select];
493     cnt = 1;
494     }
495     } else if ( p.isMimeType( MULT_APPLE ) // apple ...
496     && 2 == cnt // ... double
497     ) { // kill ressource fork
498     int j = 0;
499     if ( pu[0].isMimeType( APPL_APPLE )
500     || pu[j=1].isMimeType( APPL_APPLE )
501     ) {
502     if ( 0 == j )
503     pu[0] = pu[1];
504     mm.addHeader( COMMENTS, "dropped appledouble" );
505     cnt = 1;
506     }
507     }
508     for ( int j=cnt; j-- > 0; ) // push parts backwards
509     s.push( pu[j] );
510     }
511     continue;
512     } // multi
513    
514     i++; // about to create part i
515     String part = path+'-'+i;
516    
517     // if ( ! p.isMimeType( TEXT_PLAIN ) ) {
518     /*
519     it's so awfully unreliable ... many RTFs go as APPL_WORD ...
520     if ( p.isMimeType( TEXT_HTML ) )
521     ext = ".html";
522     else if ( p.isMimeType( APPL_WORD ) )
523     ext = ".doc";
524     else
525     ext = "";
526     */
527     OutputStream o = new FileOutputStream( _b+part );
528     p.getDataHandler().writeTo( o );
529     o.close();
530     // can we convert it ?
531     String[] args = new String[] { "any2txt", "-v", name+'-'+i };
532     Process fix = Runtime.getRuntime().exec( args, null, dir );
533     BufferedReader err = new BufferedReader( new InputStreamReader(
534     fix.getErrorStream() ) );
535     String line;
536     while ( null != (line = err.readLine()) )
537     System.err.println( "any2txt:\t"+line );
538     err.close();
539     fix.waitFor();
540     int ret = fix.exitValue();
541     String ext = EMPTY;
542     boolean havetext = 0 != (ret & 1) || 0 == ret;
543     int type = ret & ~1;
544     switch ( type ) {
545     case 0: ext = ".txt"; break;
546     case 2: ext = ".html"; break;
547     case 4: ext = ".pdf"; break;
548     case 6: ext = ".rtf"; break;
549     case 8: ext = ".doc"; break;
550     case 16: // mail -- reread and start over
551     try {
552     s.push( new MimeMessage( SES, new FileInputStream( _b+part ) ) );
553     // TODO: delete
554     continue;
555     } catch (Exception ee) {
556     System.err.println( "could not reload mail "+mid+"["+i+"] "+ct
557     +" from "+part );
558     ee.printStackTrace();
559     }
560     ext = ".eml";
561     break;
562     case 32: ext = ".gif"; break;
563     case 34: ext = ".jpg"; break;
564     case 36: ext = ".bmp"; break;
565     case 38: ext = ".png"; break;
566     case 40: ext = ".tiff"; break;
567     }
568     System.err.println( mid+"["+i+"] "+ct+" is "+ext+" ("+ret+")" );
569    
570     if ( EMPTY != ext && 1 != ret ) // rename
571     (new File(_b+part)).renameTo( new File(_b+part+ext) );
572    
573     if ( 0 != type ) {
574     binparts.add( name+'-'+i+ext );
575     // mm.addHeader( COMMENTS, "part "+i+" "+ct+" is "+part );
576     if ( ! havetext ) {
577     if ( ! _zip ) {
578     if ( 0 < totlines )
579     b.append( "\r\n---\r\n\r\n" );
580     b.append( "\r\nget part "+i+" at "+_u+part+ext+"\r\n" );
581     }
582     totlines++;
583     continue;
584     }
585     }
586     // }
587    
588     // now _b+part.txt contains plaintext
589     File plain = new File(_b+part+".txt");
590     BufferedReader br = new BufferedReader(
591     new InputStreamReader( new FileInputStream( plain ) ) );
592     int lines = 0;
593     int max = _maxlines - totlines;
594     if ( max < _minlines )
595     max = _minlines;
596     // String line;
597     if ( 0 < totlines )
598     b.append( "\r\n---\r\n\r\n" );
599     while ( null != (line = br.readLine()) ) {
600     b.append( line ).append( "\r\n" );
601     if ( max == ++lines ) {
602     mm.addHeader( COMMENTS, "plaintext "+i+" continued at "+part );
603     b.append( "... read more: "+_u+part+".txt ("
604     +(1 + plain.length()/1024)+" KB)\r\n" );
605     break;
606     }
607     }
608     if ( 0 != type && !_zip )
609     b.append( "\r\nget original part "+i+" at "+_u+part+ext+"\r\n" );
610     totlines += lines;
611     br.close();
612     }
613     int nparts = binparts.size();
614     if ( _zip && 0 != nparts ) {
615     String[] args = new String[3+nparts];
616     int a=0;
617     args[a++] = "zip";
618     args[a++] = "-m"; // move
619     args[a++] = name+".zip";
620     for ( int p = 0; p<nparts; p++ )
621     args[a++] = (String)binparts.get(p);
622     Process zip = Runtime.getRuntime().exec(
623     args, null, dir );
624     BufferedReader out = new BufferedReader( new InputStreamReader(
625     zip.getInputStream() ) );
626     String line;
627     while ( null != (line = out.readLine()) )
628     b.append( line+"\r\n" );
629     // System.err.println( "zip:\t"+line );
630     out.close();
631     zip.waitFor();
632     int ret = zip.exitValue();
633     File zipped = new File(_b+path+".zip");
634     if ( 0 != ret )
635     System.err.println( "zip exited "+ret );
636     else if ( ! zipped.exists() )
637     System.err.println( "no zipfile "+zipped );
638     else
639     b.append( "\r\nget original parts at "+_u+path+".zip ("
640     +(1 + zipped.length()/1024)+" KB)\r\n" );
641     }
642     mm.setContent( b.toString(), TEXT_ISO );
643     OutputStream o = new FileOutputStream(f);
644     mm.writeTo( o );
645     o.close();
646     f.renameTo( new File( f.getPath()+".mail" ) );
647     if ( null != _fwd )
648     _fwd.put( mm );
649     }
650    
651     public void put ( Message[] m )
652     throws Exception
653     {
654     Mail.put( this, m );
655     }
656     } // class Arc
657    
658    
659     public static class Smtp implements Sink {
660    
661     Transport _t;
662     Address[] _a;
663     boolean _conn;
664    
665     public Smtp ( Session s, Address[] a ) throws Exception {
666     _t = s.getTransport( s.getProvider("smtp") );
667     _a = a;
668     }
669    
670     public Smtp ( Address[] a ) throws Exception {
671     this( SES, a );
672     }
673    
674     public Smtp ( String a ) throws Exception {
675     this( SES, new Address[] { new InternetAddress(a) } );
676     }
677    
678     /** connect. return true, iff we weren't already connected. */
679     public boolean connect () throws Exception {
680     if ( _conn )
681     return false;
682     _t.connect();
683     return _conn = true;
684     }
685    
686     public void close () throws Exception {
687     if ( _conn ) {
688     _t.close();
689     _conn = false;
690     }
691     }
692    
693     public void put ( Message m )
694     throws Exception
695     {
696     boolean nconn = connect();
697     _t.sendMessage( m, null != _a ? _a : m.getAllRecipients() );
698     if ( nconn ) close();
699     }
700    
701     public void put ( Message[] m )
702     throws Exception
703     {
704     boolean nconn = connect();
705     Mail.put( this, m );
706     if ( nconn ) close();
707     }
708     } // class Smtp
709    
710    
711     public static class Cmd implements Sink {
712    
713     String _cmd;
714    
715     public Cmd ( String cmd ) {
716     _cmd = cmd;
717     }
718    
719     public void put ( Message m )
720     throws Exception
721     {
722     Process run = Runtime.getRuntime().exec( _cmd );
723     OutputStream o = run.getOutputStream();
724     m.writeTo( o );
725     o.close();
726     BufferedReader err = new BufferedReader( new InputStreamReader(
727     run.getErrorStream() ) );
728     String line;
729     while ( null != (line = err.readLine()) )
730     System.err.println( _cmd+":\t"+line );
731     err.close();
732     run.waitFor();
733     int ret = run.exitValue();
734     if ( 0 != ret )
735     System.err.println( "Cmd '"+_cmd+"' exited "+ret );
736     }
737    
738     public void put ( Message[] m )
739     throws Exception
740     {
741     Mail.put( this, m );
742     }
743     } // class Cmd
744    
745    
746     public static void main ( String[] args )
747     throws Exception
748     {
749     String host = "localhost";
750     int port = 110;
751     String user = "test";
752     String pass = "test";
753     String sodir = "/tmp/test";
754     String sidir = "/tmp/test";
755     String url = "http://openisis.org/archive";
756     int a = 0;
757     Source so = null;
758     Sink si = null;
759     Sink fwd = null;
760     char source = 'd';
761     char sink = 'd';
762     char task = 0;
763     int n = 0;
764    
765     while ( a<args.length ) {
766     String arg = args[a++];
767     if ( "-h".equals( arg ) )
768     host = args[a++];
769     else if ( "-o".equals( arg ) )
770     port = Integer.parseInt( args[a++] );
771     else if ( "-u".equals( arg ) )
772     user = args[a++];
773     else if ( "-p".equals( arg ) )
774     pass = args[a++];
775     else if ( "-pop".equals( arg ) )
776     source = 'p';
777     else if ( "-url".equals( arg ) ) // arc
778     url = args[a++];
779     else if ( "-fwd".equals( arg ) ) // fwd by smtp
780     fwd = new Smtp( args[a++] );
781     else if ( "-fwdcmd".equals( arg ) ) // fwd by command
782     fwd = new Cmd( args[a++] );
783     else if ( "-dir".equals( arg ) ) {
784     source = 'd';
785     sodir = args[a++];
786     } else if ( "-todir".equals( arg ) ) {
787     sink = 'd';
788     sidir = args[a++];
789     } else if ( "-toarc".equals( arg ) ) {
790     sink = 'a';
791     sidir = args[a++];
792     } else if ( "-move".equals( arg ) )
793     task = 'v';
794     else
795     throw new IllegalArgumentException( arg );
796     }
797    
798     switch ( source ) {
799     case 'p':
800     so = new Pop( host, port, user, pass, 8 );
801     break;
802     default: // 'd'
803     so = new Dir( sodir );
804     }
805     switch ( sink ) {
806     case 'a':
807     si = new Arc( sidir, url, fwd );
808     break;
809     default: // 'd'
810     si = new Dir( sidir );
811     }
812    
813     switch ( task ) {
814     case 'v': // -move
815     n = move( si, so );
816     System.err.println( "moved "+n+" messages from "+so+" to "+si );
817     break;
818     }
819     }
820     } // Mail

  ViewVC Help
Powered by ViewVC 1.1.26