JavaMail API (javax.mail / jakarta.mail) 是郵件收發標準擴展,但不包含郵件服務器。本文整理官方 FAQ 核心條目:安裝部署、郵件服務器獲取、代理/防火牆穿透、CLASSPATH 設置、Linux unzip Bug、SecurityManager 權限、Web 容器整合、Servlet 演示配置、常見 ClassNotFound/ProviderNotFound 錯誤排查。
| 場景 | 方案 | 配置示例 |
| HTTP 代理僅支持 HTTP | JavaMail 使用 SMTP/IMAP/POP3,**無法**走 HTTP 代理 | 企業郵件網關 (內部 SMTP → 互聯網) |
| SOCKS V4/V5 代理 | JVM 級別配置,所有 TCP Socket 走 SOCKS | -DsocksProxyHost=proxy_host -DsocksProxyPort=1080 |
| 防火牆阻擋直連 | 開放目標郵件服務器端口 (25/465/587/110/995/143/993) | 或部署內部郵件中繼服務器 |
注意: socksProxyHost/Port 是**系統屬性**,影響整個 JVM 所有 TCP 連接,謹慎使用。
四、 Windows 設置 CLASSPATH (圖形界面)
- 我的電腦 → 屬性 → 高級 → 環境變量
- 系統變量 → 新建/編輯
CLASSPATH
- 值:
.;C:\Java\javamail-1.6\mail.jar;C:\Java\jaf-1.1.1\activation.jar (含當前目錄 .)
五、 Linux unzip Bug 導致 mail.jar 損壞
現象: 運行報 VerifyError: Illegal use of nonvirtual function call (類 com.sun.mail.pop3.POP3Store)
原因: 部分 Linux 發行版自帶 unzip 版本有缺陷,解壓破壞 JAR 內部條目 CRC
解決: 使用 JDK 自帶 jar xf javamail.zip 或升級 unzip 至 6.0+
六、 SecurityManager 權限配置 (JDK 1.2+)
應用若運行於 SecurityManager 下,需在政策文件 (java.policy) 授予:
grant codeBase "file:/path/to/mail.jar" {
permission java.io.FilePermission "/path/to/mail.jar", "read";
permission java.io.FilePermission "/path/to/activation.jar", "read";
permission java.net.SocketPermission "smtp_host:25", "connect,resolve";
permission java.net.SocketPermission "imap_host:143", "connect,resolve";
permission java.net.SocketPermission "pop3_host:110", "connect,resolve";
permission java.util.PropertyPermission "*", "read,write"; // 若使用 System.getProperties()
};
調試開關:-Dmail.debug=true、-Djavax.activation.debug=true、-Djava.security.debug=access:failure
七、 Web 容器整合 (Tomcat / Jetty / JBoss / WebLogic)
- 將
mail.jar、activation.jar 放入容器共享庫 (Tomcat: $CATALINA_HOME/lib/) 或應用 WEB-INF/lib/
- 修改 CLASSPATH 後必須完全重啟容器 (熱部署不生效)
- Servlet 中查找 Session:
Session session = Session.getInstance(getServletContext().getInitParameter("mail.props"))
八、 常見 ProviderNotFound 錯誤排查
| 錯誤 | 原因 | 解決 |
| No provider for "smtp"/"imap" | mail.jar 未在類路徑、或 JAR 損壞、或 SecurityManager 禁止讀取 META-INF/javamail.providers | 檢查 JAR 完整性、授予 FilePermission、確保未解壓 JAR 內容到類路徑 |
| No provider for address type "rfc822" | 同上,activation.jar 缺失或 META-INF/mailcap 讀取受限 | 確保 activation.jar 在類路徑、授予權限 |
九、 Java Web Server (JWS) 歷史遺留
舊版文檔提及 jws.jar,**現代版本 (Java Web Server 2.0+) 無需且不再發布 jws.jar**,僅需 mail.jar + activation.jar。
結語
JavaMail 配置核心三點:1) mail.jar + activation.jar 雙雙在類路徑 2) 可達的 SMTP/IMAP/POP3 服務器 3) SecurityManager 場景授予讀取配置文件與網絡連接權限。現代專案建議使用 Spring Boot Mail Starter (org.springframework.boot:spring-boot-starter-mail) 自動裝配,消除手動配置錯誤。
- 上一篇文章: Resin 1.1.4 + Apache 1.3 整合安裝配置教程 (Windows 環境)
- 下一篇文章: FreeBSD Ports 安裝 Eclipse 3.1 + JDK 1.4.2 + JBoss 3.2.5 開發環境實錄
Copyright ©
程式碼之家 All Rights Reserved