android 从JavaMail API拒绝类别text_plain时发生验证错误

bvjxkvbb  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(118)

我正在开发一个应用程序,允许用户通过发送电子邮件与我联系(用户只输入消息,发送者和接收者的电子邮件都是我的)。我试图使用JavaMail API通过gmail实现这一点。但是,我在Transport.send(mimeMessage)行一直收到此错误。
以下是错误消息:
原因:java.lang.验证错误:拒绝尝试子类型化错误类com.sun.mail. handlers.handler_base的类com.sun.mail.handlers. text_plain(“com.sun.mail.handlers.text_plain”的声明出现在/data/app/~~T_TRkO9R_v9j4iEdr4K9Yg==/com.example. compusec-dPeAL 8DtGJvU 45 dJpt 8xxA ==/base.apk中)
原因:java.lang.验证错误:验证程序拒绝了类com.sun.mail.handlers.handler_base:无法验证以下内容:数据类型:[0x 4]无法解析返回的类型“未解析的引用:数据类型[]“或”引用:(“com.sun.mail.handlers.handler_base”的声明出现在/data/app/中)
下面是我的代码:

protected Void doInBackground(Void... voids) {
    Properties properties = new Properties();
    properties.put("mail.smtp.host", "smtp.gmail.com");
    properties.put("mail.smtp.socketFactory.port", "465");
    properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.port", "465");

    session = javax.mail.Session.getInstance(properties, new javax.mail.Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication(){
            return new PasswordAuthentication("sender@gmail.com","senderpass");
        }
    });

    session.setDebug(true);

    MimeMessage mimeMessage = new MimeMessage(session);
    try {
        mimeMessage.setFrom(new InternetAddress("sender@gmail.com"));
        mimeMessage.addRecipients(Message.RecipientType.TO, String.valueOf(new InternetAddress(email)));
        mimeMessage.setSubject(subject);
        mimeMessage.setText(message);
        Transport.send(mimeMessage);
    } catch (MessagingException e) {
        e.printStackTrace();
    }

    return null;
}

Gradle脚本:

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    packagingOptions {
        pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
    }

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

repositories {
    jcenter()
    maven {
        url "https://maven.java.net/content/groups/public/"
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    compile 'com.sun.mail:android-mail:1.6.2'
    compile 'com.sun.mail:android-activation:1.6.2'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
mzmfm0qo

mzmfm0qo1#

build.gradle 中 使用 此 函数 :

android {
    ...
    packagingOptions {
        exclude 'META-INF/NOTICE.md'
        exclude 'META-INF/LICENSE.md'
    }
}

dependencies {
    implementation 'com.sun.mail:android-mail:1.6.6'
    implementation 'com.sun.mail:android-activation:1.6.6'
    ...
}

中 的 每 一 个
感谢 对 这个 问题 最 后 几 点 评论

hmtdttj4

hmtdttj42#

我也有同样的问题。我可以告诉你的是,如果你的目标是Android 10及更低版本(SDK 29或更低)它工作得很好。我已经用了很多年了。但是,只要我瞄准Android 11(SDK 30)然后我得到这个错误。我的猜测是com.sun.mail的依赖关系需要更新。我用的是最新的1.6.5,仍然不工作。因此,我建议现在以SDK 29为目标,看看是否有帮助。

hi3rlvi2

hi3rlvi23#

我的答案here,与其他答案一致(正如那个答案所解释的),确实提供了一个解决方案(我将跳到这里的内容,细节可以在那里阅读);
问题:
API级别30添加了一个新的(验证器)功能,用于验证所有引用的代码是否确实存在--否则构建失败。
解决方法:
1.如果您是通过/app/libs/mail.jar/app/libs/activation.jar/app/libs/additionnal.jar手动提供这些库-您可以继续并删除它们; google()maven()存储库在Android项目中都是启用的,最新的deps在那里可用。它们包括新的META-INF文件,所以当我们更新deps时,我们还需要从构建中删除它们;

  • 添加到您的项目级gradle文件(/build.gradle):*
buildscript {
    ext {
        // ...
        java_mail_version = "1.6.7"
    }
    // ...
}

// ...
  • 添加到您的应用/模块级gradle文件(/app/build.gradle):*
//...
android {
    // ...
    packagingOptions {
        resources {
            excludes += '/META-INF/{AL2.0,LGPL2.1}'
            excludes += '/META-INF/{NOTICE.md,LICENSE.md}' // <-- This line
        }
    }
}
    // ...
dependencies {
    // ...

    // Dumb Email Sending
    implementation "com.sun.mail:android-mail:$java_mail_version"

    // REMOVE THESE - DEPS WILL DOWNLOAD AUTOMATICALLY
    //implementation 'com.sun.mail:android-activation:1.6.7' // from 1.6.4
    //implementation 'com.sun.mail:android-additionnal:1.6.7' // from 1.6.4
}

// ...

就是这样,问题在API级别30上解决了--而且再也不用到处拖.jar文件了(如果你是的话)。

相关问题