total overhaul; were using MIME and MIME.Part now
[org.ibex.mail.git] / src / org / ibex / mail / Address.java
1 package org.ibex.mail;
2 import org.ibex.crypto.*;
3 import org.ibex.js.*;
4 import org.ibex.util.*;
5 import org.ibex.mail.protocol.*;
6 import java.util.*;
7 import java.net.*;
8 import java.io.*;
9
10 // FIXME this should be more forgiving
11 public class Address extends JSReflection {
12     public final String user;
13     public final String host;
14     public final String description;
15     public static Address parse(String s) { try { return new Address(s); } catch (Malformed _) { return null; } }
16     public Address(String user, String host, String description) {this.user=user;this.host=host;this.description=description;}
17     public Address(String s0) throws Address.Malformed {
18         String s = s0.trim();
19         if (s.indexOf('<') == -1) description = "";
20         else {
21             if (s.indexOf('>') == -1) { throw new Malformed("found open-angle-bracket (<) but not close-angle-bracket (>)"); }
22             description = s.substring(0, s.indexOf('<')) + s.substring(s.indexOf('>') + 1);
23             s = s.substring(s.indexOf('<') + 1, s.indexOf('>'));
24         }
25         if (s.indexOf('@') == -1) { throw new Malformed("no @-sign in email address \""+s0+"\""); }
26         user = s.substring(0, s.indexOf('@'));
27         host = s.substring(s.indexOf('@')+1);
28     }
29     public String toString() { return description.equals("") ? (user +"@"+ host) : description+" <" + user +"@"+ host + ">"; }
30     public String coerceToString() { return toString(); }
31     public static class Malformed extends Message.Malformed { public Malformed(String s) { super(s); } }
32
33     public boolean isLocal() {
34         InetAddress[] mx = SMTP.getMailExchangerIPs(host);
35         for(int i=0; i<mx.length; i++) {
36             try { if (NetworkInterface.getByInetAddress(mx[i]) != null) { return true; } }
37             catch (Exception e) { /* DELIBERATE */ }
38         }
39         Log.warn(this, "returning false");
40         return false;
41     }
42
43     public static Address[] list(String spec) {
44         if (spec == null) return new Address[] { };
45         StringTokenizer st = new StringTokenizer((String)spec, ",");
46         Address[] ret = new Address[st.countTokens()];
47         for(int i=0; i<ret.length; i++) {
48             String s = st.nextToken();
49             ret[i] = Address.parse(s);
50             if (ret[i] == null) Log.warn(Address.class, "Warning: address " + s + " is unparseable");
51         }
52         return ret;
53     }
54 }