在 Ubuntu 中配置 JSP 邮件服务
一 环境准备
- 安装 JDK 11(或更高版本)与 Apache Tomcat 9(或其他 Servlet 容器),确保 JAVA_HOME 与 CATALINA_HOME 正确设置,Tomcat 可正常访问 http://服务器IP:8080。
- 准备发信凭据:选择本地 Postfix 或第三方 SMTP(如 QQ 邮箱、163 邮箱、SendGrid、Mailgun)。如使用 QQ/163,需在邮箱后台开启 SMTP/授权码 并获取授权码。
二 方案选择
- 本地发信(Postfix 作为 MTA):JSP 直接连 localhost:25 发送;优点是简单,缺点是对外发信易被拦截、需维护发信信誉。
- 外部 SMTP(推荐):JSP 直连邮箱服务商的 SMTP(如 smtp.qq.com:587/465),成功率与可维护性更高,适合生产。
- 轻量替代(ssmtp/msmtp):系统级配置后,应用仍按 SMTP 方式发送,适合无完整 MTA 的场景。
三 方案一 使用本地 Postfix 发信
- 安装与基础配置
- 安装 Postfix:sudo apt update && sudo apt install postfix
- 安装向导选择 Internet Site,设置 系统邮件名称(如:mail.example.com)。
- 启动与开机自启:sudo systemctl start postfix && sudo systemctl enable postfix
- 可选安全与中继控制(/etc/postfix/main.cf)
- 启用 TLS:smtpd_use_tls=yes,证书可用默认自签 snakeoil 或 Let’s Encrypt。
- 限制中继:mynetworks=127.0.0.0/8 [::1]/128(仅本机中继,如需外发请配置 SASL/SMTP 认证)。
- 防火墙放行:sudo ufw allow 25/tcp(如启用防火墙)。
- 连通性测试
- telnet localhost 25 或 mail 命令发信,确认本机能出信。
四 方案二 使用外部 SMTP 发信(JSP 直连)
- 准备凭据
- 开启 QQ/163 邮箱 SMTP/授权码,记录 SMTP 服务器地址、端口、发件邮箱、授权码。
- 添加 JavaMail 依赖
- 将 javax.mail.jar 放入 WEB-INF/lib(Maven 项目添加对应依赖)。
- 核心配置与代码示例(端口 587/STARTTLS 或 465/SSL)
- 587/STARTTLS 示例
- 属性:mail.smtp.host=smtp.xx.com;mail.smtp.port=587;mail.smtp.auth=true;mail.smtp.starttls.enable=true
- 认证:PasswordAuthentication(from, 授权码)
- 465/SSL 示例
- 属性:mail.smtp.host=smtp.xx.com;mail.smtp.port=465;mail.smtp.auth=true;mail.smtp.ssl.enable=true
- 认证:PasswordAuthentication(from, 授权码)
- 参考要点:QQ 邮箱需使用 授权码 而非登录密码;如使用自签名证书需设置信任策略(仅测试环境)。
- 部署与测试
- 将应用部署到 Tomcat,访问 JSP 表单提交发送,查看控制台/日志输出。
五 常见问题与优化
- 连接被拒/超时:确认云厂商安全组与防火墙放行 25/587/465;如使用本地 Postfix,确保服务运行且监听正确端口。
- 认证失败:核对 SMTP 地址/端口/授权码;QQ/163 必须使用 授权码;必要时开启调试 session.setDebug(true)。
- 被判定为垃圾:为发信域名配置 SPF 记录(如:v=spf1 include:spf.xx.com ~all),必要时增加 DKIM/DMARC。
- 证书与加密:生产环境优先 587/STARTTLS 或 465/SSL,避免使用明文 25;可使用 Let’s Encrypt 为 Postfix 配置有效证书。
- 凭据安全:避免在代码中硬编码,使用 JNDI、配置文件(外部挂载)或 环境变量 管理敏感信息。