首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JavaMail 常見安裝配置問題 FAQ (官方文檔中文整理)

     編輯:Java 相關知識

前言

JavaMail API (javax.mail / jakarta.mail) 是郵件收發標準擴展,但不包含郵件服務器。本文整理官方 FAQ 核心條目:安裝部署、郵件服務器獲取、代理/防火牆穿透、CLASSPATH 設置、Linux unzip Bug、SecurityManager 權限、Web 容器整合、Servlet 演示配置、常見 ClassNotFound/ProviderNotFound 錯誤排查。

一、 安裝與 CLASSPATH

  1. 解壓 javamail-.zip
  2. 將 mail.jar 加入 CLASSPATH (或 Maven: com.sun.mail:jakarta.mail:2.0+)
  3. **必須**同時安裝 JavaBeans Activation Framework (JAF):activation.jar (JDK 6+ 已內置 javax.activation,JDK 9+ 需額外引入 com.sun.activation:jakarta.activation)

二、 郵件服務器誤區澄清

  • JavaMail **不包含** SMTP/IMAP/POP3 服務器
  • 需自備或租用郵件服務器 (企業 Exchange、Google Workspace、郵件服務商、自建 Postfix/Dovecot/Courier)
  • 開發測試可用 GreenMail、MockMail、Dumbster 嵌入式假服務器

三、 代理與防火牆穿透

注意: socksProxyHost/Port 是**系統屬性**,影響整個 JVM 所有 TCP 連接,謹慎使用。

四、 Windows 設置 CLASSPATH (圖形界面)

  1. 我的電腦 → 屬性 → 高級 → 環境變量
  2. 系統變量 → 新建/編輯 CLASSPATH
  3. 值:.;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 錯誤排查

場景方案配置示例
HTTP 代理僅支持 HTTPJavaMail 使用 SMTP/IMAP/POP3,**無法**走 HTTP 代理企業郵件網關 (內部 SMTP → 互聯網)
SOCKS V4/V5 代理JVM 級別配置,所有 TCP Socket 走 SOCKS-DsocksProxyHost=proxy_host -DsocksProxyPort=1080
防火牆阻擋直連開放目標郵件服務器端口 (25/465/587/110/995/143/993)或部署內部郵件中繼服務器

九、 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) 自動裝配,消除手動配置錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤原因解決
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 在類路徑、授予權限