javaMail發送郵件時出現錯誤怎麼辦(樂字節架構,了字節大數據)

Java Mail 發送郵件

詳細Spring如何進行郵件發送

![]()

本文由樂字節Java架構課程獨家贊助播出

![]()

發送普通文本的郵件

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

/**
 * 發送普通文本的郵件
 */
public class MailTest01 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器需要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");
        // 某些郵箱服務器要求 SMTP 連接需要使用 SSL 安全認證
        // prop.setProperty("mail.smtp.port", "465");
        // prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        // prop.setProperty("mail.smtp.socketFactory.fallback", "false");
        // prop.setProperty("mail.smtp.socketFactory.port", "465");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 創建session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就可以查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 通過session得到transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的即可,密碼是指授權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 創建郵件
        // 發送普通文本的郵件
        Message message = createSimpleTxtMail(session);

        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * 普通文本郵件
     *      創建一封只包含文本的郵件
     * @param session
     * @return
     */
    public static MimeMessage createSimpleTxtMail(Session session) throws MessagingException {
        // 創建郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (現在發件人和收件人是一樣的,那就是自己給自己發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));

        // 發送給多個收件人
        // message.setRecipients(Message.RecipientType.TO, new InternetAddress[] {});
        // Cc: 抄送(可選)
        // message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(""));
        // Bcc: 密送(可選)
        // message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress(""));

        // 郵件的主題
        message.setSubject("測試文本郵件");
        // 設置發送日期
        message.setSentDate(new Date());
        // 郵件的文本內容 (setText():純文本內容)
        message.setText("你好,這是一封測試郵件!");

        // 返回創建好的郵件對象
        return message;
    }
}

效果如下:

![]()

發送HTML內容的郵件

package com.xxxx.mail;

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.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * 發送HTML內容的郵件
 */
public class MailTest02 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器需要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 創建session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就可以查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 通過session得到transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的即可,密碼是指授權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 創建郵件
        // 發送HTML內容的郵件
        Message message = createHtmlMail(session);

        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * HTML內容郵件
     *      創建一封包含html內容的郵件
     */
    public static MimeMessage createHtmlMail(Session session) throws Exception {

        // 創建郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (現在發件人和收件人是一樣的,那就是自己給自己發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));
        // 郵件的主題
        message.setSubject("測試HTML郵件");
        // 設置發送日期
        message.setSentDate(new Date());

        // 準備郵件數據
        /**
         * Message表示一個郵件,messgaes.getContent()返回一個Multipart對象。
         * 一個Multipart對象包含一個或多個BodyPart對象,來組成郵件的正文部分(包括附件)。
         */
        // 創建多媒體對象
        MimeMultipart multipart = new MimeMultipart();

        // 創建郵件體對象
        MimeBodyPart bodyPart = new MimeBodyPart();
        // 設置HTML內容
        StringBuffer sb = new StringBuffer();
        sb.append("<html><body><a href='http://www.baidu.com'>百度一下</a></body></html>");
        bodyPart.setContent(sb.toString(), "text/html;charset=UTF-8");

        // 將bodyPart對象設置到multipart對象中
        multipart.addBodyPart(bodyPart);
        // 將multipart對象設置到message對象中 (setContent():)
        message.setContent(multipart);

        // 返回創建好的郵件對象
        return message;
    }   
}

效果如下:

![]()

發送包含附件的郵件

package com.xxxx.mail;

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.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * 發送包含附件的郵件
 */
public class MailTest03 {

    public static void main(String[] args) throws Exception {

        // 定義郵箱服務器配置
        Properties prop = new Properties();
        // 設置郵件服務器主機名 (163 郵件服務器地址:"mail.smtp.host"  "smtp.163.com")
        prop.setProperty("mail.smtp.host", "smtp.163.com");
        // 設置郵件服務器的端口
        prop.setProperty("mail.smtp.port", "25");
        // 設置郵件服務器認證屬性 (設置爲true表示發送服務器需要身份驗證)
        prop.setProperty("mail.smtp.auth", "true");

        // 使用JavaMail發送郵件的5個步驟
        // 1. 創建session
        Session session = Session.getInstance(prop);
        // 開啓Session的debug模式,這樣就可以查看到程序發送Email的運行狀態
        session.setDebug(true);
        // 2. 通過session得到transport對象
        Transport ts = session.getTransport();
        // 3. 使用郵箱的用戶名和密碼連上郵件服務器(用戶名只需寫@前面的即可,密碼是指授權碼)
        ts.connect("smtp.163.com", "用戶名", "密碼");
        // 4. 創建郵件
        // 發送包含附件的郵件
        Message message = createAttachMail(session);

        // 5. 發送郵件
        ts.sendMessage(message, message.getAllRecipients());
        // 關閉transport對象
        ts.close();

    }

    /**
     * 包含附件的郵件
     *      創建一封包含附件的郵件
     * @param session
     * @return
     * @throws MessagingException
     */
    public static MimeMessage createAttachMail(Session session) throws MessagingException {
        // 創建郵件對象
        MimeMessage message = new MimeMessage(session);
        // 設置郵件的發件人的郵箱地址
        message.setFrom(new InternetAddress("發件人的郵箱地址"));
        // 設置郵件的收件人的郵箱地址 (現在發件人和收件人是一樣的,那就是自己給自己發)
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的郵箱地址"));
        // 郵件的主題
        message.setSubject("測試包含附件的郵件");
        // 設置發送日期
        message.setSentDate(new Date());

        // 創建郵件正文
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setContent("使用JavaMail創建的帶附件的郵件", "text/html;charset=UTF-8");

        // 創建附件
        MimeBodyPart attachPart = new MimeBodyPart();
        // 本地文件
        DataHandler dh = new DataHandler(new FileDataSource("C:\\work\\郵件附件.txt"));
        attachPart.setDataHandler(dh);
        // 附件名
        attachPart.setFileName(dh.getName());

        // 創建容器描述數據關係
        MimeMultipart multipart = new MimeMultipart();
        // 添加正文
        multipart.addBodyPart(bodyPart);
        // 添加附件
        multipart.addBodyPart(attachPart);
        // 如果在郵件中要添加附件,設置爲mixed;。
        multipart.setSubType("mixed");

        // 設置郵件的內容
        message.setContent(multipart);

        // 返回創建好的郵件對象
        return message;
    }
}

效果如下:

![]()

Java Mail 郵件發送封裝

創建郵件發送信息類

package com.xxxx.mail;

import java.util.List;

/**
 * 郵件發送信息類
 *   定義發送郵件時 郵件服務器 端口 發送方用戶名 密碼等字段
 */
public class MailSendInfo {

    private String serverHost; // 服務器主機
    private String serverPort; // 服務器端口

    private String fromAddress;// 發送方郵箱地址
    private List<String> toAddress; // 接收方郵箱地址

    private String userName; // 郵件服務器用戶名
    private String userPwd; // 郵件服務器密碼(授權密碼)

    private String subject; // 郵件主題
    private String content; // 郵件內容

    private Boolean flag = true; // 是否需要身份認證

    private List<String> attachFileNames; // 附件文件名

    public Boolean getFlag() {
        return flag;
    }
    public void setFlag(Boolean flag) {
        this.flag = flag;
    }
    public String getServerHost() {
        return serverHost;
    }
    public void setServerHost(String serverHost) {
        this.serverHost = serverHost;
    }
    public String getServerPort() {
        return serverPort;
    }
    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }
    public String getFromAddress() {
        return fromAddress;
    }
    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }
    public List<String> getToAddress() {
        return toAddress;
    }
    public void setToAddress(List<String> toAddress) {
        this.toAddress = toAddress;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPwd() {
        return userPwd;
    }
    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public List<String> getAttachFileNames() {
        return attachFileNames;
    }
    public void setAttachFileNames(List<String> attachFileNames) {
        this.attachFileNames = attachFileNames;
    }
}

創建認證類

package com.xxxx.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 認證類
 */
public class MyAuthenticator extends Authenticator {

    private String userName; // 郵箱
    private String userPwd; // 密碼(授權碼)
    public MyAuthenticator(String userName, String userPwd) {
        this.userName = userName;
        this.userPwd = userPwd;
    }

    /**
     * 郵件服務器發送郵件時,進行身份驗證
     * @return
     */
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, userPwd);
    }
}

創建郵件發送器

package com.xxxx.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

public class MailSender {

    public void sendMail(MailSendInfo mailSendInfo){
        Message message = null;
        Session session = null;
        try {
            // 定義郵箱服務器配置
            Properties props = new Properties();
            // 163 郵件服務器地址
            props.put("mail.smtp.host", mailSendInfo.getServerHost());
            // 163 郵件服務器端口
            props.put("mail.smtp.port",mailSendInfo.getServerPort());
            // 163 郵件服務器認證屬性
            props.put("mail.smtp.auth", mailSendInfo.getFlag());
            // 身份認證類
            MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());
            // 創建session
            session = Session.getDefaultInstance(props, authenticator);
            // 開啓Session的debug模式,這樣就可以查看到程序發送Email的運行狀態
            session.setDebug(true);
            // 創建message郵件對象
            message = new MimeMessage(session);
            // 設置發送方的郵箱地址
            Address from = new InternetAddress(mailSendInfo.getFromAddress());
            message.setFrom(from);
            // 設置發送時間
            message.setSentDate(new Date());

            // 判斷接收方的郵箱地址
            if(null != mailSendInfo.getToAddress() && mailSendInfo.getToAddress().size() > 0){
                // 定義數組
                Address[] addresses = new Address[mailSendInfo.getToAddress().size()];
                // 循環獲取接收方的郵箱地址,並設置到對應的address數組中
                for(int i = 0; i < mailSendInfo.getToAddress().size(); i++){
                    Address address = new InternetAddress(mailSendInfo.getToAddress().get(i));
                    addresses[i] = address;
                }
                // 設置接收方的郵箱地址
                message.setRecipients(Message.RecipientType.TO, addresses);
                // 設置郵件主題
                message.setSubject(mailSendInfo.getSubject());

                // 創建多媒體對象容器
                Multipart multipart = new MimeMultipart();

                // 創建正文內容
                BodyPart bodyPart =new MimeBodyPart();
                bodyPart.setContent(mailSendInfo.getContent(),"text/html;charset=utf-8");
                // 添加正文 (將正文內容設置到多媒體對象容器中)
                multipart.addBodyPart(bodyPart);

                // 獲取所有的附件內容
                List<String> files = mailSendInfo.getAttachFileNames();
                // 判斷是否包含附件內容
                if(null != files && files.size() > 0){
                    for(int i = 0; i < files.size(); i++){
                        // 獲取對應的附件對象
                        File tempFile = new File(files.get(i));
                        // 判斷附件是否存在
                        if(tempFile.exists()){
                            // 如果附件存在,創建附件對象
                            BodyPart attachPart = new MimeBodyPart();
                            attachPart.setDataHandler(new DataHandler(new FileDataSource(tempFile)));
                            // 設置文件名 (解決附件名亂碼)
                            attachPart.setFileName(MimeUtility.encodeText(tempFile.getName()));
                            // 添加附件 (將附件內容添加到多媒體對象容器中)
                            multipart.addBodyPart(attachPart);
                        }
                    }
                }

                // 設置郵件內容
                message.setContent(multipart);
                // 發送郵件
                Transport.send(message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

郵件發送測試

發送HTML內容的郵件
/**
  * 發送HTML內容的郵件
  */
public static void testHtmlMail() {
    MailSendInfo mailSendInfo = new MailSendInfo();
    mailSendInfo.setServerHost("smtp.163.com");
    mailSendInfo.setServerPort("25");
    mailSendInfo.setUserName("郵箱用戶名");
    mailSendInfo.setUserPwd("密碼(授權碼)");
    mailSendInfo.setSubject("郵件封裝");
    mailSendInfo.setFromAddress("發件人的郵箱地址");
    mailSendInfo.setContent("<h2>這是封裝後發送的郵件</h2>");
    List<String> users = new ArrayList<>();
    users.add("收件人的郵箱地址");
    mailSendInfo.setToAddress(users);
    MailSender mailSender=new MailSender();
    mailSender.sendMail(mailSendInfo);
}

效果如下:

![]()

發送包含附件的郵件
/**
  * 發送包含附件的郵件
  */
public static void testAttachMail() {
    MailSendInfo mailSendInfo = new MailSendInfo();
    mailSendInfo.setServerHost("smtp.163.com");
    mailSendInfo.setServerPort("25");
    mailSendInfo.setUserName("用戶名");
    mailSendInfo.setUserPwd("密碼(授權碼)");
    mailSendInfo.setSubject("郵件封裝");
    mailSendInfo.setFromAddress("發件人的郵箱地址");
    mailSendInfo.setContent("<h2>包含附件的郵件</h2>");
    List<String> users = new ArrayList<>();
    users.add("收件人的郵箱地址");
    mailSendInfo.setToAddress(users);

    // 添加附件
    List<String> files=new ArrayList<String>();
    files.add("C:\\work\\郵件附件.txt");
    files.add("C:\\work\\名單.xlsx");
    mailSendInfo.setAttachFileNames(files);
    MailSender mailSender=new MailSender();
    mailSender.sendMail(mailSendInfo);
}

效果如下:

![]()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章