使用 javamail 做郵箱驗證功能
在自己最近做的一個小專案中使用了註冊時郵箱驗證啟用的功能,第一次接觸到了 javaMail,以前只是知道有這個東西,卻從來沒有用過,這次正好有機會,便去大致的看了一些 demo,完成了自己這個郵箱驗證啟用的功能,現在只是簡單會用,以後還是要深入學習,先在這兒記錄一下 javaMail 簡單的使用。
javaMail 是 sun 公司提供的實現郵件傳送和接收功能的一套標準開發類庫,支援常用的郵件協議,如 smtp、pop3、imap,使用 javamail 開發郵件程式無需考慮底層Socket通訊的細節,並且支援建立各種複雜 MIME 格式的郵件。
首先需要去下載 javaMail 相關的 jar ,我使用的是 javamail-1.4.7 這個,因為我只用到了簡單的發郵件的功能,所以只需要將 mail.jar 這個 jar 加到classpath 下即可。
先簡單來認識一下 javaMail 的一些常用類:
Session 定義了一個基本的郵件會話,任何工作都是基於這個Session的。Session 物件需要一個 java.util.Properties 物件來得到類似
郵件伺服器,使用者名稱,密碼這樣的資訊。Session 的建構函式是私有的,可以通過 getDefaultInstance() 方法來取得一個單一的可以被共享的預設session。
一旦建立了 Session 物件,接著就要使用 Message 來發送郵件。
Message 是一個抽象類,在大部分應用中我們可以使用它的子類javax.mail.internet.MimeMessage
。如:
MimeMessage message = new MimeMessage(session);
message.setContent("Email Content. "text/plain"); //設定郵件內容
message.setSubject(" Subject "); //設定主題
這裡常用 Session 物件作為建構函式的引數。
Address 當建立了
Session 以及 Message,並且已經為message 填充了內容,那麼接下來要做的就是給你的郵件新增一個地址(Address),我們常用的是它的子類 javax.mail.internet.InternetAddress,需要使用
Message 的msg.setFrom(new InternetAddress("你的郵箱")) 識別傳送者,
Message.RecipientType.TO //收件人
Message.RecipientType.CC //抄送
Message.RecipientType.BCC //暗送
如果需要多個收件地址,可以使用 InternetAddress[] addrs = {} 構造多個收件地址。
Authenticator 通過Authenticator設定使用者名稱、密碼,我們需要實現這個抽象類,實現getPasswordAuthentication()方法,並返回一個PasswordAuthentication例項,然後在 Session 建立時註冊這個Authenticator。
Transport 傳送訊息的最後一步是使用 Transport,呼叫它的靜態方法
send 來發送郵件,Transport.send(msg);
以下是主要的完整程式碼:
public class SendMailUtil {
public static final String HOST = "smtp.163.com";
public static final String PROTOCOL = "smtp";
public static final int PORT = 25;
public static final String SENDER = "***@163.com";//
public static final String SENDERPWD = "******";
/**
* 獲取用於傳送郵件的Session
* @return
*/
public static Session getSession() {
Properties props = new Properties();
props.put("mail.smtp.host", HOST);//設定伺服器地址
props.put("mail.store.protocol" , PROTOCOL);//設定協議
props.put("mail.smtp.port", PORT);//設定埠
props.put("mail.smtp.auth" , true);
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(SENDER, SENDERPWD);
}
};
Session session = Session.getDefaultInstance(props,authenticator);
return session;
}
/**
* 傳送郵件
* @param receiver
* @param content
*/
public static void send(String receiver, String content) {
Session session = getSession();
try {
System.out.println("-------開始傳送-------");
Message msg = new MimeMessage(session);
//設定message屬性
msg.setFrom(new InternetAddress(SENDER));
InternetAddress[] addrs = {new InternetAddress(receiver)};
msg.setRecipients(Message.RecipientType.TO, addrs);
msg.setSubject("yechblog-帳號啟用");
msg.setSentDate(new Date());
msg.setContent(content,"text/html;charset=utf-8");
//開始傳送
Transport.send(msg);
System.out.println("-------傳送完成-------");
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}