2012-10-27 66 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