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

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

Жанры

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

# Различные параметры, необходимые шлюзу между почтой и конференциями.

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 = "myself@fake2.org" # От чьего имени посылать почту.

 # (Для списков, на которые подписываются, это должно быть имя

 # зарегистрированного участника списка.)

 mailing_list = "list@fake3.org" # Адрес списка рассылки.

end

Модуль

Params
содержит лишь константы, нужные обеим программам. Большая их часть не нуждается в объяснениях, упомянем лишь парочку. Во-первых, константа
LAST_NEWS_FILE
содержит путь к файлу, в котором хранится идентификатор последнего прочитанного из конференции сообщения; эта «информация о состоянии» позволяет избежать дублирования или пропуска сообщений.

Константа

LOOP_FLAG
определяет строку, которой помечаются сообщения, уже прошедшие через шлюз. Тем самым мы препятствуем возникновению бесконечной

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

Возникает вопрос: «А как вообще почта поступает в программу

mail2news
?» Ведь она, похоже, читает из стандартного ввода. Автор рекомендует следующую настройку: сначала в файле
.forward
программы
sendmail
вся входящая почта перенаправляется на программу
procmail
. Файл
.procmail
конфигурируется так, чтобы извлекать сообщения, приходящие из списка рассылки, и по конвейеру направлять их программе
mail2news
. Уточнить детали можно в документации, сопровождающей приложение RubyMirror (в архиве RAA). Если вы работаете не в UNIX, то придется изобрести собственную схему конфигурирования.

Ну а все остальное расскажет сам код, приведенный в листингах 18.6 и 18.7.

Листинг 18.6. Перенаправление почты в конференцию

# mail2news: Принимает почтовое сообщение и отправляет

# его в конференцию.

require "nntp"

include NNTP

require "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}/о # Такого не должно быть!

 break if line =~ /^s*$/

 next if line =~ /^\s/

 next unless line =~ allowed_headers

 # Вырезать префикс [ruby-talk:nnnn] из темы, прежде чем

 # отправлять в конференцию.

 if line =~ /^Subject:\s*(.*)/

subject = $1

# Следующий код вырезает специальный номер ruby-talk

# из начала сообщения в списке рассылки, перед тем

# как отправлять его новостному серверу.

line.sub!(/\[ruby-talk:(\d+)\]\s*/, '')

subject = "[#$1] #{line}"

head << "X-ruby-talk: #$1\n"

 end

 head << line

end

head << "#{Params::LOOP_FLAG}\n"

body = ""

while line = gets

 body << line

end

msg = head + "\n" + body

msg.gsub!(/\r?\n/, "\r\n")

nntp = NNTPIO.new(Params::NEWS_SERVER)

raise "Failed to connect" unless nntp.connect

nntp.post(msg)

Листинг 18.7. Перенаправление конференции в почту

##

# Простой сценарий для зеркалирования трафика

# из конференции comp.lang.ruby в список рассылки ruby-talk.

#

# Вызывается периодически (скажем, каждые 20 минут).

# Запрашивает у новостного сервера все сообщения с номером,

# большим номера последнего сообщения, полученного

# в прошлый раз. Если таковые есть, то читает сообщения,

# отправляет их в список рассылки и запоминает номер последнего.

require 'nntp'

require 'net/smtp'

require 'params'

include NNTP

##

#

# Отправить сообщения в список рассылки. Сообщение должно

# быть отправлено участником списка, хотя в строке From:

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

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард

Наследник павшего дома. Том II

Вайс Александр
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II

Некурящий. Трилогия

Федотов Антон Сергеевич
Некурящий
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Некурящий. Трилогия

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Моров. Том 7

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

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Кодекс Охотника. Книга XXXIX

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Последний Герой. Том 3

Дамиров Рафаэль
3. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 3

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Школа пластунов

Трофимов Ерофей
Одиночка
Фантастика:
боевая фантастика
5.00
рейтинг книги
Школа пластунов

Я уже граф. Книга VII

Дрейк Сириус
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже граф. Книга VII

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Последний Герой. Том 2

Дамиров Рафаэль
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Последний Герой. Том 2

Вернувшийся: Посол. Том IV

Vector
4. Вернувшийся
Фантастика:
космическая фантастика
киберпанк
5.00
рейтинг книги
Вернувшийся: Посол. Том IV