【问题标题】:SMTPTransport sendMessage stuck on connection lossSMTPTransport sendMessage 卡在连接丢失上
【发布时间】:2013-07-02 06:17:12
【问题描述】:

我正在使用 javamail 的 SMTPTransport.sendMessage 方法在我的 android 应用程序中发送电子邮件,一切正常……但是当我开始发送消息时,在中间,我禁用了我的 wifi,它卡住了。我已经等了1个多小时了,还是卡住了;不抛出异常......知道如何处理这种情况吗?

编辑:

我添加了超时

props.put("mail.smtp.connectiontimeout", "3000");
props.put("mail.smtp.timeout", "3000");

似乎不起作用...我已经模拟了连接丢失,现在已经 5 分钟了,它仍然处于发送状态并且没有超时

edit2:

16分钟后发生超时/错误(甚至不确定是否超时)

06-30 18:47:27.722: I/System.out(15906): javax.net.ssl.SSLException: Write error: ssl=0xdf8268: I/O error during system call, Invalid argument

编辑 3:

它并不总是抛出异常......我模拟了连接丢失,1小时后,仍然没有异常......它处于发送状态......并且还没有返回:(

【问题讨论】:

    标签: android jakarta-mail


    【解决方案1】:

    当前版本的 JavaMail 仅处理读取超时,因为这就是 JDK 所支持的全部。对于下一个 JavaMail 版本,我添加了对写入超时的支持。您可以使用 maven.java.net 存储库中提供的 1.5.1-SNAPSHOT 版本的 JavaMail 进行试验。您需要设置“mail.smtp.writetimeout”属性。不知道这是否会对您在 Android 上有所帮助,因为它不是真正的 Java...

    【讨论】:

    • 好的,我会试一试!你能推荐一个好的 smtp.timeout 读取超时值吗?我已将其设置为 3000,即使邮件实际发送成功,我也会收到很多超时错误(来自 smtp 的回复超时并引发错误)
    • 如果您的邮件服务器很忙,3 秒是一个非常短的超时时间。您可能需要进行试验以找出最好的方法。超时应该与您的应用程序可以容忍的一样大,因为它应该只在极少数情况下触发。它不应该基于您希望邮件服务器的速度,或者您认为它应该有多快。
    • 好的,我已将其设置为 5 分钟,因为我几乎每次都收到超时错误
    • 我可以将 setDebug 用于输出流并通过线程监视该流吗?如果流没有输出超过 30 秒,杀死 javamail 发送?知道如何实现这一点,如果这听起来可行?
    • 你可以这样做,但是杀死另一个线程意味着你永远不会知道消息是否真的被发送了。当然,可能存在服务器需要超过 30 秒才能响应的合法情况。我不相信这比使用现有的超时机制更好。
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2021-05-28
    相关资源
    最近更新 更多