基于JavaMail實(shí)現(xiàn)郵件發(fā)送
Java的學(xué)習(xí)的確不如腳本語(yǔ)言那樣有趣,一是Java知識(shí)體系龐大,知識(shí)點(diǎn)浩如煙海。二是Java作為服務(wù)器端語(yǔ)言,我們學(xué)習(xí)過(guò)程中通常伴隨著各種XX管理系統(tǒng),硬生生把自己變成了一個(gè)CRUDboy。Java難不可怕,可怕的是學(xué)著學(xué)著沒(méi)了動(dòng)力。
今天來(lái)講講JavaMail發(fā)送郵件,我好久沒(méi)有更新文章,是因?yàn)樽罱趯W(xué)習(xí)在寫(xiě)項(xiàng)目,正如上文所說(shuō),把自己變成了一個(gè)CRUD。最近想換換腦子,所以寫(xiě)篇文章給大家分享一下JavaMail,這是一個(gè)不太常用但有用的技術(shù),我們注冊(cè)網(wǎng)站時(shí)激活鏈接時(shí)候也經(jīng)常用,當(dāng)然今天寫(xiě)不到激活,只寫(xiě)一下如何發(fā)送郵件。
首先:
JavaMail API是讀取、撰寫(xiě)、發(fā)送電子信息的可選包。之所以說(shuō)是可選包是因?yàn)槲覀冊(cè)谑褂玫脮r(shí)候還需要導(dǎo)入JavaMail包才能正常使用。 我們可用它來(lái)建立如Eudora、Foxmail、MS Outlook Express一般的郵件用戶代理程序(Mail User Agent,簡(jiǎn)稱MUA)。
正如上面加粗的三個(gè)字的字面意思所言,這是一個(gè)可選包,這代表著我們想用的時(shí)候需要自己下載JAR包導(dǎo)入,這就像買(mǎi)了一桶方便面,里面帶了一個(gè)醋包,你想吃的話就撕開(kāi),不想吃的話扔到一旁就好。
我們首先導(dǎo)JavaMail的JAR包,然而這里有一個(gè)坑,我踩過(guò)了所以我在這里給大家提個(gè)醒,這個(gè)JAR包有一個(gè)完整版還有一個(gè)API版,如果你導(dǎo)入了API版那你在執(zhí)行程序的時(shí)候,假如你沒(méi)有J2EE環(huán)境那么將會(huì)出現(xiàn)兩個(gè)類找不到異常:
java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger
java.lang.NoClassDefFoundError: javax/mail/MessagingException
出現(xiàn)這個(gè)的原因是因?yàn)锳PI版的JAR包并不是完整版,如果你的J2EE環(huán)境完好,那么可以執(zhí)行,但是大部分人連J2EE環(huán)境為何物都不知,大家用的時(shí)候還是老老實(shí)實(shí)的導(dǎo)入完整包吧。大家下載的時(shí)候可以分辨一下,完整版的帶有sun標(biāo)識(shí)。


然后:
JAR包導(dǎo)好之后我們就可以上手寫(xiě)代碼了,這是我只放一個(gè)小demo,大家可以照著這個(gè)玩一玩,有問(wèn)題可以下方留言。
/*
* 1. 得到session
*細(xì)心人可以發(fā)現(xiàn)其實(shí)拿Session就一步,前面一段都是準(zhǔn)備工作。
*/
Properties props = new Properties();
//這里我們?cè)O(shè)置的是要訪問(wèn)的郵箱主機(jī),下面示例是QQ郵箱,如果是163郵箱你就要把這個(gè)qq.com替換為163.com了。
props.setProperty("mail.host", "smtp.qq.com");
props.setProperty("mail.smtp.auth", "true");
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//這里是你的QQ郵箱前綴,也就是去掉@qq.com,后面那個(gè)東西是郵箱的授權(quán)碼,也是String類型。這個(gè)下面細(xì)說(shuō)。
return new PasswordAuthentication("1977256156", "eapjxbauvfctfbed");
}
};
Session session = Session.getInstance(props, auth);
/*
* 2. 創(chuàng)建MimeMessage
*這就相當(dāng)于創(chuàng)建了一封郵件,里面設(shè)置了郵件的種種。
*/
MimeMessage msg = new MimeMessage(session);
//設(shè)置發(fā)件人
msg.setFrom(new InternetAddress("1977256156@qq.com"));
//設(shè)置收件人
msg.setRecipients(MimeMessage.RecipientType.TO, "854359727@qq.com");
// msg.setRecipients(RecipientType.CC, "xxxxxx@sohu.com");//設(shè)置抄送
//msg.setRecipients(RecipientType.BCC, "xxxxxx@sina.com");//設(shè)置暗送
//設(shè)置標(biāo)題
msg.setSubject("這是來(lái)自Coding與作家的測(cè)試郵件");
//設(shè)置正文
msg.setContent("來(lái)一段經(jīng)典的Hello World", "text/html;charset=utf-8");
/*
* 3. 發(fā)送
*/
Transport.send(msg);
上文我們填賬戶密碼的地方,本該填賬戶密碼,現(xiàn)在卻填了一個(gè)賬戶名和一個(gè)授權(quán)碼,那這個(gè)授權(quán)碼又是什么呢?
我們通過(guò)QQ郵箱發(fā)送郵件,本質(zhì)上是代理QQ郵箱,這需要我們打開(kāi)QQ郵箱的一些設(shè)置,就算你用其他郵箱也是同樣的道理。

POP3和SMTP分別對(duì)應(yīng)著郵件接受和郵件發(fā)送的協(xié)議。當(dāng)你打開(kāi)這個(gè)服務(wù)之后就會(huì)出現(xiàn)一個(gè)授權(quán)碼,這個(gè)授權(quán)碼用來(lái)替代密碼。倘若你的郵箱沒(méi)有打開(kāi)這個(gè)服務(wù),那你執(zhí)行程序后將會(huì)拋出一個(gè)535異常:
Exception in thread “main” javax.mail.AuthenticationFailedException: 535 Error: authentication failed
最后:
到這一步,這個(gè)程序應(yīng)該已經(jīng)完成了。我們就可以執(zhí)行這個(gè)方法,當(dāng)QQ郵箱的提示叮當(dāng)作響,我們的程序也會(huì)嘎然而止。屆時(shí),這個(gè)小小的demo就算成功了。好了,大家去動(dòng)手實(shí)踐吧。
注:實(shí)驗(yàn)時(shí)候,要用自己的郵箱和授權(quán)碼,我這個(gè)郵箱的已經(jīng)關(guān)閉了。