【问题标题】:Java mail fails on Marshmallow and above, but succeeds on Lollipop and belowJava 邮件在 Marshmallow 及更高版本上失败,但在 Lollipop 及更低版本上成功
【发布时间】:2019-04-21 15:16:58
【问题描述】:

我构建了一个 APP,通过 Java 邮件 API 发送短信,并带有来自 this 的指南。它适用于我的 android 5.0.2 手机。但是当我将它部署在 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 上的成功:

Android 6 失败:

这两个日志的应用代码相同,只是平台不同。
我还注意到在 android 6 日志上看到了一些证书失败,但从 stackoverview 搜索来看,这似乎没什么大不了的。我不确定它是否会影响任何事情。

E/NativeCrypto:ssl=0x7ba1e98480 cert_verify_callback x509_store_ctx=0x7ba1cfbc98 arg=0x0 ssl=0x7ba1e98480 cert_verify_callback 调用 verifyCertificateChain authMethod=ECDHE_RSA
I/System.out: gba_cipher_suite:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

有人可以帮忙解决这个问题吗?它困扰了我好几天。非常感谢您的帮助。

【问题讨论】:

  • 您的清单中有互联网权限吗?
  • 我不太明白你的问题。你想从你的安卓应用发送邮件吗?
  • 您使用的是旧版本的 JavaMail,并且上面的调试输出暴露了您的(编码但未加密的)密码,请立即更改您的密码!然后升级到官方JavaMail for Android,如果仍然失败,请更新您的帖子。虽然,我不明白为什么它会解决问题,因为它似乎是拒绝您的登录尝试的服务器,但无论如何您都应该升级。
  • 非常感谢@Bill Shannon 的提醒。我更改了密码。但是对于这个应用程序,它需要支持像android 4.0这样的旧android手机。最新的 Java 邮件至少需要 android 4.4。对于服务器拒绝,我很好奇为什么它在 android 5 上成功但在 android 6 上失败了。还有其他方法可以帮助继续排除故障吗?
  • 是服务器拒绝了您的登录尝试。调试输出中没有任何内容表明它可能拒绝它的原因。可能是导致它的较低级别的网络问题。也许使用的 SSL/TLS 参数有所不同?也许密码是在两个网络数据包而不是一个网络数据包中发送的,这会触发服务器中的错误?如果没有来自服务器端的更多信息,很难说。尝试使用不同的服务器来确定问题是否特定于 smtp.mail.yahoo.com。

标签: android smtp jakarta-mail


【解决方案1】:

终于知道报“535 5.7.1 Authentication failed”的原因了。出乎意料的是,魅族Note3(m3 note)设备预装了Flyme 6.3.0.2A的ime。在我更改为 google ime 并再次输入密码后,电子邮件可以成功运行。由于这个原因,我们花费了大量时间进行故障排除并以一个如此棘手的小点结束,这令人非常难过。

感谢大家对这张票的 cmets 和建议。

【讨论】:

    【解决方案2】:

    INTERNET 权限添加到您的清单文件。

    你必须添加这一行:

    <uses-permission android:name="android.permission.INTERNET" /> 
    

    在您的 AndroidManifest.xml 中的应用程序标记之外

    【讨论】:

    • 谢谢,尼基尔。我也在 AndroidManifest.xml 中添加它。它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多