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

Android端JavaMail调试版正常但发布版报NoSuchProviderException求助

Android发布版本中javax.mail抛出NoSuchProviderException的问题与解决

依赖配置

使用面向Android的javax.mail,依赖配置如下:

implementation 'com.sun.mail:android-mail:1.6.7'
implementation 'com.sun.mail:android-activation:1.6.7'

实现代码

邮件发送核心实现代码:

try {
    // 创建配置对象
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", "mail.domainfoo.com");
    props.put("mail.smtp.port", 587);
    props.put("mail.debug", "true");

    // 创建会话对象
    Session session = Session.getInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(SENDER_EMAIL, SENDER_PASSWORD);
        }
    });

    // 创建邮件消息对象
    Message message = new MimeMessage(session);

    // 设置发件人和收件人
    message.setFrom(new InternetAddress(SENDER_EMAIL));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmails));

    message.setText("some text");
    // 发送邮件
    Transport.send(message);
} catch (Exception ex) {

}

异常情况

调试版本运行完全正常,但发布版本执行Transport.send(message)时抛出如下异常:

Exception: smtp
Class: javax.mail.NoSuchProviderException
 Stack trace: javax.mail.NoSuchProviderException: smtp
        at javax.mail.Session.getService(Session.java:856)
        at javax.mail.Session.getTransport(Session.java:772)
        at javax.mail.Session.getTransport(Session.java:713)
        at javax.mail.Session.getTransport(Session.java:693)
        at javax.mail.Session.getTransport(Session.java:750)
        at javax.mail.Transport.send0(Transport.java:225)
        at javax.mail.Transport.send(Transport.java:100)

原因分析

该异常确实与发布版本构建时使用的R8代码压缩有关。javax.mail库中SMTP传输提供者通过反射机制加载,R8在发布构建时会默认移除它认为未被直接引用的类,导致运行时找不到SMTP对应的Provider实现类,从而抛出NoSuchProviderException。

解决方案

在ProGuard配置文件中添加以下规则,保留javax.mail相关的所有类,避免被R8移除:

-keep class javax.mail.** { *; }
-keep class javax.activation.** {*;}
-keep class com.sun.mail.** { *; }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:30:29