Книга: Программирование на языке Ruby
18.2.3. Взаимодействие с РОР-сервером
18.2.3. Взаимодействие с РОР-сервером
Многие серверы электронной почты пользуются почтовым протоколом (Post Office Protocol — POP). Имеющийся в Ruby класс POP3
позволяет просматривать заголовки и тела всех сообщений, хранящихся для вас на сервере, и обрабатывать их как вы сочтете нужным. После обработки сообщения можно удалить.
Для создания объекта класса Net::POP3
нужно указать доменное имя или IP-адрес сервера; номер порта по умолчанию равен 110. Соединение устанавливается только после вызова метода start
(которому передается имя и пароль пользователя).
Вызов метода mails
созданного объекта возвращает массив объектов класса POPMail
. (Имеется также итератор each
для перебора этих объектов.)
Объект POPMail
соответствует одному почтовому сообщению. Метод header
получает заголовки сообщения, а метод all
— заголовки и тело (у метода all
, как мы вскоре увидим, есть и другие применения).
Фрагмент кода стоит тысячи слов. Вот пример обращения к серверу с после дующей распечаткой темы каждого сообщения:
require "net/pop"
pop = Net::POP3.new("pop.fakedomain.org")
pop.start("gandalf", "mellon") # Имя и пароль пользователя.
pop.mails.each do |msg|
puts msg.header.grep /^Subject: /
end
Метод delete
удаляет сообщение с сервера. (Некоторые серверы требуют, чтобы POP-соединение было закрыто методом finish
, только тогда результат удаления становится необратимым.) Вот простейший пример фильтра спама:
require "net/pop"
pop = Net::POP3.new("pop.fakedomain.org")
pop.start("gandalf", "mellon") # Имя и пароль пользователя.
pop.mails.each do |msg|
if msg.all =~ /.*make money fast.*/
msg.delete
end
end
pop.finish
Отметим, что при вызове метода start
можно также задавать блок. По аналогии с методом File.open
в этом случае открывается соединение, исполняется блок, а затем соединение закрывается.
Метод all
также можно вызывать с блоком. В блоке просто перебираются все строки сообщения, как если бы мы вызвали итератор each
для строки, возвращенной методом all
.
# Напечатать все строки в обратном порядке... полезная штука!
msg.all { |line| print line.reverse }
# To же самое...
msg.all.each { |line| print line.reverse }
Методу all
можно также передать объект. В таком случае для каждой строчки (line
) в полученной строке (string) будет вызван оператор конкатенации (<<
). Поскольку в различных объектах он может быть определен по-разному, в результате такого обращения возможны самые разные действия:
arr = [] # Пустой массив.
str = "Mail: " # String.
out = $stdout # Объект IO.
msg.all(arr) # Построить массив строчек.
msg.all(str) # Конкатенировать с str.
msg.all(out) # Вывести на stdout.
Наконец, покажем еще, как вернуть только тело сообщения, игнорируя все заголовки.
module Net
class POPMail
def body
# Пропустить байты заголовка
self.all[self.header.size..-1]
end
end
end
Если вы предпочитаете протокол IMAP, а не POP3, обратитесь к разделу 18.2.5
- 18.2.1. Получение истинно случайных чисел из Web
- 18.2.2. Запрос к официальному серверу времени
- 18.2.3. Взаимодействие с РОР-сервером
- 18.2.4. Отправка почты по протоколу SMTP
- 18.2.5. Взаимодействие с IMAP-сервером
- 18.2.6. Кодирование и декодирование вложений
- 18.2.7. Пример: шлюз между почтой и конференциями
- 18.2.8. Получение Web-страницы с известным URL
- 18.2.9. Библиотека Open-URI
- 18.2. Сетевые клиенты
- Эффективное взаимодействие процессов архитектуры Classic Server
- 5.4. РЕКОМЕНДАЦИИ НАЧИНАЮЩИМ ПО СОСТАВЛЕНИЮ ОПИСАНИЙ АЛГОРИТМОВ И ЭВРОРИТМОВ
- Что нужно для того, чтобы компьютер проработал долго и надежно
- Прорыв
- Взаимодействие Xalan с Java
- Лекция 16. Взаимодействие процессов
- Кросс-функциональное взаимодействие и ответственность
- 5.4.2. Взаимодействие родительского и дочернего процессов
- 9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO
- Взаимодействие с DNS-сервером
- Взаимодействие компонентов Kerberos