JavaMail發(fā)送郵件(附實例及亂碼問題解決)

下邊是我寫的一個mailTest的類實現(xiàn)。親測有效;
這里是以163郵箱為例,文章的后邊會記錄幾個我本人遇到的問題。也希望可以幫助到你;

package com.utils;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.Properties;

public class mailTest {

    public static void main(String[] args) {
        try {
            sendMail();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("done...");
    }

    private static void sendMail() throws Exception {

        /* --設(shè)置郵件服務(wù)器、端口、開啟認證-- */
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.163.com");
        props.put("mail.smtp.port", 25);
        props.put("mail.smtp.auth", true);

        /* --創(chuàng)建Session-- */
        Session session = Session.getInstance(props, new Authenticator() {
            /* authenticator */
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("xxx@163.com", "********");
            }
        });

        /* --發(fā)件人-- */
        Address addressFrom = new InternetAddress("xxx@163.com");
        // 如果希望發(fā)件人顯示中文,則可以使用:
        // Address addressFrom = new InternetAddress("xxx@163.com", MimeUtility.encodeText("發(fā)送者"));

        /* --收件人-- */
        Address addressTo = new InternetAddress("xxx@163.com");
        // 如果希望收件人顯示中文,則可以使用:
        // Address addressToOne = new InternetAddress(recipient, MimeUtility.encodeText("收件人"));

        /* --抄送-- */
        Address[] addressToArr = {new InternetAddress("xxx1@163.com"), new InternetAddress("xxx2@163.com"), new InternetAddress("xxx3@163.com")};


        /* --郵件內(nèi)容-- */
        Message message = new MimeMessage(session);
        message.setFrom(addressFrom);
        message.setRecipient(Message.RecipientType.TO, addressTo);
        message.setRecipients(Message.RecipientType.CC, addressToArr);

        message.setSubject("郵件主題");
        // 如果是定時任務(wù)發(fā)送,采用以下編碼可解決亂碼問題:
        // message.setSubject(MimeUtility.encodeText("郵件主題", "gbk", null));

        message.setText("Hi, 這里是郵件正文");
        // 如果要發(fā)送的郵件正文為HTML,則第二個參數(shù)為"text/html"
        // 如果要發(fā)送的郵件正文為HTML并且包含中文,則第二個參數(shù)為"text/html;charset=gbk"
        // message.setContent("<p>Hi, 這里是郵件正文</P>", "text/html;charset=gbk");

        /* --發(fā)送-- */
        Transport.send(message);

        /* --發(fā)送完成,做下記錄-- */
        System.out.println("javax.mail:郵件發(fā)送完畢");
    }

}

上邊這段代碼是可行的。你只需將發(fā)件人、收件人的郵箱按實際情況替換即可;

執(zhí)行結(jié)果如下:


result

本人遇到的問題及解答:

1、如何引入依賴?
maven項目在對應(yīng)的pom.xml文件中引入即可

<dependencies>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.1</version>
    </dependency>
</dependencies>

2、mail.smtp.host是郵件服務(wù)器地址,163郵箱的話,可以登錄網(wǎng)頁版,點擊 設(shè)置-POP3/SMTP/IMAP


網(wǎng)頁版截圖

3、PasswordAuthentication中的賬戶名和密碼究竟是什么?

賬戶名很好理解,就是發(fā)件人郵箱;

密碼要注意了,這并不是163郵箱登錄密碼,而是自己另外設(shè)置的一個授權(quán)碼,專門用于登錄第三方郵件客戶端的專用密碼。在下圖位置中點擊開啟即可通過手機號設(shè)置授權(quán)碼:


授權(quán)碼設(shè)置截圖

4、想發(fā)送HTML格式的郵件正文怎么辦?

代碼中已經(jīng)給出了注釋,使用setContent方法即可。

message.setContent("<p>Hi, here is content</P>", "text/html");

需要注意的是,當郵件正文中出現(xiàn)中文,則需要加上charset,否則會出現(xiàn)亂碼。

message.setContent("<p>Hi, 這里是郵件正文</P>", "text/html;charset=gbk");

5、定時任務(wù)/腳本執(zhí)行,郵件主題亂碼怎么辦?

代碼中同樣給出了注釋:

message.setSubject(MimeUtility.encodeText("郵件主題", "gbk", null));

如果這篇文章對你有幫助,不妨點個贊再走吧~ _

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容