【问题标题】:Android Studio VerifyError rejecting class text_plain from JavaMail APIAndroid Studio VerifyError 拒绝来自 JavaMail API 的类 text_plain
【发布时间】:2021-02-15 09:48:44
【问题描述】:

我正在开发一个应用程序,允许用户通过发送电子邮件与我联系(用户只输入消息,发件人和收件人电子邮件都是我的)。我正在尝试使用 JavaMail API 用 gmail 实现这一点。但是,我在Transport.send(mimeMessage) 行中不断收到此错误。

以下是错误消息:

引起:java.lang.VerifyError:拒绝类 com.sun.mail.handlers.text_plain 尝试子类型错误类 com.sun.mail.handlers.handler_base('com.sun.mail. handlers.text_plain' 出现在 /data/app/~~T_TRkO9R_v9j4iEdr4K9Yg==/com.example.compusec-dPeAL8DtGJvU45dJpt8xxA==/base.apk)

原因:java.lang.VerifyError: Verifier denied class com.sun.mail.handlers.handler_base: java.awt.datatransfer.DataFlavor[] com.sun.mail.handlers.handler_base.getTransferDataFlavors() 验证失败: java.awt.datatransfer.DataFlavor[] com.sun.mail.handlers.handler_base.getTransferDataFlavors(): [0x4] 无法解析返回的类型“未解决的参考:java.awt.datatransfer.DataFlavor[]”或“参考” : javax.activation.ActivationDataFlavor[]'('com.sun.mail.handlers.handler_base'的声明出现在/data/app/~~T_TRkO9R_v9j4iEdr4K9Yg==/com.example.compusec-dPeAL8DtGJvU45dJpt8xxA==/base.apk)

这是我的代码:

    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'
}

【问题讨论】:

  • 我已将此作为错误报告给 Google。这是链接issuetracker.google.com/issues/172544275 继续链接并为问题加注星标 - 这会让 Google 知道您受到它的影响,并希望它会更快得到解决。
  • @gbotha 已加星标。希望尽快解决。

标签: java android email jakarta-mail verifyerror


【解决方案1】:

我也有同样的问题。我可以告诉你的是,如果你以 Android 10 及更低版本(SDK 29 或更低版本)为目标,它可以正常工作。我已经使用它多年了。但是,一旦我以 Android 11 (SDK 30) 为目标,就会收到此错误。我的猜测是 com.sun.mail 依赖项需要更新。我正在使用最新的 1.6.5,但仍然无法正常工作。所以我建议现在针对 SDK 29 看看是否有帮助。

【讨论】:

  • 幸运的是,我的目标是 Android 10 并将 SDK 降低到 29 效果很好!非常感谢:)
  • 我在 2 天前提交了一个 Android 错误,并一直在与 Google 交谈。他们说这是 Android 11 的预期行为,需要用我们的代码进行修改,但他们还不太清楚要做什么。您可以在issuetracker.google.com/issues/172544275 此处查看提交的错误问题并加注星标以表明您受到影响,还可以添加您自己的 cmets。
  • 我还可以确认降低到 29 是有效的。
【解决方案2】:

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'
    ...
}

感谢this 问题上的最后几个 cmets

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2021-02-27
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多