class Net::POP3
这个库是做什么的?¶ ↑
这个库提供了通过 POP3
(邮局协议版本 3)检索电子邮件的功能。有关 POP3
的详细信息,请参阅 [RFC1939] (www.ietf.org/rfc/rfc1939.txt)。
示例¶ ↑
检索消息¶ ↑
此示例从服务器检索消息并在服务器上删除它们。
消息被写入名为 ‘inbox/1’、‘inbox/2’、……的文件。将 ‘pop.example.com’ 替换为您的 POP3
服务器地址,并将 ‘YourAccount’ 和 ‘YourPassword’ 替换为相应的帐户详细信息。
require 'net/pop' pop = Net::POP3.new('pop.example.com') pop.start('YourAccount', 'YourPassword') # (1) if pop.mails.empty? puts 'No mail.' else i = 0 pop.each_mail do |m| # or "pop.mails.each ..." # (2) File.open("inbox/#{i}", 'w') do |f| f.write m.pop end m.delete i += 1 end puts "#{pop.mails.size} mails popped." end pop.finish # (3)
-
调用
Net::POP3#start
并启动 POP 会话。 -
通过使用
POP3#each_mail
和/或POP3#mails
访问消息。 -
通过调用
POP3#finish
关闭 POP 会话,或者使用start
的块形式。
精简的代码¶ ↑
上面的例子非常冗长。您可以使用一些实用方法来缩短代码。首先,可以使用 Net::POP3.start
的块形式来代替 POP3.new
、POP3#start
和 POP3#finish
。
require 'net/pop' Net::POP3.start('pop.example.com', 110, 'YourAccount', 'YourPassword') do |pop| if pop.mails.empty? puts 'No mail.' else i = 0 pop.each_mail do |m| # or "pop.mails.each ..." File.open("inbox/#{i}", 'w') do |f| f.write m.pop end m.delete i += 1 end puts "#{pop.mails.size} mails popped." end end
POP3#delete_all
是 each_mail
和 delete 的替代方法。
require 'net/pop' Net::POP3.start('pop.example.com', 110, 'YourAccount', 'YourPassword') do |pop| if pop.mails.empty? puts 'No mail.' else i = 1 pop.delete_all do |m| File.open("inbox/#{i}", 'w') do |f| f.write m.pop end i += 1 end end end
这是一个更简短的示例。
require 'net/pop' i = 0 Net::POP3.delete_all('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| File.open("inbox/#{i}", 'w') do |f| f.write m.pop end i += 1 end
内存空间问题¶ ↑
上面所有的例子都将每条消息作为一个大的字符串获取。这个例子避免了这种情况。
require 'net/pop' i = 1 Net::POP3.delete_all('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| File.open("inbox/#{i}", 'w') do |f| m.pop do |chunk| # get a message little by little. f.write chunk end i += 1 end end
使用 APOP
¶ ↑
net/pop 库支持 APOP
身份验证。要使用 APOP
,请使用 Net::APOP
类而不是 Net::POP3
类。您可以使用实用方法 Net::POP3.APOP()
。例如
require 'net/pop' # Use APOP authentication if $isapop == true pop = Net::POP3.APOP($isapop).new('apop.example.com', 110) pop.start('YourAccount', 'YourPassword') do |pop| # Rest of the code is the same. end
使用 ‘UIDL’ POP 命令仅获取选定的邮件¶ ↑
如果您的 POP 服务器提供 UIDL 功能,您可以仅从 POP 服务器获取选定的邮件。例如
def need_pop?( id ) # determine if we need pop this mail... end Net::POP3.start('pop.example.com', 110, 'Your account', 'Your password') do |pop| pop.mails.select { |m| need_pop?(m.unique_id) }.each do |m| do_something(m.pop) end end
POPMail#unique_id()
方法将消息的唯一 ID 作为字符串返回。通常,唯一 ID 是消息的哈希值。
常量
- VERSION
此库的版本
属性
要连接的地址。
等待连接打开的秒数。如果 POP3
对象无法在此时间内打开连接,则会引发 Net::OpenTimeout 异常。默认值为 30 秒。
等待读取一个块(通过一个 read(1) 调用)的秒数。如果 POP3
对象无法在此时间内完成 read(),则会引发 Net::ReadTimeout 异常。默认值为 60 秒。
公共类方法
如果 isapop
为 true,则返回 APOP
类;否则,返回 POP 类。例如
# Example 1 pop = Net::POP3::APOP($is_apop).new(addr, port) # Example 2 Net::POP3::APOP($is_apop).start(addr, port) do |pop| .... end
# File net-pop-0.1.2/lib/net/pop.rb, line 238 def POP3.APOP(isapop) isapop ? APOP : POP3 end
打开一个 POP3
会话,尝试身份验证,然后退出。
如果身份验证失败,此方法会引发 POPAuthenticationError
。
示例:普通 POP3
¶ ↑
Net::POP3.auth_only('pop.example.com', 110, 'YourAccount', 'YourPassword')
示例:APOP
¶ ↑
Net::POP3.auth_only('pop.example.com', 110, 'YourAccount', 'YourPassword', true)
# File net-pop-0.1.2/lib/net/pop.rb, line 305 def POP3.auth_only(address, port = nil, account = nil, password = nil, isapop = false) new(address, port, isapop).auth_only account, password end
从 POP3.ssl_params
返回 :ca_file 或 :ca_path
# File net-pop-0.1.2/lib/net/pop.rb, line 377 def POP3.certs return @ssl_params[:ca_file] || @ssl_params[:ca_path] end
从参数构造正确的参数
# File net-pop-0.1.2/lib/net/pop.rb, line 337 def POP3.create_ssl_params(verify_or_params = {}, certs = nil) begin params = verify_or_params.to_hash rescue NoMethodError params = {} params[:verify_mode] = verify_or_params if certs if File.file?(certs) params[:ca_file] = certs elsif File.directory?(certs) params[:ca_path] = certs end end end return params end
POP3
连接的默认端口,端口 110
# File net-pop-0.1.2/lib/net/pop.rb, line 210 def POP3.default_pop3_port 110 end
POP3S 连接的默认端口,端口 995
# File net-pop-0.1.2/lib/net/pop.rb, line 215 def POP3.default_pop3s_port 995 end
返回 POP3
的端口
# File net-pop-0.1.2/lib/net/pop.rb, line 205 def POP3.default_port default_pop3_port() end
启动一个 POP3
会话并删除服务器上的所有消息。如果给出了块,则在删除每个 POPMail
对象之前,会将其传递给该块。
如果身份验证失败,此方法会引发 POPAuthenticationError
。
示例¶ ↑
Net::POP3.delete_all('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| file.write m.pop end
# File net-pop-0.1.2/lib/net/pop.rb, line 283 def POP3.delete_all(address, port = nil, account = nil, password = nil, isapop = false, &block) start(address, port, account, password, isapop) {|pop| pop.delete_all(&block) } end
禁用所有新实例的 SSL。
# File net-pop-0.1.2/lib/net/pop.rb, line 355 def POP3.disable_ssl @ssl_params = nil end
为所有新实例启用 SSL。params
被传递给 OpenSSL::SSLContext#set_params。
# File net-pop-0.1.2/lib/net/pop.rb, line 332 def POP3.enable_ssl(*args) @ssl_params = create_ssl_params(*args) end
启动一个 POP3
会话并遍历每个 POPMail
对象,将其传递给 block
。此方法等效于
Net::POP3.start(address, port, account, password) do |pop| pop.each_mail do |m| yield m end end
如果身份验证失败,此方法会引发 POPAuthenticationError
。
示例¶ ↑
Net::POP3.foreach('pop.example.com', 110, 'YourAccount', 'YourPassword') do |m| file.write m.pop m.delete if $DELETE end
# File net-pop-0.1.2/lib/net/pop.rb, line 262 def POP3.foreach(address, port = nil, account = nil, password = nil, isapop = false, &block) # :yields: message start(address, port, account, password, isapop) {|pop| pop.each_mail(&block) } end
创建一个新的 POP3
对象。
address
是您的 POP3
服务器的主机名或 IP 地址。
可选的 port
是要连接的端口。
可选的 isapop
指定此连接是否将使用 APOP
身份验证;默认为 false
。
此方法不打开 TCP 连接。
# File net-pop-0.1.2/lib/net/pop.rb, line 417 def initialize(addr, port = nil, isapop = false) @address = addr @ssl_params = POP3.ssl_params @port = port @apop = isapop @command = nil @socket = nil @started = false @open_timeout = 30 @read_timeout = 60 @debug_output = nil @mails = nil @n_mails = nil @n_bytes = nil end
返回 SSL 参数
另请参阅 POP3.enable_ssl
# File net-pop-0.1.2/lib/net/pop.rb, line 362 def POP3.ssl_params return @ssl_params end
创建一个新的 POP3
对象并打开连接。等效于
Net::POP3.new(address, port, isapop).start(account, password)
如果提供了 block
,则将新打开的 POP3
对象传递给它,并在会话结束时自动关闭它。
示例¶ ↑
Net::POP3.start(addr, port, account, password) do |pop| pop.each_mail do |m| file.write m.pop m.delete end end
# File net-pop-0.1.2/lib/net/pop.rb, line 401 def POP3.start(address, port = nil, account = nil, password = nil, isapop = false, &block) # :yield: pop new(address, port, isapop).start(account, password, &block) end
如果设置了 POP3.ssl_params
,则返回 true
# File net-pop-0.1.2/lib/net/pop.rb, line 367 def POP3.use_ssl? return !@ssl_params.nil? end
从 POP3.ssl_params
返回是否启用了 verify_mode
# File net-pop-0.1.2/lib/net/pop.rb, line 372 def POP3.verify return @ssl_params[:verify_mode] end
公共实例方法
此实例是否使用 APOP
身份验证?
# File net-pop-0.1.2/lib/net/pop.rb, line 436 def apop? @apop end
启动一个 pop3 会话,尝试身份验证,然后退出。在 POP3
会话打开时,不得调用此方法。如果身份验证失败,此方法会引发 POPAuthenticationError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 314 def auth_only(account, password) raise IOError, 'opening previously opened POP session' if started? start(account, password) { ; } end
删除服务器上的所有消息。
如果使用块调用,则会在删除每个消息之前依次将其传递给该块。
示例¶ ↑
n = 1 pop.delete_all do |m| File.open("inbox/#{n}") do |f| f.write m.pop end n += 1 end
如果发生错误,此方法会引发 POPError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 690 def delete_all # :yield: message mails().each do |m| yield m if block_given? m.delete unless m.deleted? end end
禁用所有新实例的 SSL。
# File net-pop-0.1.2/lib/net/pop.rb, line 463 def disable_ssl @ssl_params = nil end
依次将每条消息传递给传入的块。等效于
pop3.mails.each do |popmail| .... end
如果发生错误,此方法会引发 POPError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 668 def each_mail(&block) # :yield: message mails().each(&block) end
为此实例启用 SSL。必须在建立连接之前调用此方法才能生效。 params[:port]
是建立 SSL 连接的端口;默认为 995。params
(除了 :port)被传递给 OpenSSL::SSLContext#set_params。
# File net-pop-0.1.2/lib/net/pop.rb, line 452 def enable_ssl(verify_or_params = {}, certs = nil, port = nil) begin @ssl_params = verify_or_params.to_hash.dup @port = @ssl_params.delete(:port) || @port rescue NoMethodError @ssl_params = POP3.create_ssl_params(verify_or_params, certs) @port = port || @port end end
结束一个 POP3
会话并关闭 TCP 连接。
# File net-pop-0.1.2/lib/net/pop.rb, line 589 def finish raise IOError, 'POP session not yet started' unless started? do_finish end
提供类状态的人类可读的字符串表示。
# File net-pop-0.1.2/lib/net/pop.rb, line 468 def inspect +"#<#{self.class} #{@address}:#{@port} open=#{@started}>" end
用于 msg
的调试输出
# File net-pop-0.1.2/lib/net/pop.rb, line 715 def logging(msg) @debug_output << msg + "\n" if @debug_output end
返回一个 Net::POPMail
对象的数组,表示服务器上的所有消息。当会话重新启动时,此数组会被更新;否则,它会在第一次直接或间接调用此方法时从服务器获取并缓存。
如果发生错误,此方法会引发 POPError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 646 def mails return @mails.dup if @mails if n_mails() == 0 # some popd raises error for LIST on the empty mailbox. @mails = [] return [] end @mails = command().list.map {|num, size| POPMail.new(num, size, self, command()) } @mails.dup end
返回 POP 服务器上所有消息的总大小(以字节为单位)。
# File net-pop-0.1.2/lib/net/pop.rb, line 634 def n_bytes return @n_bytes if @n_bytes @n_mails, @n_bytes = command().stat @n_bytes end
返回 POP 服务器上的消息数量。
# File net-pop-0.1.2/lib/net/pop.rb, line 627 def n_mails return @n_mails if @n_mails @n_mails, @n_bytes = command().stat @n_mails end
要连接的端口号。
# File net-pop-0.1.2/lib/net/pop.rb, line 493 def port return @port || (use_ssl? ? POP3.default_pop3s_port : POP3.default_pop3_port) end
设置读取超时。
# File net-pop-0.1.2/lib/net/pop.rb, line 508 def read_timeout=(sec) @command.socket.read_timeout = sec if @command @read_timeout = sec end
重置会话。这会清除消息中的所有“已删除”标记。
如果发生错误,此方法会引发 POPError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 700 def reset command().rset mails().each do |m| m.instance_eval { @deleted = false } end end
启动一个 POP3
会话。
当使用块调用时,会向块提供一个 POP3
对象,并在块调用完成后关闭会话。
如果身份验证失败,此方法会引发 POPAuthenticationError
。
# File net-pop-0.1.2/lib/net/pop.rb, line 526 def start(account, password) # :yield: pop raise IOError, 'POP session already started' if @started if block_given? begin do_start account, password return yield(self) ensure do_finish end else do_start account, password return self end end
如果 POP3
会话已启动,则为 true
。
# File net-pop-0.1.2/lib/net/pop.rb, line 514 def started? @started end
此实例是否使用 SSL?
# File net-pop-0.1.2/lib/net/pop.rb, line 441 def use_ssl? return !@ssl_params.nil? end