基于SMTP協(xié)議的郵件發(fā)送功能JavaEE實現(xiàn)

本博客介紹基于SSM框架(Spring4.0+SpringMVC+Mybatis)組合的Javamail應(yīng)用,郵箱的話基于騰訊的QQ郵箱呵俏,其實也是Foxmail郵箱

先要了解一下SMTP協(xié)議和SSL加密
SMTP:稱為簡單郵件傳輸協(xié)議(Simple Mail Transfer Protocal)铆惑,目標是向用戶提供高效范嘱、可靠的郵件傳輸。SMTP是一種請求響應(yīng)的協(xié)議员魏,也就是客戶機向遠程服務(wù)器發(fā)送請求丑蛤,服務(wù)器響應(yīng),監(jiān)聽端口是25撕阎,所以其工作模式有兩種:發(fā)送SMTP受裹,接收SMTP

SSL加密:用來保障瀏覽器和網(wǎng)站服務(wù)器的安全性,其原理用譯文解釋就是:
當你的瀏覽器向服務(wù)器請求一個安全的網(wǎng)頁(通常是 https://)

服務(wù)器就把它的證書和公匙發(fā)回來

瀏覽器檢查證書是不是由可以信賴的機構(gòu)頒發(fā)的虏束,確認證書有效和此證書是此網(wǎng)站的棉饶。

使用公鑰加密了一個隨機對稱密鑰,包括加密的URL一起發(fā)送到服務(wù)器

服務(wù)器用自己的私匙解密了你發(fā)送的鑰匙镇匀。然后用這把對稱加密的鑰匙給你請求的URL鏈接解密照藻。

服務(wù)器用你發(fā)的對稱鑰匙給你請求的網(wǎng)頁加密。你也有相同的鑰匙就可以解密發(fā)回來的網(wǎng)頁了

然后介紹怎么實現(xiàn)javamail發(fā)送郵件汗侵,先要下載javamail的jar:http://download.csdn.net/detail/u014427391/9721520

去充當服務(wù)器的QQ郵箱開啟SMTP服務(wù):


這里寫圖片描述

寫個發(fā)送郵件的業(yè)務(wù)類:

package com.appms.email;

import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.sun.mail.util.MailSSLSocketFactory;

public class JavaEmailSender {
    

    public static void sendEmail(String toEmailAddress,String emailTitle,String emailContent)throws Exception{
        Properties props = new Properties();

        // 開啟debug調(diào)試
        props.setProperty("mail.debug", "true");
        // 發(fā)送服務(wù)器需要身份驗證
        props.setProperty("mail.smtp.auth", "true");
        // 設(shè)置郵件服務(wù)器主機名
        props.setProperty("mail.host", "smtp.qq.com");
        // 發(fā)送郵件協(xié)議名稱
        props.setProperty("mail.transport.protocol", "smtp");

        /**SSL認證幸缕,注意騰訊郵箱是基于SSL加密的,所有需要開啟才可以使用**/
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);

        //創(chuàng)建會話
        Session session = Session.getInstance(props);

        //發(fā)送的消息晰韵,基于觀察者模式進行設(shè)計的
        Message msg = new MimeMessage(session);
        msg.setSubject(emailTitle);
        //使用StringBuilder冀值,因為StringBuilder加載速度會比String快,而且線程安全性也不錯
        StringBuilder builder = new StringBuilder();
        builder.append("\n"+emailContent);
        builder.append("\n時間 " + new Date());
        msg.setText(builder.toString());
        msg.setFrom(new InternetAddress("你的QQ郵箱"));

        Transport transport = session.getTransport();
        transport.connect("smtp.qq.com", "你的QQ郵箱", "你開啟SMTP服務(wù)申請的獨立密碼");
        //發(fā)送消息
        transport.sendMessage(msg, new Address[] { new InternetAddress(toEmailAddress) });
        transport.close();
    }
}

然后寫個SpringMVC框架的Controller類:


    /**
     * 跳轉(zhuǎn)到發(fā)送郵件頁面
     * @return
     * @throws Exception
     */
    @RequestMapping("/goSendEmail")
    public ModelAndView goSendEmail(HttpServletRequest request)throws Exception{
        ModelAndView mv = this.getModelAndView();
        String email = request.getParameter("email");
        if(email!=null&&!"".equals(email)){
            email = email.trim();
            mv.setViewName("member/send_email");
            mv.addObject("email", email);
        }
        return mv;
    }
    
    /**
     * 發(fā)送郵件
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/sendEmail",produces="application/json;charset=UTF-8")
    @ResponseBody
    public Object sendEmail(HttpServletRequest request)throws Exception{
        Map<String,String> map = new HashMap<String,String>();
        String msg = "ok";      //發(fā)送狀態(tài)
        String toEMAIL = request.getParameter("EMAIL");                 //對方郵箱
        String TITLE = request.getParameter("TITLE");                   //標題
        String CONTENT = request.getParameter("CONTENT");               //內(nèi)容
        JavaEmailSender.sendEmail(toEMAIL, TITLE, CONTENT);
        map.put("result", msg);
        return map;
    }

這里用了Jquery TIP插件進行驗證提示宫屠,所以需要引入相應(yīng)的Jquery文件

<script type="text/javascript" src="source/js/jquery-1.7.2.js"></script>
    <!--提示框-->
    <script type="text/javascript" src="source/js/jquery.tips.js"></script>

Jquery表單驗證和Ajax異步請求:

<!-- 發(fā)送郵件 -->
    <script type="text/javascript">
//發(fā)送
function sendEm(){
    
    if($("#TYPE").val()=="1"){
        $("#CONTENT").val(getContentTxt());
    }else{
        $("#CONTENT").val(getContent());
    }
    if($("#EMAIL").val()==""){
        $("#EMAIL").tips({
            side:3,
            msg:'請輸入郵箱',
            bg:'#AE81FF',
            time:2
        });
        $("#EMAIL").focus();
        return false;
    }
    if($("#TITLE").val()==""){
        $("#TITLE").tips({
            side:3,
            msg:'請輸入標題',
            bg:'#AE81FF',
            time:2
        });
        $("#TITLE").focus();
        return false;
    }
    if($("#CONTENT").val()==""){
        
        $("#nr").tips({
            side:1,
            msg:'請輸入內(nèi)容',
            bg:'#AE81FF',
            time:3
        });
        return false;
    }
    
    var EMAIL = $("#EMAIL").val();
    var TYPE  = $("#TYPE").val();
    var TITLE = $("#TITLE").val();
    var CONTENT = $("#CONTENT").val();

    $("#zhongxin").hide();
    $("#zhongxin2").show();
    
    $.ajax({
        type: "POST",
        url: 'retroaction/sendEmail.do?tm='+new Date().getTime(),
        data: {EMAIL:EMAIL,TITLE:TITLE,CONTENT:CONTENT},
        dataType:'json',
        //beforeSend: validateData,
        cache: false,
        success: function(data){
            if("ok" == data.result){
                $("#msg").tips({
                        side:3,
                        msg:'發(fā)送成功列疗!',
                        bg:'#68B500',
                        time:5
                      });
                setTimeout("showdiv()",1000);   
            }else{
                $("#msg").tips({
                        side:3,
                        msg:'發(fā)送失敗!',
                        bg:'#68B500',
                        time:5
                      });
            }
            
        }
    });
    
}

</script>

JSP頁面的調(diào)用:

<!-- 編輯郵箱  -->
        <div>
        <table style="width:98%;" >
            <tr>
                <td style="margin-top:0px;">
                     <div style="float: left;" style="width:81%"><textarea name="EMAIL" id="EMAIL" rows="1" cols="50" style="width:600px;height:20px;" placeholder="請選輸入對方郵箱,多個請用(;)分號隔開" title="請選輸入對方郵箱,多個請用(;)分號隔開">${email}</textarea></div>
                     <div style="float: right;" style="width:19%"><a class='btn btn-mini btn-info' title="編輯郵箱" onclick="dialog_open();">編輯郵箱</i></a></div>
                </td>
            </tr>
            <tr>
                <td>
                     <input type="text" name="TITLE" id="TITLE" value="" placeholder="請選輸入郵件標題" style="width:98%"/>
                </td>
            </tr>
            <tr>
                <td id="nr">
                     <script id="editor" type="text/plain" style="width:650px;height:259px;"></script>
                </td>
            </tr>
            <tr>
                <td style="text-align: center;">
                    <a class="btn btn-mini btn-primary" onclick="sendEm();">發(fā)送</a>
                    <a class="btn btn-mini btn-danger" onclick="top.Dialog.close();">取消</a>
                </td>
            </tr>
        </table>
        </div>
        <div id="zhongxin2" class="center" style="display:none"><br/>![](assets/images/jzx.gif)<br/><h4 class="lighter block green" id='msg'>正在發(fā)送...</h4></div>     
這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浪蹂,隨后出現(xiàn)的幾起案子抵栈,更是在濱河造成了極大的恐慌告材,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古劲,死亡現(xiàn)場離奇詭異斥赋,居然都是意外死亡,警方通過查閱死者的電腦和手機产艾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門疤剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闷堡,你說我怎么就攤上這事隘膘。” “怎么了杠览?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵弯菊,是天一觀的道長。 經(jīng)常有香客問我踱阿,道長管钳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任软舌,我火速辦了婚禮才漆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佛点。我一直安慰自己栽烂,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布恋脚。 她就那樣靜靜地躺著,像睡著了一般焰手。 火紅的嫁衣襯著肌膚如雪糟描。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天书妻,我揣著相機與錄音船响,去河邊找鬼。 笑死躲履,一個胖子當著我的面吹牛见间,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播工猜,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼米诉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篷帅?” 一聲冷哼從身側(cè)響起史侣,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤拴泌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惊橱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚪腐,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡履磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年俭嘁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秕重。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡正林,死狀恐怖泡一,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卓囚,我是刑警寧澤瘾杭,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站哪亿,受9級特大地震影響粥烁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝇棉,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一讨阻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篡殷,春花似錦钝吮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劲弦,卻和暖如春耳标,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑跪。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工次坡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人画畅。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓砸琅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轴踱。 傳聞我的和親對象是個殘疾皇子症脂,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容