本文首發於簡書,Java Mail 郵件傳送(一):Demo
上週公司的專案要求開發郵件傳送功能。自己在網上跟著教程邊學邊做了一下午,現在基本開發完成了。由於一個同事也想看下該怎麼寫,順便學習下。所以我就寫成了一遍教程,順便鞏固下郵件傳送裡面的內容。
郵件傳送Demo
第一步,我們先寫個Demo,用最快的方式最少的程式碼向你展示Java Mail 是如何工作的。 我的開發環境是:
- JDK1.6
- java-mail.jar 1.45
構建一個簡單的郵件傳送,一共需要四步:
1.配置發件人郵箱資訊以及建立一個存放SMTP伺服器地址等引數的Java 配置類。
String sendEmailAccount = "Example@outlook.com"; //發件人郵箱
String sendEmailPassword = "password"; //發件人密碼
String sendEmailSMTPHost = "smtp-mail.outlook.com"; // 發件人郵箱的 SMTP 伺服器地址, 此處為Outlook郵箱的SMTP伺服器
String receiveMailAccount = "Example@163.com"; // 收件人郵箱
final String smtpPort = "587"; //預設埠號設定為587,也可以設定為465,具體取決於SMTP伺服器要求的埠號
Properties props = new Properties(); // 使用Java配置類進行配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求)
props.setProperty("mail.smtp.host", sendEmailSMTPHost); // 發件人的郵箱的 SMTP 伺服器地址
props.setProperty("mail.smtp.auth", "true"); // 需要請求認證
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.socketFactory.port", smtpPort );
複製程式碼
2.建立一個同郵件伺服器互動的session
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // debug模式下會在控制檯列印出日誌,如果不想看日誌應該設定為false
複製程式碼
3.建立一封格式化的郵件
// 1. 建立一封郵件
MimeMessage message = new MimeMessage(session);
// 2. From: 發件人
message.setFrom(new InternetAddress(sendEmailAccount , "ExampleFrom", "UTF-8"));
// 3. To: 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAccount, "ExampleUser", "UTF-8"));
// 4. Subject: 郵件主題(標題有廣告嫌疑,避免被郵件伺服器誤認為是濫發廣告以至返回失敗,請修改標題)
message.setSubject("", "UTF-8");
// 5. Content: 郵件正文
message.setContent("<h3>This is a test email.</h3>", "text/html;charset=UTF-8");
// 6. 設定郵件發件時間
message.setSentDate(new Date());
// 7. 儲存設定
message.saveChanges();
複製程式碼
4.傳送郵件
// 1. 根據 Session 獲取郵件傳輸物件
Transport transport = session.getTransport();
// 2. 使用 郵箱賬號 和 密碼 連線郵件伺服器
transport.connect(myEmailAccount, myEmailPassword);
// 3. 傳送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在建立郵件物件時新增的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 4. 關閉連線
transport.close();
複製程式碼
完整程式碼
整合以上步驟的完整程式碼如下:
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;
public class MailExample {
public static void main(String[] args) throws Exception {
/**
* 1.配置發件人郵箱資訊以及建立一個Java 配置類存放SMTP伺服器地址等引數。
*/
String sendEmailAccount = "Example@outlook.com"; // 發件人郵箱
String sendEmailPassword = "password"; // 發件人密碼
String sendEmailSMTPHost = "smtp-mail.outlook.com"; // 發件人郵箱的 SMTP 伺服器地址, 此處為Outlook郵箱的SMTP伺服器
String receiveMailAccount = "Example@163.com"; // 收件人郵箱
Properties props = new Properties(); // 使用Java配置類進行配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求)
props.setProperty("mail.smtp.host", sendEmailSMTPHost); // 發件人的郵箱的 SMTP 伺服器地址
props.setProperty("mail.smtp.auth", "true"); // 需要請求認證
final String smtpPort = "465"; // 預設埠號設定為587,也可以設定為465,具體取決於SMTP伺服器要求的埠號
props.setProperty("mail.smtp.port",smtpPort );
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.socketFactory.port", smtpPort );
/**
* 2.建立一個同郵件伺服器互動的session
*/
Session session = Session.getDefaultInstance(props);
session.setDebug(true);
MimeMessage message = new MimeMessage(session); // 1. 建立一封郵件
message.setFrom(new InternetAddress(sendEmailAccount, "ExampleFrom", "UTF-8")); // 2. From: 發件人
message.setRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(receiveMailAccount, "ExampleUser", "UTF-8")); // 3. To: 收件人
message.setSubject("", "UTF-8"); // 4. Subject: 郵件主題(標題有廣告嫌疑,避免被郵件伺服器誤認為是濫發廣告以至返回失敗,請修改標題)
message.setContent("<h3>This is a test email.</h3>", "text/html;charset=UTF-8"); // 5. Content: 郵件正文
message.setSentDate(new Date()); // 6. 設定郵件發件時間
message.saveChanges(); // 7. 儲存設定
/**
* 3.建立一封格式化的郵件
*/
Transport transport = session.getTransport(); // 1. 根據 Session 獲取郵件傳輸物件
transport.connect(sendEmailAccount, sendEmailPassword); // 2. 使用 郵箱賬號 和 密碼 連線郵件伺服器
transport.sendMessage(message, message.getAllRecipients()); // 3. 傳送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在建立郵件物件時新增的所有收件人, 抄送人,
transport.close(); // 4. 關閉連線
}
}
複製程式碼
這樣一個簡單的JavaMail的Demo就完成了。快去測試下吧。