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

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

Жанры

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

• source — строка или массив (или любой объект, у которого есть итератор

each
, возвращающий на каждой итерации одну строку);

• sender — строка, записываемая в поле «from» сообщения;

• recipients — строка или массив строк, описывающие одного или нескольких получателей.

Вот пример отправки сообщения с помощью методов класса:

require 'net/smtp'

msg = <<EOF

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:

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, не стесняйтесь.

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

Русская мафия 1988-2007

Карышев Валерий Михайлович
Документальная литература:
публицистика
6.25
рейтинг книги
Русская мафия 1988-2007

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

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

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

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.50
рейтинг книги
Тринадцатый V

Дракон на границе

Диксон Гордон Руперт
3. Дракон и Джордж
Фантастика:
фэнтези
6.25
рейтинг книги
Дракон на границе

Муссон

Смит Уилбур
10. Кортни
Приключения:
исторические приключения
морские приключения
8.30
рейтинг книги
Муссон

Дорога в Омаху

Ладлэм Роберт
2. Маккензи Хаукинз
Юмор:
юмористическая проза
5.00
рейтинг книги
Дорога в Омаху

Библия. Новый русский перевод

Коллектив авторов
Религия и эзотерика:
христианство
6.57
рейтинг книги
Библия. Новый русский перевод

И в аду есть герои

Панов Вадим Юрьевич
5. Тайный Город
Фантастика:
боевая фантастика
9.19
рейтинг книги
И в аду есть герои

Полное собрание стихотворений

Брюсов Валерий Яковлевич
Поэзия:
поэзия
7.00
рейтинг книги
Полное собрание стихотворений

Сочинения

Брюсов Валерий Яковлевич
Проза:
русская классическая проза
5.00
рейтинг книги
Сочинения

Бернард Шоу

Пирсон Хескет
След в истории
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Бернард Шоу

А. Смолин, ведьмак. Цикл

Васильев Андрей Александрович
А. Смолин, ведьмак
Фантастика:
городское фэнтези
5.00
рейтинг книги
А. Смолин, ведьмак. Цикл

Искушение чародея (сборник)

Булычев Кир
Фантастика:
научная фантастика
космическая фантастика
6.20
рейтинг книги
Искушение чародея (сборник)