Net::IMAP 失败:连接已关闭
Net::IMAP fails: Connection Closed
当我尝试打开与我的 Office 365 服务的连接时,它失败了:
2.2.0 :001 > require 'net/imap'
=> true
2.2.0 :002 > port = '993'
=> "993"
2.2.0 :003 > imap = Net::IMAP.new('outlook.office365.com', port)
Net::IMAP::Error: connection closed
from /Users/cameronaziz/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/net/imap.rb:1077:in `initialize'
from (irb):3:in `new'
from (irb):3
我还需要设置什么?
这是我控制器中的代码:
require 'net/imap'
port = '993'
imap = Net::IMAP.new('outlook.office365.com', port)
imap.authenticate('LOGIN', '***@***.com', '***')
imap.examine('INBOX')
在我实际设置用户名/密码之前,new
命令(与控制台相同)失败。
~~~~~~~
设置 :ssl => true
有效。但是现在我仍然无法连接,因为我得到:
控制器:
imap = Net::IMAP.new('outlook.office365.com', {:port => '993', :ssl => true } )
imap.authenticate('LOGIN', '***@***.com', '***')
视图错误:
Net::IMAP::BadResponseError in EmailsController#connect
Command Argument Error. 11
并且视图中突出显示的行现在位于 authenticate
方法行上。
当我运行imap.capability
:
["IMAP4", "IMAP4REV1", "AUTH=PLAIN", "AUTH=XOAUTH2", "SASL-IR", "UIDPLUS", "ID", "UNSELECT", "CHILDREN", "IDLE", "NAMESPACE", "LITERAL+"]
IMAP 可能正在关闭连接,因为您没有及时(或根本没有)进行身份验证。
您应该使用 Net::IMAP#login
或 Net::IMAP#authenticate
方法进行身份验证。
来自the docs:
imap.authenticate('LOGIN', 'username', password)
这也应该有效:
imap.login('username', 'password')
请记住,LOGIN
可能不是您所用的身份验证方法。您可能需要先调用 imap.capability
并确定是继续 LOGIN
还是 CRAM-MD5
。
端口 993 通常是通过 SSL IMAP 连接的方式,因此您需要告诉 ruby 您需要通过 SSL 连接,例如:
imap = Net::IMAP.new('outlook.office365.com', 993, ssl: true)
然后您可以使用登录或身份验证连接到您的用户邮箱。
ruby doc 声明如果您使用身份验证方法,您需要确保 imap 服务器可以支持 "LOGIN" 或 "CRAM-MD5" 但在您提供的列表中我不支持看看其中的任何一个。
["IMAP4", "IMAP4REV1", "AUTH=PLAIN", "AUTH=XOAUTH2", "SASL-IR", "UIDPLUS", "ID", "UNSELECT", "CHILDREN", "IDLE", "NAMESPACE", "LITERAL+"]
所以登录 outlook imap 的唯一方法是使用 map.login 方法,例如:
imap.login(login, password
)
当我尝试打开与我的 Office 365 服务的连接时,它失败了:
2.2.0 :001 > require 'net/imap'
=> true
2.2.0 :002 > port = '993'
=> "993"
2.2.0 :003 > imap = Net::IMAP.new('outlook.office365.com', port)
Net::IMAP::Error: connection closed
from /Users/cameronaziz/.rvm/rubies/ruby-2.2.0/lib/ruby/2.2.0/net/imap.rb:1077:in `initialize'
from (irb):3:in `new'
from (irb):3
我还需要设置什么?
这是我控制器中的代码:
require 'net/imap'
port = '993'
imap = Net::IMAP.new('outlook.office365.com', port)
imap.authenticate('LOGIN', '***@***.com', '***')
imap.examine('INBOX')
在我实际设置用户名/密码之前,new
命令(与控制台相同)失败。
~~~~~~~
设置 :ssl => true
有效。但是现在我仍然无法连接,因为我得到:
控制器:
imap = Net::IMAP.new('outlook.office365.com', {:port => '993', :ssl => true } )
imap.authenticate('LOGIN', '***@***.com', '***')
视图错误:
Net::IMAP::BadResponseError in EmailsController#connect
Command Argument Error. 11
并且视图中突出显示的行现在位于 authenticate
方法行上。
当我运行imap.capability
:
["IMAP4", "IMAP4REV1", "AUTH=PLAIN", "AUTH=XOAUTH2", "SASL-IR", "UIDPLUS", "ID", "UNSELECT", "CHILDREN", "IDLE", "NAMESPACE", "LITERAL+"]
IMAP 可能正在关闭连接,因为您没有及时(或根本没有)进行身份验证。
您应该使用 Net::IMAP#login
或 Net::IMAP#authenticate
方法进行身份验证。
来自the docs:
imap.authenticate('LOGIN', 'username', password)
这也应该有效:
imap.login('username', 'password')
请记住,LOGIN
可能不是您所用的身份验证方法。您可能需要先调用 imap.capability
并确定是继续 LOGIN
还是 CRAM-MD5
。
端口 993 通常是通过 SSL IMAP 连接的方式,因此您需要告诉 ruby 您需要通过 SSL 连接,例如:
imap = Net::IMAP.new('outlook.office365.com', 993, ssl: true)
然后您可以使用登录或身份验证连接到您的用户邮箱。
ruby doc 声明如果您使用身份验证方法,您需要确保 imap 服务器可以支持 "LOGIN" 或 "CRAM-MD5" 但在您提供的列表中我不支持看看其中的任何一个。
["IMAP4", "IMAP4REV1", "AUTH=PLAIN", "AUTH=XOAUTH2", "SASL-IR", "UIDPLUS", "ID", "UNSELECT", "CHILDREN", "IDLE", "NAMESPACE", "LITERAL+"]
所以登录 outlook imap 的唯一方法是使用 map.login 方法,例如:
imap.login(login, password
)