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

ЖАНРЫ

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

Имеется также метод экземпляра

start
, который ведет себя практически так же, как метод класса. Поскольку почтовый сервер определен в методе
new
, то задавать его еще и в методе
start
не нужно. Поэтому этот параметр пропускается, а остальные не отличаются от параметров, передаваемых методу класса. Следовательно, сообщение можно послать и с помощью объекта SMTP:

require 'net/smtp'

msg = <<EOF

Subject: Ясно и логично

"С другой стороны, - добавил Тарарам, -

если
все так и было, то все именно так и было.

Если же все было бы так, то все не могло бы быть

не так. Но поскольку все было не совсем так, все

было совершенно не так. Ясно и логично!"

EOF

smtp = Net::SMTP.new("smtp-server.fake.com")

smtp.start

smtp.sendmail msg, 'tweedledee@fake1.com', 'alice@fake2.com'

Если вы еще не запутались, добавим, что метод экземпляра может принимать ещё и блок:

require 'net/smtp'

msg = <<EOF

Subject: Моби Дик

Зовите меня Измаил.

EOF

addressees = ['readerl@fake2.com', 'reader2@fake3.com']

smtp = Net::SMTP.new("smtp-server.fake.com")

smtp.start do |obj|

 obj.sendmail msg, 'narrator@fake1.com', addressees

end

Как видно из примера, объект, переданный в блок (

obj
), не обязан называться так же, как объект, от имени которого вызывается метод (
smtp
). Кроме того, хочу подчеркнуть: несколько получателей можно представить в виде массива строк.

Существует еще метод экземпляра со странным названием

ready
. Он похож на
sendmail
, но есть и важные различия. Задаются только отправитель и получатели, тело же сообщения конструируется с помощью объекта
adapter
класса
Net::NetPrivate::WriteAdapter
, у которого есть методы
write
и
append
. Адаптер передается в блок, где может использоваться произвольным образом [17] :

17

В тексте приводится отрывок из стихотворения Т.Элиота «Песнь любви Дж. Альфреда Пруфрока» (пер. В.Топорова). — Прим. перев.

require "net/smtp"

smtp = Net::SMTP.new("smtp-server.fake1.com")

smtp.start

smtp.ready("t.s.eliot@fake1.com", "reader@fake2.com") do |obj|

 obj.write "Пошли вдвоем, пожалуй.\r\n"

 obj.write "Уж вечер небо навзничью распяло\r\n"

 obj.write "Как пациента под ножом наркоз... \r\n"

end

Отметим, что пары символов «возврат каретки», «перевод строки» обязательны (если вы хотите разбить сообщение на

строчки). Читатели, знакомые с деталями протокола, обратят внимание на то, что сообщение «завершается» (добавляется точка и слово «QUIT») без нашего участия.

Можно вместо метода

write
воспользоваться оператором конкатенации:

smtp.ready("t.s.eliot@fake1.com", "reader@fake2.com") do |obj|

 obj << "В гостиной разговаривают тети\r\n"

 obj << "О Микеланджело Буонаротти.\r\n"

end

И еще одно небольшое усовершенствование: мы добавим метод

puts
, который вставит в сообщение символы перехода на новую строку:

class Net::NetPrivate::WriteAdapter

 def puts(args)

args << "\r\n"

self.write(*args)

 end

end

Новый метод позволяет формировать сообщение и так:

smtp.ready("t.s.eliot@fake1.com", "reader@fake2.com") do |obj|

 obj.puts "Мы были призваны в глухую глубину,"

 obj.puts "В мир дев морских, в волшебную страну,"

 obj.puts "Но нас окликнули - и мы пошли ко дну."

end

Если всего изложенного вам не хватает, поэкспериментируйте самостоятельно. А если соберетесь написать новый интерфейс к протоколу SMTP, не стесняйтесь.

18.2.5. Взаимодействие с IMAP-сервером

Протокол IMAP нельзя назвать вершиной совершенства, но во многих отношениях он превосходит POP3. Сообщения могут храниться на сервере сколь угодно долго (с индивидуальными пометками «прочитано» и «не прочитано»). Для хранения сообщений можно организовать иерархию папок. Этих возможностей уже достаточно для того, чтобы считать протокол IMAP более развитым, чем POP3.

Для взаимодействия с IMAP-сервером предназначена стандартная библиотека

net/imap
. Естественно, вы должны сначала установить соединение с сервером, а затем идентифицировать себя с помощью имени и пароля:

require 'net/imap'

host = "imap.hogwarts.edu"

user, pass = "lupin", "riddikulus"

imap = Net::IMAP.new(host)

begin

 imap.login(user, pass)

 # Или иначе:

 # imap.authenticate("LOGIN", user, pass)

rescue Net::IMAP::NoResponseError

 abort "He удалось аутентифицировать пользователя #{user}"

end

# Продолжаем работу...

imap.logout # Разорвать соединение.

Установив соединение, можно проверить почтовый ящик методом examine; по умолчанию почтовый ящик в IMAP называется INBOX. Метод responses возвращает информацию из почтового ящика в виде хэша массивов (наиболее интересные данные находятся в последнем элементе массива). Показанный ниже код показывает общее число сообщений в почтовом ящике (

"EXISTS"
) и число непрочитанных сообщений (
"RESENT"
):

Поделиться с друзьями: