Хэл Фултон - Программирование на языке Ruby
- Название:Программирование на языке Ruby
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2007
- Город:Москва
- ISBN:5-94074-357-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хэл Фултон - Программирование на языке Ruby краткое содержание
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
Программирование на языке Ruby - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
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:
require 'net/smtp'
msg = <
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 = <
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] В тексте приводится отрывок из стихотворения Т.Элиота «Песнь любви Дж. Альфреда Пруфрока» (пер. В.Топорова). — Прим. перев.
:
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"
Интервал:
Закладка: