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

使用AsyncTask与javax.mail.Authenticator发邮件无报错但未收到,偶现断管错误

解决Android中使用javax.mail发送Gmail无报错但收不到邮件的问题

折腾这种「代码不报错但功能完全没效果」的问题确实闹心,我来帮你一步步排查和解决:

首先,先明确一个关键事实:Gmail的「低安全性应用」已经彻底失效了!

谷歌在2022年就停用了低安全性应用的访问权限,所以你就算开启这个设置也没用。现在要通过Gmail发送邮件,必须满足两个前提:

  • 你的谷歌账号已经开启两步验证
  • 生成一个应用专用密码(App Password),用这个密码代替你的账号密码来登录SMTP服务器

检查你的GMailSender实现(这大概率是问题核心)

你只贴了MainActivity的代码,但GMailSender类的SMTP配置才是关键。如果这个类的参数不对,肯定发不出邮件。给你一个经过验证的正确实现:

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class GMailSender extends Authenticator {
    private String user;
    private String password;
    private Session session;

    public GMailSender(String user, String password) {
        this.user = user;
        this.password = password;

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.ssl.enable", "true"); // 强制开启SSL加密
        props.put("mail.smtp.connectiontimeout", "10000"); // 增加连接超时,减少broken pipe概率

        session = Session.getDefaultInstance(props, this);
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }

    public void sendMail(String subject, String body, String sender, String recipient) throws Exception {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(sender));
        message.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(recipient));
        message.setSubject(subject);
        message.setText(body);
        Transport.send(message);
    }
}

优化你的MainActivity代码

  1. 去掉多余的StrictMode设置:你已经用AsyncTask在后台线程执行邮件发送了,StrictMode允许所有操作完全没必要,反而可能带来潜在问题。
  2. 完善异常日志和提示:当前的日志只打印了异常消息,很多时候真正的错误原因在堆栈里;而且不管成功失败都显示"Email send",容易误导你。修改后的AsyncTask部分:
new AsyncTask<Void, Void, Boolean>() {
    @Override
    protected Boolean doInBackground(Void... arg) {
        try {
            sender.sendMail("This is Subject", "This is Body", "aaaaaaaaa", "xxxxxxxxx@gmail.com");
            return true;
        } catch (Exception e) {
            Log.e("SendMail", "邮件发送失败", e); // 打印完整异常堆栈
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean isSuccess) {
        super.onPostExecute(isSuccess);
        Toast.makeText(getApplicationContext(), 
                       isSuccess ? "邮件发送成功" : "邮件发送失败,请查看日志", 
                       Toast.LENGTH_SHORT).show();
    }
}.execute();

最后,检查基础权限和网络

  • 确保你的AndroidManifest.xml里添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • 测试设备能正常访问外网,尤其是能连接到smtp.gmail.com的465端口(有些公司或公共网络会屏蔽SMTP端口)

按照上面的步骤来,应该就能解决你的问题了。如果还是不行,把日志里的完整异常信息贴出来,就能快速定位到剩余问题了。

内容的提问来源于stack exchange,提问作者Hello World

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:48:45