1. 程式人生 > >Java Web(十二) JavaMail發送郵件

Java Web(十二) JavaMail發送郵件

ride throw from 必須 intern tde 服務 authent 賬戶

發送郵件的原理

概敘 

郵件服務器:

  • 要在 Internet 上提供電子郵件功能,必須有專門的電子郵件服務器。例如現在 Internet 很多 提供郵件服務的廠商:sina、sohu、163 等等他們都有自己的郵件服務器。
  • 這些服務器類似於現實生活中的郵局,它主要負責接收用戶投遞過來的郵件,並把郵件投 遞到郵件接收者的電子郵箱中。
  • 郵件服務器,按照提供的服務類型,可以分為發送郵件的服務器和接收郵件的服務器。

電子郵箱:

  • 電子郵箱(E-mail 地址)的獲得需要在郵件服務器上進行申請,確切地說,電子郵箱其實就是用戶在郵件服務器上申請的一個帳戶。用戶在郵件服務器上申請了一個帳號後,郵件服務器就會為這個帳號分配一定的空間,用戶從而可以使用這個帳號以及空間,發送和接收電子郵件。

郵件協議

SMTP 協議-發郵件協議

  • 全稱為 Simple Mail Transfer Protocol(簡單郵件傳輸協議),它定義了郵件客戶端軟件與 SMTP 服務器之間、以及兩臺 SMTP 服務器之間的通訊規則。
  • 端口號:25。

POP3 協議-收郵件協議

  • 全稱為 Post Office Protocol(郵局協議),它定義了郵件客戶端軟件與 POP3 服務器的通訊規則。
  • 端口號:110。

發送郵件流程

  技術分享圖片

JavaMail

JavaMail是提供給開發者處理電子郵件相關的編程接口。它是Sun發布的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。

使用JavaMail需要導入兩個jar包,mail.jar、activation.jar。

使用qq郵箱發送郵件

使用qq郵箱發送郵件必須聯網,否則無效。

package com.kindleheart.store.utils;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class MailTest {

    public static void main(String[] args) throws MessagingException {
        //服務器的設置
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.qq.com");//設置服務器地址
        props.setProperty("mail.smtp.auth", "true");//驗證

        //郵箱帳號密碼
        Authenticator authenticator = new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                //必須使用授權碼,而不是密碼,去qq郵箱申請
                return new PasswordAuthentication("[email protected]","授權碼");
            }
        };

        //1、與服務器建立連接:Session
        Session session = Session.getDefaultInstance(props, authenticator);

        //2、編寫郵件:Message
        Message message = new MimeMessage(session);
        //2.1、發件人
        message.setFrom(new InternetAddress("[email protected]"));
        //2.2、收件人 , to:收件人、cc :抄送、bcc:暗送(密送)。
        message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
        //2.3、主題
        message.setSubject("測試");
        //2.4、正文
        String str = "哈哈,我發送了";
        message.setContent(str, "text/html;charset=UTF-8");

        //3、發送
        Transport.send(message);
    }

}

使用本地郵箱服務器和客戶端發送郵件

在沒有聯網的情況下可以使用該方法在自己的電腦上發送和接收郵件,可以用於測試項目。

搭載本地環境

  1. 安裝郵件服務器(易郵郵件服務器)

    雙擊安裝包,進行配置

    • 設置域名

      技術分享圖片

    • 新建賬戶,新建aaa和bbb兩個賬戶,用於發送和接收郵件

      技術分享圖片

  2. 安裝foxmail郵箱

    雙擊安裝包,進行配置

    • 我們剛剛在MailServer中創建了aaa,bbb兩個賬戶,現在在foxmail郵箱中登入這兩個賬戶

      技術分享圖片

    • 指定本地的郵件服務器

    技術分享圖片

使用JavaMail在本地發送接受郵件

package com.kindleheart.store.utils;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class MailTest {

    public static void main(String[] args) throws MessagingException {
        //服務器的設置
        Properties props = new Properties();
        props.setProperty("mail.host", "localhost");//設置服務器地址
        props.setProperty("mail.smtp.auth", "true");//權限驗證

        //郵箱帳號密碼
        Authenticator authenticator = new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("[email protected]","123");
            }
        };

        //1、與服務器建立連接:Session
        Session session = Session.getDefaultInstance(props, authenticator);

        //2、編寫郵件:Message
        Message message = new MimeMessage(session);
        //2.1、發件人
        message.setFrom(new InternetAddress("[email protected]"));
        //2.2、收件人 , to:收件人、cc :抄送、bcc:暗送(密送)。
        message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
        //2.3、主題
        message.setSubject("測試");
        //2.4、正文
        String str = "哈哈,我發送了";
        message.setContent(str, "text/html;charset=UTF-8");

        //3、發送
        Transport.send(message);
    }

}

在foxmail郵箱中查看是否發送成功

技術分享圖片

Java Web(十二) JavaMail發送郵件