1. 程式人生 > >使用Java傳送電子郵件

使用Java傳送電子郵件

所需jar包

<dependency>
        <groupId>javax.mail</groupId>
        <artifactId>javax.mail-api</artifactId>
        <version>1.5.5</version>
    </dependency>

測試類

package com.dx.event.controller;

import java.util.Date;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * JavaMail 版本: 1.6.0
 * JDK 版本: JDK 1.7 以上(必須)
 */
public class SendEmail {

    // 發件人的 郵箱 和 密碼(替換為自己的郵箱和密碼)	
    // PS: 某些郵箱伺服器為了增加郵箱本身密碼的安全性,給 SMTP 客戶端設定了獨立密碼(有的郵箱稱為“授權碼”), 
    //     對於開啟了獨立密碼的郵箱, 這裡的郵箱密碼必需使用這個獨立密碼(授權碼)。
    public static String myEmailAccount = "
[email protected]
"; public static String myEmailPassword = "pgiofyopctlkegih"; // 發件人郵箱的 SMTP 伺服器地址, 必須準確, 不同郵件伺服器地址不同, 一般(只是一般, 絕非絕對)格式為: smtp.xxx.com // 網易163郵箱的 SMTP 伺服器地址為: smtp.163.com // 要對應 發信郵箱的SMTP 伺服器地址 public static String myEmailSMTPHost = "smtp.qq.com"; // 收件人郵箱(替換為自己知道的有效郵箱) // 每種型別的郵箱都可以 public static String receiveMailAccount = "
[email protected]
"; public static void main(String[] args) throws Exception { // 1. 建立引數配置, 用於連線郵件伺服器的引數配置 Properties props = new Properties(); // 引數配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求) props.setProperty("mail.smtp.host", myEmailSMTPHost); // 發件人的郵箱的 SMTP 伺服器地址 props.setProperty("mail.smtp.auth", "true"); // 需要請求認證 // PS: 某些郵箱伺服器要求 SMTP 連線需要使用 SSL 安全認證 (為了提高安全性, 郵箱支援SSL連線, 也可以自己開啟), // 如果無法連線郵件伺服器, 仔細檢視控制檯列印的 log, 如果有有類似 “連線失敗, 要求 SSL 安全連線” 等錯誤, // 開啟下面 /* ... */ 之間的註釋程式碼, 開啟 SSL 安全連線。 /* // SMTP 伺服器的埠 (非 SSL 連線的埠一般預設為 25, 可以不新增, 如果開啟了 SSL 連線, // 需要改為對應郵箱的 SMTP 伺服器的埠, 具體可檢視對應郵箱服務的幫助, // QQ郵箱的SMTP(SLL)埠為465或587, 其他郵箱自行去檢視)*/ //方法一 /*final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort);*/ // PS 如果用的jar是Apache的commons-email jar // 問題在於該jar的email對於ssl的支援不對,少設定了一個屬性。 // 如果是ssl連線,需要在session的properties中增加設定:"mail.smtp.ssl.enable", "true"。 //方法二 props.setProperty("mail.smtp.ssl.enable","true"); // 2. 根據配置建立會話物件, 用於和郵件伺服器互動 Session session = Session.getInstance(props); session.setDebug(true); // 設定為debug模式, 可以檢視詳細的傳送 log // 3. 建立一封郵件 MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount); // 4. 根據 Session 獲取郵件傳輸物件 Transport transport = session.getTransport(); // 5. 使用 郵箱賬號 和 密碼 連線郵件伺服器, 這裡認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯 // // PS_01: 成敗的判斷關鍵在此一句, 如果連線伺服器失敗, 都會在控制檯輸出相應失敗原因的 log, // 仔細檢視失敗原因, 有些郵箱伺服器會返回錯誤碼或檢視錯誤型別的連結, 根據給出的錯誤 // 型別到對應郵件伺服器的幫助網站上檢視具體失敗原因。 // // PS_02: 連線失敗的原因通常為以下幾點, 仔細檢查程式碼: // (1) 郵箱沒有開啟 SMTP 服務; // (2) 郵箱密碼錯誤, 例如某些郵箱開啟了獨立密碼; // (3) 郵箱伺服器要求必須要使用 SSL 安全連線; // (4) 請求過於頻繁或其他原因, 被郵件伺服器拒絕服務; // (5) 如果以上幾點都確定無誤, 到郵件伺服器網站查詢幫助。 // // PS_03: 仔細看log, 認真看log, 看懂log, 錯誤原因都在log已說明。 transport.connect(myEmailAccount, myEmailPassword); // 6. 傳送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在建立郵件物件時新增的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 關閉連線 transport.close(); } /** * 建立一封只包含文字的簡單郵件 * * @param session 和伺服器互動的會話 * @param sendMail 發件人郵箱 * @param receiveMail 收件人郵箱 * @return * @throws Exception */ public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception { // 1. 建立一封郵件 MimeMessage message = new MimeMessage(session); // 2. From: 發件人(暱稱有廣告嫌疑,避免被郵件伺服器誤認為是濫發廣告以至返回失敗,請修改暱稱) message.setFrom(new InternetAddress(sendMail, "某寶網", "UTF-8")); // 3. To: 收件人(可以增加多個收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX使用者", "UTF-8")); // 4. Subject: 郵件主題(標題有廣告嫌疑,避免被郵件伺服器誤認為是濫發廣告以至返回失敗,請修改標題) message.setSubject("這是測試郵件主題", "UTF-8"); // 5. Content: 郵件正文(可以使用html標籤)(內容有廣告嫌疑,避免被郵件伺服器誤認為是濫發廣告以至返回失敗,請修改傳送內容) message.setContent("這是測試郵件的內容,。。。。XX使用者你好, 錯過今天再等一年。。。", "text/html;charset=UTF-8"); // 6. 設定發件時間 message.setSentDate(new Date()); // 7. 儲存設定 message.saveChanges(); return message; } }