一JavaMail與SMTP
通常我們使用JavaMail都是通過SMTP服務器來發送郵件比如說我有一個的郵件賬號想給的郵箱發送郵件
用戶A首先將需要發送的郵件通過SMTP協議發送給他所在的郵件服務器domain然後domain判斷收件人所在的域為domain於是domain通過SMTP協議再重新將郵件發送到domain最後用戶B連接到自己的郵件服務器domain接收郵件通常domain會將郵件緩存以便出錯時重新發送如果重試幾次後還是發送失敗可能會給用戶A發送一封郵件以告知郵件發送失敗如果用戶A是一個應用的話很難知道郵件發送成功與否
另外一種做法是用戶(或者我們自己的應用)直接連接對方的SMTP服務器來發送郵件其實就是連接到對方的端口然後按順序發送一些SMTP的命令詳細的SMTP信息大家可以查閱相應資料JavaMail對這些底層的數據傳輸做了很好的包裝
只要用戶A發送的數據格式和前面domain發送的相同對於domain來說沒什麼區別而且在這種方式下如果郵件發送失敗比如收件人地址不存在用戶A會馬上得到郵件發送失敗信息所以在實際的應用中這種方式比較常見但是這種方式需要知道對方的SMTP服務器的地址在Windows下可以在命令行執行nslookup輸入 set type=mx然後輸入需要查找的域名比如就可以查找到它的SMTP服務器地址同樣在Java中可以通過JNDI或者開源的dnsjava查找收件人所在域的SMTP服務器地址這裡給出一個簡單的例子
public class JavaMailSendingHandler implements ILocalEmailSendingHandler {
public void send(String to String from String subject String content String contentType) throws Exception {
Properties props = new Properties();
propsput(mailsmtplocalhost getHost(from));
String server = getSMTPServerByJNDI(getHost(to));
propssetProperty(mailsmtphost server);
Session session = SessiongetInstance(props null);
MimeMessage message = new MimeMessage(session);
messagesetContent(content contentType);
messagesetSender(new InternetAddress(from));
messagesetFrom(new InternetAddress(from));
messagesetRecipient(RecipientTypeTO new InternetAddress(to));
messagesetSubject(subject);
messagesetHeader(ContentType contentType);
messagesetHeader(ContentTransferEncoding bit);
SimpleDateFormat format = new SimpleDateFormat(EEE d MMM yyyy HH:mm:ss Z);
messagesetHeader(Date formatformat(new Date()));
Transportsend(message new Address[] { new InternetAddress(to) });
}
private String getHost(String address) {
return addresssubstringaddressindexOf(@) + );
}
//通過JNDI 查找給定域的郵件服務器
private String getSMTPServerByJNDI(String host) throws Exception {
Properties jndiEnvironmentProperties = new Properties();
jndiEnvironmentPropertiesput(javanamingfactoryinitial comsunjndidnsDnsContextFactory);
DirContext initialDirContext = new InitialDirContext(jndiEnvironmentProperties);
Attributes attributes = initialDirContextgetAttributes(host new String[] {MX});
Attribute attribute = attributesget(MX);
String[] servers = new String[attributesize()];
for (int i = ; i < attributesize(); i++) {
servers[i] = attributeget(i)toString();
}
String server = servers[];
server = serversubstring(serverindexOf( ) + servers[]length() );
return server;
}
}
二反垃圾郵件機制
最簡單的反垃圾郵件機制就是檢查郵件的每個頭信息是否短缺格式是否正確另外比較復雜的一種是SPF(Sender Policy Framework)它主要用來防止偽造的郵件地址還是采用前面的例子說明在用戶直接給domain發送郵件時需要告示郵件發送者地址這樣domain會根據郵件發送者的地址所在的域名查找到該域的有效的郵件服務器地址如果用戶所在的計算機不再查找的結果之中那就說明發件人地址是偽造的從而斷定是垃圾郵件
為了能夠通過收件人郵件服務器的SPF檢查需要向所在域的域控制器添加相應的SPF信息在Windows服務器下可以通過添加TXT記錄來完成
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25788.html