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