Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

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.4. Отправка почты по протоколу SMTP

Это понял бы и пятилетний ребенок. Дайте мне пятилетнего ребенка.

Гроучо Маркс

Название «простой протокол электронной почты» (Simple Mail Transfer Protocol — SMTP) не вполне правильно. Если он и «простой», то только по сравнению с более сложными протоколами.

Конечно, библиотека

smtp.rb
скрывает от программиста большую часть деталей протокола. Но, на наш взгляд, эта библиотека интуитивно не вполне очевидна и, пожалуй, слишком сложна (надеемся, что в будущем это изменится). В этом разделе мы приведем несколько примеров, чтобы помочь вам освоиться.

В классе

Net::SMTP
есть два метода класса:
new
и
start
. Метод
new
принимает два параметра: имя сервера (по умолчанию
localhost
) и номер порта (по умолчанию 25).

Метод

start
принимает следующие параметры:

• server — доменное имя или IP-адрес SMTP-сервера; по умолчанию это

"localhost"
;

• port — номер порта, по умолчанию 25;

• domain — доменное имя отправителя, по умолчанию

ENV["HOSTNAME"]
;

• account — имя пользователя, по умолчанию

nil
;

• password — пароль, по умолчанию

nil
;

• authtype — тип авторизации, по умолчанию

:cram_md5
.

Обычно большую часть этих параметров можно не задавать.

Если метод

start
вызывается «нормально» (без блока), то он возвращает объект класса
SMTP
. Если же блок задан, то этот объект передается прямо в блок.

У объекта

SMTP
есть метод экземпляра
sendmail
, который обычно и занимается всеми деталями отправки сообщения. Он принимает три параметра:

Поделиться:
Популярные книги

Стая

Сергеева Оксана Николаевна
1. Стая
Любовные романы:
современные любовные романы
остросюжетные любовные романы
9.37
рейтинг книги
Стая

Очарованная душа

Роллан Ромен
Проза:
классическая проза
6.00
рейтинг книги
Очарованная душа

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
6.00
рейтинг книги
Солнечный флот

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

AutoCAD 2009

Орлов Андрей Александрович
Видеосамоучитель
Компьютеры и Интернет:
программное обеспечение
5.00
рейтинг книги
AutoCAD 2009

Барон Бранд Берс. Том 1

Limonad
1. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 1

Крылатый воин

Чернобровкин Александр Васильевич
30. Вечный капитан
Фантастика:
попаданцы
5.00
рейтинг книги
Крылатый воин

Сиротка

Дюпюи Мари-Бернадетт
1. Сиротка
Проза:
историческая проза
8.76
рейтинг книги
Сиротка

Главбухша

Романов Владислав Иванович
Любовные романы:
остросюжетные любовные романы
5.00
рейтинг книги
Главбухша

Николай Гоголь

Труайя Анри
Проза:
историческая проза
6.40
рейтинг книги
Николай Гоголь

Эпоха Опустошителя. Том VI

Павлов Вел
6. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VI

Враг Короны

Бушков Александр Александрович
10. Сварог
Фантастика:
героическая фантастика
8.53
рейтинг книги
Враг Короны

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV