Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby SSL_写入:错误写入重试。例外。在IMAP空闲时读取电子邮件。红宝石色_Ruby_Email_Gmail_Imap_Gmail Imap - Fatal编程技术网

Ruby SSL_写入:错误写入重试。例外。在IMAP空闲时读取电子邮件。红宝石色

Ruby SSL_写入:错误写入重试。例外。在IMAP空闲时读取电子邮件。红宝石色,ruby,email,gmail,imap,gmail-imap,Ruby,Email,Gmail,Imap,Gmail Imap,我希望“尽快”收到看不见的邮件,使用Ruby(2.1)脚本实现IMAP IDLE(“推送通知”)功能 在一些人的帮助下(另请参见:),我在这里编写了脚本: 现在,乍一看,一切都很顺利,但我有一个例外 出现错误:SSL\U写入:错误写入重试 在代码中的这一行: 当我让脚本运行超过。。。说超过30分钟 顺便说一句,服务器是imap.gmail.com(arghh…),我猜是与imap空闲重新连接套接字有关的(我还没有阅读ruby UMAP库代码),但我不理解异常的原因 如果有例外,你知道原因吗?

我希望“尽快”收到看不见的邮件,使用Ruby(2.1)脚本实现IMAP IDLE(“推送通知”)功能

在一些人的帮助下(另请参见:),我在这里编写了脚本:

现在,乍一看,一切都很顺利,但我有一个例外

出现错误:SSL\U写入:错误写入重试

在代码中的这一行:

当我让脚本运行超过。。。说超过30分钟

顺便说一句,服务器是imap.gmail.com(arghh…),我猜是与imap空闲重新连接套接字有关的(我还没有阅读ruby UMAP库代码),但我不理解异常的原因

如果有例外,你知道原因吗?只是捕获异常来解决问题

谢谢 乔治

更新

我对异常处理做了一些修改(请参见要点代码:)

现在我关闭了一个
Net::IMAP::Error连接
我刚刚重新启动了IMAP连接,它似乎正在工作。。。
抱歉搞混了,总之,欢迎对我编写的代码、空闲协议正确管理发表任何评论

IMAP IDLE RFC要求在最多29分钟后停止IDLE,并重新发出新的IDLE命令。允许IMAP服务器假定客户端已死亡,并且在31分钟不活动后已离开


你也可能会发现一些NAT中间包在半小时结束之前就悄悄地破坏了你的连接,我已经看到了大约两分钟的超时。(每次我看到这样的情况,我都会大喊“vivat ipv6!”)我认为这些中间包没有什么好的解决方案,除了可能用恶意特洛伊木马感染它们,但坏的解决方案包括如果在半小时之前出现SSL异常,则调整空闲超时。

是的。。。就imap.gmail.com服务器而言,我在将近1小时内测试了一次断开连接的情况(请参阅原始问题中的更新注释)。我不知道29分钟RFC指南。现在我明白了为什么有人会做类似于
Thread.start{loop{imap.idle\u done;sleep 600}
的事情,所以每10分钟重新开始一次空闲。。。谢谢
def idle_loop(imap, search_condition, folder)
  # https://stackoverflow.com/questions/4611716/how-imap-idle-works
  loop do
    begin
      imap.select folder
      imap.idle do |resp|

        #trap_shutdown

        # You'll get all the things from the server. 
        #For new emails you're only interested in EXISTS ones
        if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS"

          # Got something. Send DONE. This breaks you out of the blocking call
          imap.idle_done
        end
      end

      # We're out, which means there are some emails ready for us.
      # Go do a search for UNSEEN and fetch them.
      retrieve_emails(imap, search_condition, folder) { |mail| process_email mail}

    #rescue Net::IMAP::Error => imap_err
      # Socket probably timed out
    #  puts "IMAP IDLE socket probably timed out.".red

    rescue SignalException => e
      # https://stackoverflow.com/questions/2089421/capturing-ctrl-c-in-ruby
      puts "Signal received at #{time_now}: #{e.class} #{e.message}".red      
      shutdown imap

    rescue Exception => e
      puts "Something went wrong at #{time_now}: #{e.class} #{e.message}".red
      imap.noop
    end
  end
end