基于JavaMail實(shí)現(xiàn)郵件發(fā)送

基于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í)。

這個(gè)是閹割版

這個(gè)是SUN的完整版
這個(gè)是SUN的完整版

然后:

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è)置,就算你用其他郵箱也是同樣的道理。


郵箱設(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)閉了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容