001 /* 002 * Copyright 2010 the original author or authors. 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, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package com.hs.mail.smtp.message; 017 018 import java.io.Serializable; 019 020 import javax.mail.Address; 021 import javax.mail.internet.InternetAddress; 022 import javax.mail.internet.ParseException; 023 024 import com.hs.mail.smtp.SmtpException; 025 026 /** 027 * 028 * @author Won Chul Doh 029 * @since Jun 1, 2010 030 * 031 */ 032 public class MailAddress implements Serializable, Comparable { 033 034 private static final long serialVersionUID = -3308891400855394336L; 035 036 private String address; 037 private transient boolean strict; 038 private transient String user; 039 private transient String host; 040 041 public MailAddress() { 042 this.address = ""; 043 } 044 045 public MailAddress(Address address) { 046 this.address = ((InternetAddress) address).getAddress(); 047 } 048 049 public MailAddress(String address, boolean strict) throws SmtpException { 050 this.strict = strict; 051 if (strict) { 052 try { 053 this.address = parse(address); 054 } catch (ParseException e) { 055 throw new SmtpException("501 5.1.7 " + e.getMessage()); 056 } 057 } else { 058 this.address = address; 059 } 060 } 061 062 public MailAddress(String address) throws SmtpException { 063 this(address, true); 064 } 065 066 public boolean isStrict() { 067 return strict; 068 } 069 070 public String getMailbox() { 071 return address; 072 } 073 074 protected void setMailbox(String address) { 075 this.address = address; 076 } 077 078 public String getUser() { 079 if (user == null) { 080 int index = address.lastIndexOf('@'); 081 user = (index != -1) ? address.substring(0, index) : address; 082 } 083 return user; 084 } 085 086 public String getHost() { 087 if (host == null) { 088 int index = address.lastIndexOf('@'); 089 if (index != -1) { 090 host = address.substring(index + 1).toLowerCase(); 091 if (host.charAt(0) == '[') 092 host = host.substring(1, host.length() - 1); 093 } 094 } 095 return host; 096 } 097 098 public InternetAddress toInternetAddress() { 099 try { 100 return new InternetAddress(address); 101 } catch (javax.mail.internet.AddressException ae) { 102 // impossible really 103 return null; 104 } 105 } 106 107 /** 108 * Strip source routing, according to RFC-2821 it is an allowed approach to 109 * handle mails containing RFC-821 source-route information. 110 */ 111 private static String stripSourceRoute(String address) { 112 String s = address; 113 int index = address.indexOf(':'); 114 if (index != -1) { 115 s = address.substring(index + 1); 116 } 117 return s; 118 } 119 120 private static String parse(String address) throws ParseException { 121 String s = address; 122 if (!s.startsWith("<") || !s.endsWith(">")) { 123 throw new ParseException("Address did not start and end with < >"); 124 } 125 // Strip < and > 126 s = s.substring(1, s.length() - 1); 127 // Test if mail address has source routing information (RFC-821) and 128 // get rid of it!! 129 s = stripSourceRoute(s); 130 // When the strict flag is set true, InternetAddress checks that the 131 // address is a valid "mailbox" per RFC822. 132 new InternetAddress(s, true); 133 return s; 134 } 135 136 public int compareTo(Object o) { 137 if (o instanceof MailAddress) 138 return address.compareTo(((MailAddress) o).getMailbox()); 139 else if (o instanceof InternetAddress) 140 return address.compareTo(((InternetAddress) o).getAddress()); 141 else if (o instanceof String) 142 return address.compareTo((String) o); 143 else 144 return -1; 145 } 146 147 }