Java 邮件在 Marshmallow 及以上版本失败,但在 Lollipop 及以下版本成功
Java mail fails on Marshmallow and above, but succeeds on Lollipop and below
我构建了一个应用程序,通过 Java 邮件 API 发送短信,并得到 this 的指导。它适用于我的 android 5.0.2 phone。但是当我在 android 6 或更高版本上部署它时,它总是无法通过身份验证。
与上述指南相比,邮件设置没有特别的变化。我列出其中一些以供参考。
public MailSender(String user, String password, String mailhost) {
this.user = user;
this.password = password;
Log.i("SMTP_mail", mailhost);
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.password", password);
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
session = Session.getDefaultInstance(props, this);
session.setDebug(true);
}
此外,我在运行时使用来自 API 23 的新请求添加了权限检查。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.INTERNET},
4);
}
而AndroidManifest.xml如下:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在调试指南的帮助下 JavaMail,我收集了成功和失败的日志。
成功 Android 5:
Android6 失败:
除了平台不同,这两个日志的app代码是一样的。
我还注意到在 android 6 日志中看到了一些证书失败,但从 stackoverview 搜索来看,这似乎没什么大不了的。我不确定它是否有任何影响。
E/NativeCrypto: ssl=0x7ba1e98480 cert_verify_callback x509_store_ctx=0x7ba1cfbc98 arg=0x0
ssl=0x7ba1e98480 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
I/System.out: gba_cipher_suite:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
有人可以帮忙解决这个问题吗?这困扰了我好几天。非常感谢您的帮助。
将 INTERNET 权限添加到您的清单文件。
您必须添加这一行:
<uses-permission android:name="android.permission.INTERNET" />
在您的 AndroidManifest.xml
中的应用程序标签之外
终于知道报“535 5.7.1 Authentication failed”的原因了。因为魅族Note3(m3 note)预装了Flyme 6.3.0.2A,所以出乎意料。改成google ime 再次输入密码后,邮箱就可以正常使用了。由于这个原因,花费了大量时间进行故障排除并以如此棘手的小点结束,真是令人难过。
感谢大家对这张票的评论和建议。
我构建了一个应用程序,通过 Java 邮件 API 发送短信,并得到 this 的指导。它适用于我的 android 5.0.2 phone。但是当我在 android 6 或更高版本上部署它时,它总是无法通过身份验证。 与上述指南相比,邮件设置没有特别的变化。我列出其中一些以供参考。
public MailSender(String user, String password, String mailhost) {
this.user = user;
this.password = password;
Log.i("SMTP_mail", mailhost);
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.password", password);
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
session = Session.getDefaultInstance(props, this);
session.setDebug(true);
}
此外,我在运行时使用来自 API 23 的新请求添加了权限检查。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.INTERNET},
4);
}
而AndroidManifest.xml如下:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在调试指南的帮助下 JavaMail,我收集了成功和失败的日志。
成功 Android 5:
Android6 失败:
除了平台不同,这两个日志的app代码是一样的。
我还注意到在 android 6 日志中看到了一些证书失败,但从 stackoverview 搜索来看,这似乎没什么大不了的。我不确定它是否有任何影响。
E/NativeCrypto: ssl=0x7ba1e98480 cert_verify_callback x509_store_ctx=0x7ba1cfbc98 arg=0x0 ssl=0x7ba1e98480 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
I/System.out: gba_cipher_suite:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
有人可以帮忙解决这个问题吗?这困扰了我好几天。非常感谢您的帮助。
将 INTERNET 权限添加到您的清单文件。
您必须添加这一行:
<uses-permission android:name="android.permission.INTERNET" />
在您的 AndroidManifest.xml
中的应用程序标签之外终于知道报“535 5.7.1 Authentication failed”的原因了。因为魅族Note3(m3 note)预装了Flyme 6.3.0.2A,所以出乎意料。改成google ime 再次输入密码后,邮箱就可以正常使用了。由于这个原因,花费了大量时间进行故障排除并以如此棘手的小点结束,真是令人难过。
感谢大家对这张票的评论和建议。