Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Но не каждый хочет подписываться на список рассылки и ежедневно получать десятки сообщений; кто-то предпочитает время от времени заходить в конференцию и просматривать новые сообщения. С другой стороны, есть люди, которым система Usenet кажется слишком медлительной — они хотели бы видеть сообщение, пока еще электроны не успели остыть.
Таким образом, мы имеем ситуацию, когда в сравнительно небольшом закрытом списке рассылки рассматриваются те же темы, что в немодерируемой конференции, открытой всему миру. В конце концов кому-то пришла в голову мысль организовать зеркало — шлюз между обеими системами.
Подобный шлюз подходит не к любой ситуации, но в случае списка рассылки Ruby он вполне годится. Сообщения из конференции нужно скопировать в список, а сообщения, отправляемые в список рассылки, направить также и конференцию.
Эта задача была решена Дэйвом Томасом (Dave Thomas) — конечно, на Ruby, — и с его любезного разрешения мы приводим код в листингах 18.6 и 18.7.
Но сначала небольшое вступление. Мы уже немного познакомились с тем, как отправлять и получать электронную почту, но как быть с конференциями Usenet? Доступ к конференциям обеспечивает протокол NNTP (Network News Transfer Protocol — сетевой протокол передачи новостей). Кстати, создал его Ларри Уолл (Larry Wall), который позже подарил нам язык Perl.
В Ruby нет «стандартной» библиотеки для работы с NNTP. Однако один японский программист (известный нам только по псевдониму greentea) написал прекрасную библиотеку для этой цели.
В библиотеке
nntp.rbNNTPNNTPIOconnectget_headget_bodypostget_headget_bodypostВ приведенных ниже программах используется библиотека
smtpФайл
params.rb# Различные параметры, необходимые шлюзу между почтой и конференциями.module Params NEWS_SERVER = "usenet.fake1.org" # Имя новостного сервера. NEWSGROUP = "comp.lang.ruby" # Зеркалируемая конференция. LOOP_FLAG = "X-rubymirror: yes" # Чтобы избежать циклов. LAST_NEWS_FILE = "/tmp/m2n/last_news" # Номер последнего прочитанного # сообщения. SMTP_SERVER = "localhost" # Имя хоста для исходящей почты. MAIL_SENDER = "[email protected]" # От чьего имени посылать почту. # (Для списков, на которые подписываются, это должно быть имя # зарегистрированного участника списка.) mailing_list = "[email protected]" # Адрес списка рассылки.endМодуль
ParamsLAST_NEWS_FILEКонстанта
LOOP_FLAGрекурсии, а заодно негодованию возмущенных обитателей сети, получивших тысячи копий одного и того же сообщения.
Возникает вопрос: «А как вообще почта поступает в программу
mail2news.forwardsendmailprocmail.procmailmail2newsНу а все остальное расскажет сам код, приведенный в листингах 18.6 и 18.7.
# mail2news: Принимает почтовое сообщение и отправляет# его в конференцию.require "nntp"include NNTPrequire "params"# Прочитать сообщение, выделив из него заголовок и тело.# Пропускаются только определенные заголовки.HEADERS = %w{From Subject References Message-ID Content-Type Content-Transfer-Encoding Date}allowed_headers = Regexp.new(%{^(#{HEADERS.join("|")}):})# Прочитать заголовок. Допускаются только некоторые заголовки.# Добавить строки Newsgroups и X-rubymirror.head = "Newsgroups: #{Params::NEWSGROUP}n"subject = "unknown"while line = gets exit if line /^#{Params::LOOP_FLAG}/о # Такого не должно быть!
