Программирование на языке 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") # Все готово к записи в файл.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.