class Net::POP3
Что представляет собой эта библиотека?
Эта библиотека предоставляет функциональность для получения электронной почты через POP3, протокол Post Office Protocol версии 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. -
Закройте сеанс POP, вызвав
POP3#finishили используйте блочную формуstart.
Укороченный код
Приведенный выше пример довольно подробный. Вы можете сократить код, используя некоторые вспомогательные методы. Во-первых, вместо POP3.new, POP3#start и POP3#finish можно использовать блочную форму Net::POP3.start.
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 и удалению.
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
Получение только выбранных сообщений с помощью команды POP 'UIDL'
Если ваш 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() возвращает уникальный идентификатор сообщения как String. Обычно уникальный идентификатор является хешем сообщения.
Константы
- Revision
-
номер SVN этой библиотеки
- VERSION
Атрибуты
Адрес для подключения.
Секунды ожидания открытия соединения. Если объект POP3 не может открыть соединение в течение этого времени, он вызывает исключение Net::OpenTimeout. Значение по умолчанию — 30 секунд.
Секунды ожидания чтения одного блока (одним вызовом read(1)). Если объект POP3 не может завершить чтение в течение этого времени, он вызывает исключение Net::ReadTimeout. Значение по умолчанию — 60 секунд.
Методы публичного класса
# File lib/net/pop.rb, line 239 def POP3.APOP(isapop) isapop ? APOP : POP3 end
Возвращает класс APOP, если isapop равно true; в противном случае возвращает класс 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 lib/net/pop.rb, line 306
def POP3.auth_only(address, port = nil,
account = nil, password = nil,
isapop = false)
new(address, port, isapop).auth_only account, password
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 lib/net/pop.rb, line 378 def POP3.certs return @ssl_params[:ca_file] || @ssl_params[:ca_path] end
возвращает :ca_file или :ca_path из POP3.ssl_params
# File lib/net/pop.rb, line 338
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 Создаёт правильные параметры из аргументов
# File lib/net/pop.rb, line 211 def POP3.default_pop3_port 110 end
Порт по умолчанию для подключений POP3, порт 110
# File lib/net/pop.rb, line 216 def POP3.default_pop3s_port 995 end
Порт по умолчанию для подключений POP3S, порт 995
# File lib/net/pop.rb, line 206 def POP3.default_port default_pop3_port() end
возвращает порт для POP3
# File lib/net/pop.rb, line 284
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 Инициализирует сеанс POP3 и удаляет все сообщения на сервере. Если предоставлен блок, каждый объект POPMail передаётся в него перед удалением.
Этот метод вызывает исключение POPAuthenticationError, если аутентификация не удалась.
Пример
Net::POP3.delete_all('pop.example.com', 110,
'YourAccount', 'YourPassword') do |m|
file.write m.pop
end
# File lib/net/pop.rb, line 356 def POP3.disable_ssl @ssl_params = nil end
Отключает SSL для всех новых экземпляров.
# File lib/net/pop.rb, line 333 def POP3.enable_ssl(*args) @ssl_params = create_ssl_params(*args) end
Включает SSL для всех новых экземпляров. params передаётся в OpenSSL::SSLContext#set_params.
# File lib/net/pop.rb, line 263
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 и итерирует по каждому объекту 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 lib/net/pop.rb, line 418 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
Создаёт новый объект POP3.
address — имя хоста или IP-адрес вашего сервера POP3.
Необязательный port — порт для подключения.
Необязательный isapop указывает, будет ли использоваться аутентификация APOP; по умолчанию false.
Этот метод не открывает TCP-соединение.
# File lib/net/pop.rb, line 363 def POP3.ssl_params return @ssl_params end
возвращает параметры SSL
см. также POP3.enable_ssl
# File lib/net/pop.rb, line 402
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 и открывает соединение. Эквивалентно
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 lib/net/pop.rb, line 368 def POP3.use_ssl? return !@ssl_params.nil? end
возвращает true если POP3.ssl_params установлен
# File lib/net/pop.rb, line 373 def POP3.verify return @ssl_params[:verify_mode] end
возвращает, включен ли verify_mode из POP3.ssl_params
Методы публичного экземпляра
# File lib/net/pop.rb, line 437 def apop? @apop end
Использует ли этот экземпляр аутентификацию APOP?
# File lib/net/pop.rb, line 315
def auth_only(account, password)
raise IOError, 'opening previously opened POP session' if started?
start(account, password) {
;
}
end Инициализирует сеанс pop3, пытается выполнить аутентификацию и завершает его. Этот метод нельзя вызывать, пока открыт сеанс POP3. Этот метод вызывает исключение POPAuthenticationError, если аутентификация завершается неудачно.
# File lib/net/pop.rb, line 688
def delete_all # :yield: message
mails().each do |m|
yield m if block_given?
m.delete unless m.deleted?
end
end Удаляет все сообщения на сервере.
Если вызывается с блоком, то перед удалением каждого сообщения он передаёт его в блок.
Пример
n = 1
pop.delete_all do |m|
File.open("inbox/#{n}") do |f|
f.write m.pop
end
n += 1
end
Этот метод вызывает исключение POPError, если произошла ошибка.
# File lib/net/pop.rb, line 464 def disable_ssl @ssl_params = nil end
Отключить SSL для всех новых экземпляров.
# File lib/net/pop.rb, line 666 def each_mail(&block) # :yield: message mails().each(&block) end
Передает каждое сообщение в переданный блок по очереди. Эквивалентно:
pop3.mails.each do |popmail| .... end
Этот метод вызывает исключение POPError, если произошла ошибка.
# File lib/net/pop.rb, line 453
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 Включает SSL для этого экземпляра. Нужно вызвать этот метод до установления соединения, чтобы он подействовал. +params+ - порт для установления SSL-соединения; по умолчанию 995. params (кроме :port) передаётся в OpenSSL::SSLContext#set_params.
# File lib/net/pop.rb, line 587 def finish raise IOError, 'POP session not yet started' unless started? do_finish end
Завершает сеанс POP3 и закрывает TCP-соединение.
# File lib/net/pop.rb, line 469
def inspect
+"#<#{self.class} #{@address}:#{@port} open=#{@started}>"
end Возвращает строковое представление состояния класса, читаемое человеком.
# File lib/net/pop.rb, line 713 def logging(msg) @debug_output << msg + "\n" if @debug_output end
Вывод отладки для msg
# File lib/net/pop.rb, line 644
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 Возвращает массив объектов Net::POPMail, представляющих все сообщения на сервере. Этот массив обновляется при перезапуске сеанса; иначе он извлекается с сервера при первом вызове этого метода (прямо или косвенно) и кэшируется.
Этот метод вызывает исключение POPError, если произошла ошибка.
# File lib/net/pop.rb, line 632 def n_bytes return @n_bytes if @n_bytes @n_mails, @n_bytes = command().stat @n_bytes end
Возвращает общий размер в байтах всех сообщений на POP-сервере.
# File lib/net/pop.rb, line 625 def n_mails return @n_mails if @n_mails @n_mails, @n_bytes = command().stat @n_mails end
Возвращает количество сообщений на POP-сервере.
# File lib/net/pop.rb, line 494 def port return @port || (use_ssl? ? POP3.default_pop3s_port : POP3.default_pop3_port) end
Номер порта для подключения.
# File lib/net/pop.rb, line 509 def read_timeout=(sec) @command.socket.read_timeout = sec if @command @read_timeout = sec end
Устанавливает таймаут чтения.
# File lib/net/pop.rb, line 698
def reset
command().rset
mails().each do |m|
m.instance_eval {
@deleted = false
}
end
end Сбрасывает сеанс. Это очищает все метки «удалено» для сообщений.
Этот метод вызывает исключение POPError, если произошла ошибка.
# File lib/net/pop.rb, line 486 def set_debug_output(arg) @debug_output = arg end
ВНИМАНИЕ: Этот метод создаёт серьёзную брешь в безопасности. Используйте этот метод только для отладки.
Устанавливает поток вывода для отладки.
Пример
pop = Net::POP.new(addr, port) pop.set_debug_output $stderr pop.start(account, passwd) do |pop| .... end
# File lib/net/pop.rb, line 527
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.
При вызове с блоком передаёт объект POP3 в блок и закрывает сеанс после завершения блока.
Этот метод вызывает исключение POPAuthenticationError, если аутентификация завершается неудачно.
# File lib/net/pop.rb, line 515 def started? @started end
Возвращает true, если сеанс POP3 начат.
# File lib/net/pop.rb, line 442 def use_ssl? return !@ssl_params.nil? end
Использует ли этот экземпляр SSL?
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.