參考
Java 基於JavaMail實現向QQ郵箱發送郵件
java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger for JUnit test case for Java mail
寫在前面
現在很多 Web 項目都集成了發送郵件給用戶,以便提醒用戶一些信息的功能,或者發送驗證碼給郵箱,來實現註冊功能。那麼這樣的功能要如何實現呢,其實非常簡單。
開啓管理員郵箱的 SMTP 功能
拿 QQ 郵箱舉例,首先管理員(也就是公司,網站服務端)需要開啓一個自己的郵箱中的 SMTP 服務。在計算機網絡中,SMTP 服務就是用於發送郵件的。
在 QQ 郵箱,設置-賬戶中,開啓 SMTP 功能。
開啓後,QQ 會提供給你一個授權碼,相當於一個 API 的 KEY,會在接下來的程序中使用到。
主要代碼
具體的代碼如下,但是特別注意,不同的郵箱具體的代碼會有些許的不同,比如 QQ 郵箱必須提供 SSL 加密操作,jar 使用 maven 管理
<!-- 發送郵件依賴的 jar 包-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<!-- MailSSLSocketFactory 加密的 jar 包 -->
<!-- 注意這裏的版本是 1.5.3 如果是低版本,比如我之前用的 1.4.4 ,那麼下面的核心代碼中有類不能使用 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency>
package com.www.utils;
import com.sun.mail.util.MailSSLSocketFactory;
import org.junit.Test;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
public class MailUtil {
public void sendMail() throws GeneralSecurityException, MessagingException {
Properties props = new Properties();
// 開啓debug調試
props.setProperty("mail.debug", "true");
// 發送服務器需要身份驗證
props.setProperty("mail.smtp.auth", "true");
// 設置郵件服務器主機名
props.setProperty("mail.host", "smtp.qq.com");
// 發送郵件協議名稱
props.setProperty("mail.transport.protocol", "smtp");
// ssl 加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
Session session = Session.getInstance(props);
Message msg = new MimeMessage(session);
msg.setSubject("標題");
StringBuilder builder = new StringBuilder();
builder.append("內容");
builder.append("\n內容");
msg.setText(builder.toString());
msg.setFrom(new InternetAddress("發送者郵箱"));
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", "發送者郵箱", "授權碼");
transport.sendMessage(msg, new Address[] { new InternetAddress("接收者郵箱") });
transport.close();
}
}
效果
存在的問題
不知道爲什麼原因,我發送的信息都被騰訊當作垃圾郵件存放在垃圾箱中了。