2012-10-27 23 views
2

我用下面的代码来发送电子邮件在我的Android应用程序:javax.mail.nosuchproviderexception SMTP

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); 

它,直到我混淆我的代码工作绝对没问题。电子邮件然后发送失败,引发错误:javax.mail.nosuchproviderexception SMTP

我试着在我proguard.cfg各种设置窗口,如:-keep类javax.mail ** {*; }

但没有任何工作。如果我关闭混淆,它会再次正常工作。

任何想法,为什么会发生这种情况?

在此先感谢。

编辑:我的Proguard的配置文件

-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.** { *; } 

的警告上述删除,由于这些错误:

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 
+0

你在做什么来混淆你的代码? – deefactorial

+0

没有什么特别之处......标准Proguard建议的配置有一些补充。我以正常的方式引用Jars。有什么具体的你的意思?谢谢 – brandall

+0

对我来说,听起来像你的改变正在做出导致错误的改变,而不知道它们是什么,我不能对它们做很多事情。 – deefactorial

回答

6

我解决了这个问题,包括下面详细介绍的额外的Proguard配置。我从this answer得到了更多信息。

-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.** {*;} 
1

我不知道Proguard的是什么,但它听起来像它将类文件从mail.jar中提取出来并添加到jar中。不幸的是,它不包括mail.jar文件中的配置文件。您需要mail.jar文件中的META-INF文件。或者更好的是,不要重新包装mail.jar,直接使用它。

+0

感谢您的回复。我不重新包装mail.jar,我使用它,因为它来自此链接https://code.google.com/p/javamail-android/downloads/list - 因此,所有内容都应保持引用。 – brandall

0

通常由于错误的“mail.jar”而发生此错误。

解决方案:

1]检查 “的mail.jar” 是在类路径中。

2]如果它存在于类路径中,请检查最新版本的“mail.jar”,然后将其包含在您的类路径中。

您可以检查并下载从最新的版本,

http://www.oracle.com/technetwork/java/index-138643.html