Программирование на языке Ruby - [207]

Шрифт
Интервал

>smtp.ready("[email protected]", "[email protected]") 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"):

>imap.examine("INBOX")

>total = imap.responses["EXISTS"].last  # Всего сообщений.

>recent = imap.responses["RECENT"].last # Непрочитанных сообщений.

>imap.close                             # Закрыть почтовый ящик.

Отметим, что метод >examine позволяет только читать содержимое почтового ящика. Если нужно удалить сообщения или произвести какие-то другие изменения, пользуйтесь методом >select.

Почтовые ящики в протоколе IMAP организованы иерархически, как имена путей в UNIX. Для манипулирования почтовыми ящиками предусмотрены методы >create, >delete и >rename:

>imap.create("lists")

>imap.create("lists/ruby")

>imap.create("lists/rails")

>imap.create("lists/foobar")


># Уничтожить последний созданный ящик:

>imap.delete("lists/foobar")

Имеются также методы >list (получить список всех почтовых ящиков) и >lsub (получить список «активных» ящиков, на которые вы «подписались»). Метод >status возвращает информацию о состоянии ящика.

Метод >search находит сообщения, удовлетворяющие заданному критерию, а метод >fetch возвращает запрошенное сообщение:

>msgs = imap.search("ТО","lupin")

>msgs.each do |mid|

> env = imap.fetch(mid, "ENVELOPE")[0].attr["ENVELOPE"]

> puts "От #{env.from[0].name} #{env.subject}"

>end

Команда >fetch в предыдущем примере выглядит так сложно, потому что возвращает массив хэшей. Сам конверт тоже представляет собой сложную структуру; некоторые методы доступа к нему возвращают составные объекты, другие — просто строки.

В протоколе IMAP есть понятия UID (уникального идентификатора) и порядкового номера сообщения. Обычно методы типа >fetch обращаются к сообщениям по номерам, но есть и варианты (например, >uid_fetch) для обращения по UID. У нас нет места объяснять, почему нужны обе системы идентификации, но если вы собираетесь серьезно работать с IMAP, то должны понимать различие между ними (и никогда не путать одну с другой).

Библиотека >net/imap располагает разнообразными средствами для работы с почтовыми ящиками, сообщениями, вложениями и т.д. Дополнительную информацию поищите в онлайновой документации на сайте ruby-doc.org.

18.2.6. Кодирование и декодирование вложений

Для вложения в почтовое сообщение или в сообщение, отправляемое в конференцию, файл обычно кодируется. Как правило, применяется кодировка >base64, для работы с которой служит метод >pack с аргументом >m:

>bin = File.read("new.gif")

>str = [bin].pack("m")     # str закодирована.


>orig = str.unpack("m")[0] # orig == bin

Старые почтовые клиенты работали с кодировкой uuencode/uudecode. В этом случае вложение просто добавляется в конец текста сообщения и ограничивается строками >begin и >end, причем в строке >begin указываются также разрешения на доступ к файлу (которые можно и проигнорировать) и имя файла. Аргумент u метода >pack позволяет представить строку в кодировке >uuencode. Пример:

># Предположим, что mailtext содержит текст сообщения.


>filename = "new.gif"

>bin = File.read(filename)

>encoded = [bin].pack("u")


>mailtext << "begin 644 #{filename}"

>mailtext << encoded

>mailtext << "end"

># ...

На принимающей стороне мы должны извлечь закодированную информацию и декодировать ее методом >unpack:

># ...

># Предположим, что 'attached' содержит закодированные данные

># (включая строки begin и end).


>lines = attached.split("\n")

>filename = /begin \d\d\d (.*)/.scan(lines[0]).first.first

>encoded = lines[1..-2].join("\n")

>decoded = encoded.unpack("u") # Все готово к записи в файл.


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.