我有一项服务,我需要用户通过IMAP访问他的电子邮件。
我需要用户提供user_name
,password
,address
和port
。
我还需要知道IMAP连接是否使用SSL(enable_ssl
可以是true
或false
),我宁愿不要问我的用户。因为他可能不知道。
是否可以向邮件服务器查询是否使用SSL?
到目前为止我的解决方案已经尝试了两个选项。首先我尝试连接SSL,然后 - 如果失败 - 我尝试连接没有SSL。但是当我这样做时,一些邮件服务器会被淘汰,可能是因为第一次失败的连接因某种原因仍然打开。
这是我的工作(但笨拙)实施。
require 'net/imap'
class ImapMailss
def self.test_connection(address, port, enable_ssl, user_name, password)
imap = Net::IMAP.new(address, port, enable_ssl)
imap.login(user_name, password)
flags = imap.list("", "*")
end
end
enable_ssl == nil
# First I try to connect with SSL
begin
true_test = ImapMailss.test_connection(address, port, true, user_name, password)
if true_test.class.to_s == "Array" # If the mailserver allows me access I get an array of folders like e.g.: [#<struct Net::IMAP::MailboxList attr=[:Hasnochildren], delim="/", name="Feedback requests">, #<struct Net::IMAP::MailboxList attr=[:Hasnochildren], delim="/", name="INBOX">, #<struct Net::IMAP::MailboxList attr=[:Haschildren, :Noselect], delim="/", name="[Gmail]">, #<struct Net::IMAP::MailboxList attr=[:Hasnochildren, :Sent], delim="/", name="[Gmail]/Sent Mail">]
enable_ssl = true
end
rescue => e
true_error = e
end
# Then I try to connect without SSL
if enable_ssl == nil
begin
false_test = ImapMails.test_connection(address, port, false, user_name, password)
if false_test.class.to_s == "Array"
enable_ssl = false
end
rescue => e
false_error = e
end
end