+ public String toString(boolean desc) {
+ return desc && description != null && description.length() > 0 ? (description+" <" + toString() + ">") : toString(); }
+ public static class Malformed extends Message.Malformed { public Malformed(String s) { super(s); } }
+
+ /** in case of flaky DNS */
+ private static HashSet<String> local = new HashSet<String>();
+ public boolean isLocal() {
+ synchronized(local) {
+ if (local.contains(host)) return true;
+ InetAddress[] mx = SMTP.getMailExchangerIPs(host);
+ for(int i=0; i<mx.length; i++) {
+ try { if (NetworkInterface.getByInetAddress(mx[i]) != null) {
+ local.add(host);
+ return true;
+ } } catch (Exception e) { /* DELIBERATE */ }
+ }
+ }
+ Log.warn(this, "returning false for " + this + ".isLocal()");
+ return false;
+ }
+
+ public static Address[] list(String spec) {
+ if (spec == null) return new Address[] { };
+ StringTokenizer st = new StringTokenizer((String)spec, ",");
+ Address[] ret = new Address[st.countTokens()];
+ for(int i=0; i<ret.length; i++) {
+ String s = st.nextToken();
+ ret[i] = Address.parse(s);
+ if (ret[i] == null) Log.warn(Address.class, "Warning: address " + s + " is unparseable");
+ }
+ return ret;
+ }