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

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

Жанры

Программирование на языке 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
, который обычно и занимается всеми деталями отправки сообщения. Он принимает три параметра:

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

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Шутка

Кундера Милан
Проза:
современная проза
6.60
рейтинг книги
Шутка

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Мы - истребители

Поселягин Владимир Геннадьевич
2. Я - истребитель
Фантастика:
альтернативная история
8.55
рейтинг книги
Мы - истребители

Двойник короля 20

Скабер Артемий
20. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 20

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Последний наследник

Тарс Элиан
11. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний наследник

30 сребреников

Распопов Дмитрий Викторович
1. 30 сребреников
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
30 сребреников

Студент из прошлого тысячелетия

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

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум