You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android连接smtp.gmail.com:587失败,邮件带附件发送报错求助

解决JavaMail连接SMTP服务器报错的方案

核心问题分析

报错java.net.NoRouteToHostException: Host unreachable本质是网络层面无法连通smtp.gmail.com:587,和JavaMail代码配置的关联度较低,优先排查网络和环境限制。

排查步骤与解决方法

1. 验证基础网络连通性

  • 直接在运行代码的设备上,用ping命令测试:ping smtp.gmail.com,或者用telnet测试端口:telnet smtp.gmail.com 587
    • 如果ping不通/telnet无法连接,说明设备的网络环境(比如公司内网防火墙、代理、VPN)屏蔽了对Gmail SMTP服务器的访问,需要联系网络管理员开放端口,或者切换到不受限制的网络(比如手机热点)测试。
  • 部分网络环境会屏蔽587端口,可尝试改用Gmail的465端口(SSL加密),配置时将mail.smtp.port设为465,同时开启mail.smtp.ssl.enable=true。

2. 检查Gmail账户的安全设置

  • 普通Gmail账户需注意:谷歌从2022年开始限制低安全性应用访问,若开启了两步验证,必须使用应用专用密码替换普通密码;若未开启两步验证,可临时开启低安全性应用访问(仅测试用,不推荐长期开启)。
  • 应用专用密码生成步骤:开启账户两步验证后,到谷歌账户管理页面生成对应应用的专用密码。

3. 核对JavaMail配置细节

确保你的JavaMailAPI.java中的SMTP配置包含以下关键项:

props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true"); // 587端口必须开启STARTTLS
props.put("mail.smtp.ssl.trust", "smtp.gmail.com"); // 信任SSL证书
  • 若切换到465端口,需修改为:
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.remove("mail.smtp.starttls.enable");

4. 确认依赖与权限配置

  • 建议改用官方的JavaMail依赖(避免旧jar包的兼容性问题):
implementation 'com.sun.mail:javax.mail:1.6.2'
implementation 'javax.activation:activation:1.1.1'
  • 确认Manifest中的网络权限是否正确添加:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

5. 检查代码运行线程

Android平台下不能在主线程执行网络操作,确保JavaMail的发送逻辑在子线程(比如AsyncTask、Thread或者Coroutine)中执行,否则会触发NetworkOnMainThreadException,间接导致连接失败。

内容的提问来源于stack exchange,提问作者Varma Lanke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:20:31