我正在开发一个应用程序,允许用户通过发送电子邮件与我联系(用户只输入消息,发送者和接收者的电子邮件都是我的)。我试图使用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'
}
3条答案
按热度按时间mzmfm0qo1#
在
build.gradle
中 使用 此 函数 :中 的 每 一 个
感谢 对 这个 问题 最 后 几 点 评论
hmtdttj42#
我也有同样的问题。我可以告诉你的是,如果你的目标是Android 10及更低版本(SDK 29或更低)它工作得很好。我已经用了很多年了。但是,只要我瞄准Android 11(SDK 30)然后我得到这个错误。我的猜测是com.sun.mail的依赖关系需要更新。我用的是最新的1.6.5,仍然不工作。因此,我建议现在以SDK 29为目标,看看是否有帮助。
hi3rlvi23#
我的答案here,与其他答案一致(正如那个答案所解释的),确实提供了一个解决方案(我将跳到这里的内容,细节可以在那里阅读);
问题:
API级别30添加了一个新的(验证器)功能,用于验证所有引用的代码是否确实存在--否则构建失败。
解决方法:
1.如果您是通过
/app/libs/mail.jar
、/app/libs/activation.jar
和/app/libs/additionnal.jar
手动提供这些库-您可以继续并删除它们;google()
和maven()
存储库在Android项目中都是启用的,最新的deps在那里可用。它们包括新的META-INF文件,所以当我们更新deps时,我们还需要从构建中删除它们;/build.gradle
):*/app/build.gradle
):*就是这样,问题在API级别30上解决了--而且再也不用到处拖
.jar
文件了(如果你是的话)。