1. 程式人生 > >使用 javamail 做郵箱驗證功能

使用 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("你的郵箱")) 識別傳送者,

使用 setRecipient() 方法識別接收者。這個方法除了address引數之外,還需要一個Message.RecipientType,Message.RecipientType有幾個預先定義好的型別

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();
		}
	}