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)
-
Вызовите #start и начните сеанс POP.
-
Получайте доступ к сообщениям с помощью #each_mail и/или #mails.
-
Закройте сеанс POP, вызвав #finish или используйте блочную форму start.
Укороченный код
Приведенный выше пример достаточно подробен. Можно сократить код, используя некоторые вспомогательные методы. Во-первых, можно использовать блочную форму ::start вместо ::new, #start и #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
#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
Метод Net::POPMail#unique_id возвращает уникальный идентификатор сообщения в виде строки. Обычно уникальный идентификатор — это хэш сообщения.
Константы
- Revision
-
номер SVN этой библиотеки
Атрибуты
Адрес для подключения.
Секунды ожидания открытия соединения. Если объект POP3 не может открыть соединение в течение этого времени, он генерирует исключение Net::OpenTimeout. Значение по умолчанию — 30 секунд.
Секунды ожидания чтения одного блока (одним вызовом read(1)). Если объект POP3 не может завершить чтение в течение этого времени, он генерирует исключение Net::ReadTimeout. Значение по умолчанию — 60 секунд.
Публичные методы класса
# File lib/net/pop.rb, line 238 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 305
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 377 def POP3.certs return @ssl_params[:ca_file] || @ssl_params[:ca_path] end
возвращает :ca_file или :ca_path из ::ssl_params
# File 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 Строит правильные параметры из аргументов
# File lib/net/pop.rb, line 210 def POP3.default_pop3_port 110 end
Порт по умолчанию для подключений POP3, порт 110
# File lib/net/pop.rb, line 215 def POP3.default_pop3s_port 995 end
Порт по умолчанию для подключений POP3S, порт 995
# File lib/net/pop.rb, line 205 def POP3.default_port default_pop3_port() end
возвращает порт для POP3
# File 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 Инициализирует сеанс 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 355 def POP3.disable_ssl @ssl_params = nil end
Отключить SSL для всех новых экземпляров.
# File lib/net/pop.rb, line 332 def POP3.enable_ssl(*args) @ssl_params = create_ssl_params(*args) end
Включить SSL для всех новых экземпляров. params передаётся в OpenSSL::SSLContext#set_params.
# File 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 и перебирает каждый объект 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 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
Создаёт новый объект POP3.
address — имя хоста или IP-адрес вашего сервера POP3.
Необязательный port — порт для подключения.
Необязательный isapop указывает, будет ли использоваться аутентификация APOP; по умолчанию false.
Этот метод не открывает TCP-соединение.
# File lib/net/pop.rb, line 362 def POP3.ssl_params return @ssl_params end
возвращает параметры SSL
см. также ::enable_ssl
# File 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 и открывает соединение. Эквивалентно
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 367 def POP3.use_ssl? return !@ssl_params.nil? end
возвращает true если установлен ::ssl_params
# File lib/net/pop.rb, line 372 def POP3.verify return @ssl_params[:verify_mode] end
возвращает, включён ли режим проверки verify_mode из ::ssl_params
Методы экземпляра публичного интерфейса
# File lib/net/pop.rb, line 436 def apop? @apop end
Использует ли этот экземпляр аутентификацию APOP?
# File lib/net/pop.rb, line 314
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 686
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 463 def disable_ssl @ssl_params = nil end
Отключает SSL для всех новых экземпляров.
# File lib/net/pop.rb, line 664 def each_mail(&block) # :yield: message mails().each(&block) end
Поочередно передаёт каждое сообщение в переданный блок. Эквивалентно:
pop3.mails.each do |popmail| .... end
Этот метод вызывает исключение POPError, если произошла ошибка.
# File 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 Включает SSL для этого экземпляра. Должен быть вызван до установления соединения, чтобы иметь какой-либо эффект. +params+ — порт для установления SSL-соединения; по умолчанию 995. params (кроме :port) передаётся в OpenSSL::SSLContext#set_params.
# File lib/net/pop.rb, line 585 def finish raise IOError, 'POP session not yet started' unless started? do_finish end
Завершает сеанс POP3 и закрывает TCP-соединение.
# File lib/net/pop.rb, line 468
def inspect
+"#<#{self.class} #{@address}:#{@port} open=#{@started}>"
end Предоставляет строковое представление состояния класса в удобочитаемом виде.
# File lib/net/pop.rb, line 711 def logging(msg) @debug_output << msg + "\n" if @debug_output end
отладочный вывод для msg
# File lib/net/pop.rb, line 642
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 630 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 623 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 493 def port return @port || (use_ssl? ? POP3.default_pop3s_port : POP3.default_pop3_port) end
Номер порта для подключения.
# File lib/net/pop.rb, line 508 def read_timeout=(sec) @command.socket.read_timeout = sec if @command @read_timeout = sec end
Установить тайм-аут чтения.
# File lib/net/pop.rb, line 696
def reset
command().rset
mails().each do |m|
m.instance_eval {
@deleted = false
}
end
end Сбрасывает сеанс. Это очищает все метки «удаленных» сообщений.
Этот метод вызывает исключение POPError, если произошла ошибка.
# File lib/net/pop.rb, line 485 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 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.
При вызове с блоком передает объект POP3 в блок и закрывает сеанс после завершения вызова блока.
Этот метод вызывает исключение POPAuthenticationError, если аутентификация не удалась.
# File lib/net/pop.rb, line 514 def started? @started end
true если сеанс POP3 запущен.
# File lib/net/pop.rb, line 441 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.