созданного объекта возвращает массив объектов класса
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
, который обычно и занимается всеми деталями отправки сообщения. Он принимает три параметра:
• source — строка или массив (или любой объект, у которого есть итератор
each
, возвращающий на каждой итерации одну строку);
• sender — строка, записываемая в поле «from» сообщения;
• recipients — строка или массив строк, описывающие одного или нескольких получателей.
Вот пример отправки сообщения с помощью методов класса: