Android Studio中使用Java Mail API无Gmail客户端发送邮件失败
Android Java Mail API 发送邮件时 Transport.send(message) 未执行的排查方案
针对你遇到的Transport.send(message)未执行的问题,可按以下步骤排查解决:
必须在子线程执行发送逻辑
Android禁止在主线程进行网络操作,Java Mail的邮件发送属于网络请求,如果直接在主线程调用Transport.send,会触发NetworkOnMainThreadException,导致代码中断且无明显提示。需将发送逻辑放到子线程中,比如用Thread、AsyncTask或协程:new Thread(new Runnable() { @Override public void run() { try { Transport.send(message); } catch (Exception e) { e.printStackTrace(); } } }).start();捕获并打印完整异常栈
很多情况下代码未执行是因为前置步骤抛出了异常但未被捕获,或者仅打印了错误消息。务必将Transport.send包裹在try-catch块中,打印完整的异常栈轨迹,定位具体问题:try { Transport.send(message); Log.d("MailDebug", "邮件发送成功"); } catch (Exception e) { Log.e("MailDebug", "发送失败详情", e); }核对邮箱配置与权限
- 确认SMTP服务器地址、端口、加密方式正确(例如Gmail的SMTP地址为
smtp.gmail.com,587端口对应TLS加密,465对应SSL); - 若使用Gmail,需开启两步验证并生成应用专用密码,替代原账号密码(Google已逐步关闭低安全应用访问权限);
- 确保
AndroidManifest.xml中添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />
- 确认SMTP服务器地址、端口、加密方式正确(例如Gmail的SMTP地址为
使用Android适配版Java Mail依赖
不要直接使用标准javax.mail包,需引入适配Android的版本,Gradle依赖如下:implementation 'com.sun.mail:android-mail:1.6.7' implementation 'com.sun.mail:android-activation:1.6.7'开启Session调试模式
给Session开启debug模式,打印SMTP交互的详细日志,能直观看到连接、认证、发送的每一步状态:Properties props = new Properties(); // 配置props... Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("你的邮箱", "密码/应用专用密码"); } }); session.setDebug(true); // 开启调试
内容的提问来源于stack exchange,提问作者mauricio romero
相关产品推荐
相关产品推荐

