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

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

Жанры

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

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

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Черный дембель. Часть 3

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

Искатель 3

Шиленко Сергей
3. Валинор
Фантастика:
попаданцы
рпг
фэнтези
5.00
рейтинг книги
Искатель 3

Погранец

Поселягин Владимир Геннадьевич
2. Решала
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Погранец

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван

Учитель из прошлого тысячелетия

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

Моров. Том 8

Кощеев Владимир
7. Моров
Фантастика:
альтернативная история
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Моров. Том 8

Матабар V

Клеванский Кирилл Сергеевич
5. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар V

Лекарь Империи 2

Карелин Сергей Витальевич
2. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 2

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Скажи миру – «нет!»

Верещагин Олег Николаевич
1. Путь домой
Фантастика:
фэнтези
героическая фантастика
попаданцы
7.61
рейтинг книги
Скажи миру – «нет!»

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Алгебраист

Бэнкс Иэн М.
Фантастика:
научная фантастика
5.60
рейтинг книги
Алгебраист