javax.mail.nosuchproviderexception smtp

android, jakarta-mail

Solution

I solved this problem by including the additional Proguard config detailed below. I got the solution from this answer which has further information.

-keep class javamail.** {*;}
-keep class javax.mail.** {*;}
-keep class javax.activation.** {*;}

-keep class com.sun.mail.dsn.** {*;}
-keep class com.sun.mail.handlers.** {*;}
-keep class com.sun.mail.smtp.** {*;}
-keep class com.sun.mail.util.** {*;}
-keep class mailcap.** {*;}
-keep class mimetypes.** {*;}
-keep class myjava.awt.datatransfer.** {*;}
-keep class org.apache.harmony.awt.** {*;}
-keep class org.apache.harmony.misc.** {*;}

Problem

I'm using the following code to send emails in my Android application: ``` m_properties = new Properties(); m_properties.put("mail.smtp.host", "smtp.gmail.com"); m_properties.put("mail.smtp.socketFactory.port", "465"); m_properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); m_properties.put("mail.smtp.auth", "true"); m_properties.put("mail.smtp.port", "465"); m_Session = Session.getDefaultInstance(m_properties, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, passWord); } }); m_simpleMessage = new MimeMessage(m_Session); m_fromAddress = new InternetAddress(userName); m_toAddress = new InternetAddress(eRecipient); m_simpleMessage.setFrom(m_fromAddress); m_simpleMessage.setRecipient(RecipientType.TO, m_toAddress); m_simpleMessage.setSubject(eSubject); m_simpleMessage.setContent(eBody, "text/plain"); Transport.send(m_simpleMessage); ``` It works absolutely fine until I obfuscate my code. Emails then fail to send, throwing the error: javax.mail.nosuchproviderexception smtp I've tried various set ups in my proguard.cfg such as: -keep class javax.mail.** { *; } But nothing works. If I turn off the obfuscation, it works fine again. Any ideas why this would be happening? Thanks in advance. EDIT: My Proguard config file ``` -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -verbose -libraryjars "C:\Program Files\Android\android-sdk\platforms\android-15\android.jar" -libraryjars "C:\Documents and Settingslibs\commons-io-2.4.jar" -libraryjars "C:\Documents and Settings\libs\mail.jar" -libraryjars "C:\Documents and Settingslibs\activation.jar" -libraryjars "C:\Documents and Settings\libs\additionnal.jar" -libraryjars "C:\Documents and Settings\libs\dropbox-android-sdk-1.3.1.jar" -libraryjars "C:\Documents and Settings\libs\microsoft-translator-java-api-0.6.1-jar-with-dependencies.jar" -libraryjars "C:\Documents and Settings\pingpongboss-StandOut-5c5cbe9\library\bin\standout.jar" -libraryjars "C:\Documents and Settings\android-uitableview\android-uitableview\bin\br_com_dina_ui.jar" -dontpreverify !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizationpasses 5 -allowaccessmodification -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class com.android.vending.licensing.ILicensingService -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep public class com.winterwell.jgeoplanet.** { public protected *; } -keep public class winterwell.jwitter.** { public protected *; } -keep public class winterwell.json.** { public protected *; } -keep class com.winterwell.** { *; } -keep class winterwell.** { *; } -keep class com.faceture.google.** { *; } -keep class com.faceture.google.play.** { *; } -keep class com.faceture.google.play.domain.** { *; } -keep class com.faceture.http.** { *; } -keep class com.faceture.rest.** { *; } -keep class com.faceture.google.gson.** { *; } -keep class com.google.gson.** { *; } -dontwarn android.support.** -dontwarn org.apache.commons.codec.binary.** -dontwarn org.apache.harmony.awt.** -dontwarn javax.activation.** -dontwarn com.sun.mail.imap.protocol.** -keepattributes Signature -keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.examples.android.model.** { *; } ``` The warnings are removed above due to these errors: ``` Warning: javax.activation.CommandInfo: can't find referenced class java.beans.Beans Warning: com.sun.mail.imap.protocol.IMAPSaslAuthenticator: can't find referenced class javax.security.sasl.Sasl + can't find referenced class javax.security.sasl.SaslClient + can't find referenced class javax.security.sasl.SaslException + can't find referenced class javax.security.auth.callback.NameCallback + can't find referenced class javax.security.sasl.RealmCallback ```

Original source

Related problems