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
相关产品推荐
相关产品推荐

