淺談JavaEmail:發送第一封郵件


前言

沒錯,有需求才有動力,這一次老大讓我自己研究一下如何使用Java代碼來發送一封郵件.正愁沒事可搞,借著今天是七夕,就好好搞搞這個需求,前后總共用了半天時間搞定了,所以在這淺談一下其填坑過程.


郵件收發協議

說到郵件收發,就不得不說下郵件收發協議,其分為SMTPPOP3IMAP三種協議,因為這里我們不涉及收取郵箱,所以我們只需要使用SMTP即可.下面我們就對其三個協議的概念做一個總結.

  • SMTP(發送郵件協議,默認端口25)

  • POP3(收取郵件協議,默認端口110,不能在線操作)

  • IMAP(收取郵件協議,默認端口143,運行在TCP/IP協議之上,與POP3的主要區別:可以在線操作,用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作)


JavaEmail發送郵件流程

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



JavaEmail開發配置

由于我創建的是一個Maven項目,所以我在pom.xml中添加了如下的Maven依賴.

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

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

但是好像聽說在JDK6.0 以后開發,不需要導入 mail.jar了,因為在官方的JDK中已經包含了這個jar包,但是我沒有找到,所以我建立了依賴.假設兩者都存在的話,會出現如下錯誤.

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

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


發送一份純本文的郵件

不管是發送什么郵件,這里我建議大家使用企業郵箱,因為普通郵箱好像是有發送次數限制的.這里我使用的是QQ企業郵箱,賬號都是公司提供的.這里我們需要去郵箱的設置頁面查看兩個地方.一個是我們的收發服務器地址以及相關信息,二是查看我們是否已經開啟對應的收發服務了.如下圖所示.

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



查看完我們想要的之后我們就需要進行連接服務器.首先我們需要設置服務器參數.這里我們使用Properties來存儲服務器連接信息.如下所示.

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

然后,我們通過上面服務器信息來連接服務器.

        Session session = Session.getInstance(props);// 與郵件服務器連接會話
        session.setDebug(true);//打開Debug模式

連接完成之后,我們就需要編輯我們的郵件了.這里需要MimeMessage這個類來實現.代碼如下所示.

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

編寫完地址之后,我們就需要發送這封郵件了,這里我們需要使用Transport這個類來實現郵件發送的功能.當然了,我們需要在發送過程中驗證我們的發送賬號以及密碼.如下所示.

        Transport transport = session.getTransport();
        // 發郵件前進行身份校驗
        transport.connect("發送郵件賬號", "賬號密碼");
        transport.sendMessage(message, message.getAllRecipients());

?? ????注意:郵件賬號和郵件發送地址可能不同吆~

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


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

假定一個純文本已經不能滿足我們的需求了,我們需要搞成有格式的郵件,這時候我們該怎么辦呢?這時候我們就需要使用MimeMultipartMimeBodyPart這兩個類來進行實現了.

前面的連接服務器,發送郵件不需要發生改變,類似于純文本的即可,改變的是編輯郵件內容.代碼如下所示.

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

正常執行之后,收件箱得到如下的郵件,我們發現附件是首好聽的歌曲!確實是h1標簽的形式.


發送一份帶有附件的郵件

上面都說了有附件了,那么怎么能不搞搞如何發送一份有附件的郵件呢?和上面添加格式一樣,我們需要使用MimeMultipartMimeBodyPart這兩個類來進行實現了.

具體部分代碼如下所示.

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

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

這時候我們在發送郵件的話,對應的郵箱中就會出現我們的郵件了.如下圖所示.


文章整體代碼如下所示

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 = "郵件發送地址";
    private static String toPerson = "郵件接受賬號";
    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);// 與郵件服務器連接會話
        session.setDebug(true);

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

        MimeBodyPart content = new MimeBodyPart();
        content.setContent("<h1>附件是首好聽的歌曲!</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();
        // 發郵件前進行身份校驗
        transport.connect(formPerson, "發送賬號密碼");
        transport.sendMessage(message, message.getAllRecipients());
        
    }
}


總結

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



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • 從古代的八百里加急,到現在的電子郵件,郵件的發展見證了上下五千年的發展史,這些當然是廢話,只是要說說郵件的重要性。...
    大牧莫邪閱讀 1,573評論 0 13
  • 一、郵件開發涉及到的一些基本概念 郵件服務器和電子郵箱 郵件傳輸協議 電子郵件的發送和接收過程 1.1郵件服務器和...
    yjaal閱讀 1,494評論 0 7
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 簡單郵件傳輸協議(SMTP)是一種協議,用于在郵件服務器之間發送電子郵件和路由電子郵件。 Python提供smtp...
    易百教程閱讀 43,919評論 4 62
  • 1、背景 為了方便獲取和發送郵件,需要有一個定時服務來對人員列表的郵件內容進行收取,以及發送存儲在數據庫列表里面的...
    伍華聰_開發框架閱讀 1,532評論 0 50