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 — строка или массив строк, описывающие одного или нескольких получателей.
Вот пример отправки сообщения с помощью методов класса:
require 'net/smtp'
msg = <
Subject: Разное
... пришла пора
Подумать о делах:
О башмаках, о сургуче,
Капусте, королях.
И почему, как суп в котле,
Кипит вода в морях.
EOF
Net::SMTP.start("smtp-server.fake.com") do |smtp|
smtp.sendmail msg, 'walrus@fake1.com', 'alice@fake2.com'
end
Поскольку в начале строки находится слово Subject:
, то получатель сообщения увидит тему Разное
.
Имеется также метод экземпляра start
, который ведет себя практически так же, как метод класса. Поскольку почтовый сервер определен в методе new
, то задавать его еще и в методе start
не нужно. Поэтому этот параметр пропускается, а остальные не отличаются от параметров, передаваемых методу класса. Следовательно, сообщение можно послать и с помощью объекта SMTP:
Читать дальше
Конец ознакомительного отрывка
Купить книгу