淺談JavaEmail:發(fā)送第一封郵件


前言

沒(méi)錯(cuò),有需求才有動(dòng)力,這一次老大讓我自己研究一下如何使用Java代碼來(lái)發(fā)送一封郵件.正愁沒(méi)事可搞,借著今天是七夕,就好好搞搞這個(gè)需求,前后總共用了半天時(shí)間搞定了,所以在這淺談一下其填坑過(guò)程.


郵件收發(fā)協(xié)議

說(shuō)到郵件收發(fā),就不得不說(shuō)下郵件收發(fā)協(xié)議,其分為SMTP虏等、POP3伏伯、IMAP三種協(xié)議,因?yàn)檫@里我們不涉及收取郵箱,所以我們只需要使用SMTP即可.下面我們就對(duì)其三個(gè)協(xié)議的概念做一個(gè)總結(jié).

  • SMTP(發(fā)送郵件協(xié)議沦偎,默認(rèn)端口25)

  • POP3(收取郵件協(xié)議恢口,默認(rèn)端口110稚铣,不能在線(xiàn)操作)

  • IMAP(收取郵件協(xié)議,默認(rèn)端口143父款,運(yùn)行在TCP/IP協(xié)議之上尾膊,與POP3的主要區(qū)別:可以在線(xiàn)操作,用戶(hù)可以不用把所有的郵件全部下載络凿,可以通過(guò)客戶(hù)端直接對(duì)服務(wù)器上的郵件進(jìn)行操作)


JavaEmail發(fā)送郵件流程

JavaEmail發(fā)送郵件的流程主要是四步,其中第三步可有可無(wú).分別是連接服務(wù)器,編輯郵件,添加附件,發(fā)送郵件.如下圖所示.



JavaEmail開(kāi)發(fā)配置

由于我創(chuàng)建的是一個(gè)Maven項(xiàng)目,所以我在pom.xml中添加了如下的Maven依賴(lài).

  <properties>
    <javamail.version>1.4.1</javamail.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>${javamail.version}</version>
    </dependency>   
  </dependencies>

但是好像聽(tīng)說(shuō)在JDK6.0 以后開(kāi)發(fā)骡送,不需要導(dǎo)入 mail.jar了,因?yàn)樵诠俜降腏DK中已經(jīng)包含了這個(gè)jar包,但是我沒(méi)有找到,所以我建立了依賴(lài).假設(shè)兩者都存在的話(huà),會(huì)出現(xiàn)如下錯(cuò)誤.

java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream 

解決方案就很簡(jiǎn)單了,只要?jiǎng)h除 javaee.jar 里面的 mail 目錄和 activation 目錄即可(如果想一勞永逸昂羡,去 javaee.jar 所在的硬盤(pán)位置把這兩個(gè)目錄刪掉)。


發(fā)送一份純本文的郵件

不管是發(fā)送什么郵件,這里我建議大家使用企業(yè)郵箱,因?yàn)槠胀ㄠ]箱好像是有發(fā)送次數(shù)限制的.這里我使用的是QQ企業(yè)郵箱,賬號(hào)都是公司提供的.這里我們需要去郵箱的設(shè)置頁(yè)面查看兩個(gè)地方.一個(gè)是我們的收發(fā)服務(wù)器地址以及相關(guān)信息,二是查看我們是否已經(jīng)開(kāi)啟對(duì)應(yīng)的收發(fā)服務(wù)了.如下圖所示.

?? ????從上圖看出,我們知道,騰訊企業(yè)郵箱是發(fā)送地址為smtp.exmail.qq.com,使用SSL,端口為465,這里有個(gè)坑,那就是如果不使用SSL,那么端口為25,和新浪,網(wǎng)易郵箱端口是一致.



查看完我們想要的之后我們就需要進(jìn)行連接服務(wù)器.首先我們需要設(shè)置服務(wù)器參數(shù).這里我們使用Properties來(lái)存儲(chǔ)服務(wù)器連接信息.如下所示.

    private static String smtpHost = "smtp.exmail.qq.com";
    private static String port = "25";
    private static Properties props = System.getProperties();

    public static void main( String[] args ) throws AddressException, MessagingException, UnsupportedEncodingException{
        props.put("mail.smtp.host", smtpHost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", port); 
        props.setProperty("mail.transport.protocol", "smtp");
}

然后,我們通過(guò)上面服務(wù)器信息來(lái)連接服務(wù)器.

        Session session = Session.getInstance(props);// 與郵件服務(wù)器連接會(huì)話(huà)
        session.setDebug(true);//打開(kāi)Debug模式

連接完成之后,我們就需要編輯我們的郵件了.這里需要MimeMessage這個(gè)類(lèi)來(lái)實(shí)現(xiàn).代碼如下所示.

        MimeMessage message = new MimeMessage(session);// 代表一封郵件
        message.setFrom(new InternetAddress("發(fā)送郵件的地址"));
        message.setRecipients(Message.RecipientType.TO,"接受郵件的地址");
        message.setSubject("騷棟發(fā)給你一份驚喜");
        message.setText("郵件正文內(nèi)容");

編寫(xiě)完地址之后,我們就需要發(fā)送這封郵件了,這里我們需要使用Transport這個(gè)類(lèi)來(lái)實(shí)現(xiàn)郵件發(fā)送的功能.當(dāng)然了,我們需要在發(fā)送過(guò)程中驗(yàn)證我們的發(fā)送賬號(hào)以及密碼.如下所示.

        Transport transport = session.getTransport();
        // 發(fā)郵件前進(jìn)行身份校驗(yàn)
        transport.connect("發(fā)送郵件賬號(hào)", "賬號(hào)密碼");
        transport.sendMessage(message, message.getAllRecipients());

?? ????注意:郵件賬號(hào)和郵件發(fā)送地址可能不同吆~

這樣,我們就成功發(fā)送了一個(gè)郵件.效果圖如下所示.(完整Demo在文章最底部)


發(fā)送一份帶有格式的郵件(html形式)

假定一個(gè)純文本已經(jīng)不能滿(mǎn)足我們的需求了,我們需要搞成有格式的郵件,這時(shí)候我們?cè)撛趺崔k呢?這時(shí)候我們就需要使用MimeMultipartMimeBodyPart這兩個(gè)類(lèi)來(lái)進(jìn)行實(shí)現(xiàn)了.

前面的連接服務(wù)器,發(fā)送郵件不需要發(fā)生改變,類(lèi)似于純文本的即可,改變的是編輯郵件內(nèi)容.代碼如下所示.

        MimeBodyPart content = new MimeBodyPart();
        content.setContent("<h1>附件是首好聽(tīng)的歌曲摔踱!</h1>", "text/html;charset=utf-8");
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(content);
        mimeMultipart.setSubType("mixed");
        
        message.setContent(mimeMultipart);//添加主題內(nèi)容

正常執(zhí)行之后,收件箱得到如下的郵件,我們發(fā)現(xiàn)附件是首好聽(tīng)的歌曲虐先!確實(shí)是h1標(biāo)簽的形式.


發(fā)送一份帶有附件的郵件

上面都說(shuō)了有附件了,那么怎么能不搞搞如何發(fā)送一份有附件的郵件呢?和上面添加格式一樣,我們需要使用MimeMultipartMimeBodyPart這兩個(gè)類(lèi)來(lái)進(jìn)行實(shí)現(xiàn)了.

具體部分代碼如下所示.

        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setDataHandler(new DataHandler
                (new FileDataSource("附件的本地地址"))
                );
        attachment.setFileName(MimeUtility.encodeText("音樂(lè).mp3")); 

        MimeBodyPart content = new MimeBodyPart();
        content.setContent("<h1>附件是首好聽(tīng)的歌曲!</h1>", "text/html;charset=utf-8");
        
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(attachment);
        mimeMultipart.addBodyPart(content);
        mimeMultipart.setSubType("mixed");
        
        message.setContent(mimeMultipart);

這時(shí)候我們?cè)诎l(fā)送郵件的話(huà),對(duì)應(yīng)的郵箱中就會(huì)出現(xiàn)我們的郵件了.如下圖所示.


文章整體代碼如下所示

package com.infosports.emaildemo;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;


public class App {
    
    private static String smtpHost = "smtp.exmail.qq.com";
    private static String formPerson = "郵件發(fā)送地址";
    private static String toPerson = "郵件接受賬號(hào)";
    private static String port = "25";
    private static Properties props = System.getProperties();
    
    
    public static void main( String[] args ) throws AddressException, MessagingException, UnsupportedEncodingException{
        props.put("mail.smtp.host", smtpHost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", port); 
        props.setProperty("mail.transport.protocol", "smtp");
        
        Session session = Session.getInstance(props);// 與郵件服務(wù)器連接會(huì)話(huà)
        session.setDebug(true);

        MimeMessage message = new MimeMessage(session);// 代表一封郵件
        message.setFrom(new InternetAddress(formPerson));
        message.setRecipients(Message.RecipientType.TO, toPerson);
        message.setSubject("騷棟發(fā)給你一份驚喜");
//        message.setText("郵件正文內(nèi)容");
        
        //附件部分
        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setDataHandler(new DataHandler
                (new FileDataSource("附件路徑"))
                );
        attachment.setFileName(MimeUtility.encodeText("音樂(lè).mp3")); 

        MimeBodyPart content = new MimeBodyPart();
        content.setContent("<h1>附件是首好聽(tīng)的歌曲派敷!</h1>", "text/html;charset=utf-8");
        
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(attachment);
        mimeMultipart.addBodyPart(content);
        mimeMultipart.setSubType("mixed");
        
        message.setContent(mimeMultipart);

        Transport transport = session.getTransport();
        // 發(fā)郵件前進(jìn)行身份校驗(yàn)
        transport.connect(formPerson, "發(fā)送賬號(hào)密碼");
        transport.sendMessage(message, message.getAllRecipients());
        
    }
}


總結(jié)

使用JavaEmail發(fā)送郵件就談到這里了,有什么不足歡迎來(lái)批斗騷棟,這里感謝大家了.希望大家喜歡這篇文章.話(huà)不多說(shuō)了.今天是七夕,祝大家七夕快樂(lè)~



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赴穗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膀息,更是在濱河造成了極大的恐慌般眉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潜支,死亡現(xiàn)場(chǎng)離奇詭異甸赃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冗酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)埠对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人裁替,你說(shuō)我怎么就攤上這事项玛。” “怎么了弱判?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵襟沮,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昌腰,道長(zhǎng)开伏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任遭商,我火速辦了婚禮固灵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劫流。我一直安慰自己巫玻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布祠汇。 她就那樣靜靜地躺著仍秤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座哩。 梳的紋絲不亂的頭發(fā)上徒扶,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音根穷,去河邊找鬼姜骡。 笑死导坟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的圈澈。 我是一名探鬼主播惫周,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼康栈!你這毒婦竟也來(lái)了递递?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啥么,失蹤者是張志新(化名)和其女友劉穎登舞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悬荣,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菠秒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氯迂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片践叠。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚼蚀,靈堂內(nèi)的尸體忽然破棺而出禁灼,到底是詐尸還是另有隱情,我是刑警寧澤轿曙,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布弄捕,位于F島的核電站,受9級(jí)特大地震影響拳芙,放射性物質(zhì)發(fā)生泄漏察藐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一舟扎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悴务,春花似錦睹限、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至别洪,卻和暖如春叨恨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挖垛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工痒钝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秉颗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓送矩,卻偏偏與公主長(zhǎng)得像蚕甥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栋荸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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

  • 從古代的八百里加急菇怀,到現(xiàn)在的電子郵件,郵件的發(fā)展見(jiàn)證了上下五千年的發(fā)展史晌块,這些當(dāng)然是廢話(huà)爱沟,只是要說(shuō)說(shuō)郵件的重要性。...
    大牧莫邪閱讀 1,557評(píng)論 0 13
  • 一、郵件開(kāi)發(fā)涉及到的一些基本概念 郵件服務(wù)器和電子郵箱 郵件傳輸協(xié)議 電子郵件的發(fā)送和接收過(guò)程 1.1郵件服務(wù)器和...
    yjaal閱讀 1,473評(píng)論 0 7
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理靠汁,服務(wù)發(fā)現(xiàn)蜂大,斷路器,智...
    卡卡羅2017閱讀 134,696評(píng)論 18 139
  • 簡(jiǎn)單郵件傳輸協(xié)議(SMTP)是一種協(xié)議蝶怔,用于在郵件服務(wù)器之間發(fā)送電子郵件和路由電子郵件奶浦。 Python提供smtp...
    易百教程閱讀 43,814評(píng)論 4 62
  • 1、背景 為了方便獲取和發(fā)送郵件踢星,需要有一個(gè)定時(shí)服務(wù)來(lái)對(duì)人員列表的郵件內(nèi)容進(jìn)行收取澳叉,以及發(fā)送存儲(chǔ)在數(shù)據(jù)庫(kù)列表里面的...
    伍華聰_開(kāi)發(fā)框架閱讀 1,528評(píng)論 0 50