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

