Страница 1 из 1

Предлагаю обсудить идею.

Добавлено: 2007-05-21 13:42:59
dikens3

Код: Выделить всё

Мне нравится моё собственное(может и есть конечно где) изобретение.

Принцип такой, отправил письмо на определённый E-Mail. Можно от этого E-Mail получать некоторое время без сложных проверок.

Если что c фильтрами не так, то мои пользователи просто отправляют письмо адресату и всё. Работает на 100%.

Собственно это auto_whitelist на определённый период. Но реализаций я пока не встречал.(может потому, что сам умею?)
Обсуждение надеюсь будет?
Какие есть недостатки? Решения для Exim? (Кстати я сделал auto_whitelist в mysql)

Добавлено: 2007-05-21 13:45:21
Alex Keda

Добавлено: 2007-05-21 13:59:16
dikens3
Вот пример моего:
acl_smtp_data:

Код: Выделить всё

# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
          set acl_m19   = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}

# Если существует, изменяем поле record_expire
warn
          condition     = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_UPDATEMYLIST}}

# Если не существует такой записи, добавляем в базу.
warn
          condition     = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_MYLIST}}
configure

Код: Выделить всё

# Белый список E-Mail'ов
MYSQL_MYLIST            = INSERT INTO mylist(src_email,dst_email,record_expires) VALUES ('$sender_address','$acl_m4@$acl_m5',DATE_ADD(now(), INTERVAL 10 DAY))
MYSQL_UPDATEMYLIST      = UPDATE mylist SET record_expires=DATE_ADD(now(), INTERVAL 10 DAY) WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_DELMYLISTEXPIRED  = DELETE FROM mylist WHERE record_expires < now()
MYSQL_TESTMYLIST        = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_TESTCLIENTMYLIST  = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE dst_email='$sender_address' AND src_email='$local_part@$domain'

...
# Белые списки
# Принимаем от пользователей (E-Mail'ов), которым мы посылали сообщения (10 дней максимум) 0 - Нет записи, 1 - Принимаем, 2 - Срок истёк.
  warn      set acl_m19  = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}{$value}{0}}

  accept    domains       = +local_domains
            condition     = ${if eq{$acl_m19}{1}{yes}{no}}
            endpass
            message       = "Unknown user"
            verify        = recipient
Если нужно остальное выложу.

Добавлено: 2007-05-21 14:03:33
Zedik
спасибо
хотелось бы глянуть, сам никак не дотянусь прикрутить этот момент

Добавлено: 2007-05-21 15:12:30
dikens3
Таблица для Mysql:

Код: Выделить всё

# Создаём таблицу для запоминания E-Mail'ов получателей
DROP TABLE IF EXISTS `mylist`;
CREATE TABLE `mylist` (
  `src_email` varchar(50) default NULL,
  `dst_email` varchar(50) default NULL,
  `record_expires` datetime NOT NULL,
  PRIMARY KEY  (`src_email`,`dst_email`)
) ENGINE=InnoDB DEFAULT CHARSET=koi8r COMMENT='Таблица E-Mail-ов получателей';
Определяем макросы в основном конфиге:

Код: Выделить всё

# Белый список E-Mail'ов
MYSQL_MYLIST            = INSERT INTO mylist(src_email,dst_email,record_expires) VALUES ('$sender_address','$acl_m4@$acl_m5',DATE_ADD(now(), INTERVAL 10 DAY))
MYSQL_UPDATEMYLIST      = UPDATE mylist SET record_expires=DATE_ADD(now(), INTERVAL 10 DAY) WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_DELMYLISTEXPIRED  = DELETE FROM mylist WHERE record_expires < now()
MYSQL_TESTMYLIST        = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE src_email='$sender_address' AND dst_email='$acl_m4@$acl_m5'
MYSQL_TESTCLIENTMYLIST  = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE dst_email='$sender_address' AND src_email='$local_part@$domain' 
Далее добавляем в acl_smtp_data:

Код: Выделить всё

# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
          set acl_m19   = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}

# Если существует, изменяем поле record_expire
warn
          condition     = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_UPDATEMYLIST}}

# Если не существует такой записи, добавляем в базу.
warn
          condition     = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_MYLIST}}
И правим acl_smtp_rcpt для принятия от клиентов в auto_whitelist:

Код: Выделить всё

# В acl_check_data: не работает проверка доменов. В переменной будет домен, если он наш, иначе пустая.
warn      set acl_m3    = ${lookup mysql{MYSQL_DOMAINS}}
# В acl_check_data: не работает $local_part.
warn      set acl_m4    = $local_part
warn      set acl_m5    = $domain 

# Белые списки
# Принимаем от пользователей (E-Mail'ов), которым мы посылали сообщения (10 дней максимум) 0 - Нет записи, 1 - Принимаем, 2 - Срок истёк.
  warn      set acl_m19  = ${lookup mysql{MYSQL_TESTCLIENTMYLIST}{$value}{0}}

  accept    domains       = +local_domains
            condition     = ${if eq{$acl_m19}{1}{yes}{no}}
            endpass
            message       = "Unknown user"
            verify        = recipient
Я сделал очистку с помощью exim(acl_smtp_rcpt - В конец):

Код: Выделить всё

# Очищаем в 12 часов список mylist c устаревшими записями каждого 1-го числа месяца
warn
          set acl_m19   = ${substr{6}{4}{$tod_zulu}}
          condition     = ${if eq{$acl_m19}{0112}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_DELMYLISTEXPIRED}}

# Остальных прибиваем
  deny     message       = relay not permitted
Остальное выше.

P.S. Делал так, т.к. не знал как делать поиск в поле datetime. Можно сделать лучше. Руки не доходят.

Добавлено: 2007-05-22 7:39:34
Zedik
thx :P
важную переписку закончу и буду прикручивать

Добавлено: 2007-05-28 8:33:28
Zedik
замечен следующий ньюанс,
если в списке пункта назначения(кому) несколько адресатов, то в БД обновляется запись адресата, указанного последним в этом списке(кому)

Добавлено: 2007-05-28 8:42:35
dikens3
Zedik писал(а):замечен следующий ньюанс,
если в списке пункта назначения(кому) несколько адресатов, то в БД обновляется запись адресата, указанного последним в этом списке(кому)
Хех. Баг прямо какой-то. :-) Подумаю.

Добавлено: 2007-05-28 9:55:47
dikens3
Вобщем правильнее наверное нужно это дело закинуть в транспорты. Думаю придётся писать фильтр, только вот как он работает я никак не врублюсь.

Поэтому прошу прояснить этот момент. У лиса в статье есть пример:

Код: Выделить всё

# system filter
# А тут у начальства заскок - желание контролировать всё.
# Вот и пришлось сделать копию всей почты.
# Вот тока в IT отделе, как выяснилось, никто никому не пишет :)
system_filter = /usr/local/etc/exim/copy_mail.conf
Собственно вопрос, когда начинает этот фильтр работать? После EHLO, RCPT, DATA и т.п.
(Возможно выполненных действий каких-то?)

Добавлено: 2007-05-28 14:35:22
Alex Keda
после приёма всего письма - соответственно - после всего что в конфиге exim`a и до того, ка кон что-то начёнт делать с письмом

Добавлено: 2007-05-28 15:35:21
dikens3
lissyara писал(а):после приёма всего письма - соответственно - после всего что в конфиге exim`a и до того, ка кон что-то начёнт делать с письмом
Т.е. перед отправкой в транспорты?

Добавлено: 2007-05-28 15:58:40
dikens3
Вобщем поспрашивал народ в рассылке, оригинальная идея и имеет место жить. :-)

Нужно из acl_smtp_data перенести всё в acl_smtp_rcpt.
И добавить перед тем, как принять во внешний мир.
Должно получиться следующее:

Код: Выделить всё

...
...
# Принимаем аутентифицированных для нашего домена
  accept    authenticated = *
            domains       = +local_domains
            endpass
            message       = "Unknown user"
            verify        = recipient

# Проверяем, существует ли домен получателя
  deny     log_message   = Recipient verify failed
           authenticated = *
           !verify        = recipient

# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
          authenticated = *
          set acl_m19   = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}

# Если существует, изменяем поле record_expire
warn
          authenticated = *
          condition     = ${if and {{eq{$acl_m3}{}}{!eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_UPDATEMYLIST}}

# Если не существует такой записи, добавляем в базу.
warn
          authenticated = *
          condition     = ${if and {{eq{$acl_m3}{}}{eq{$acl_m19}{0}}}{yes}{no}}
          set acl_m19   = ${lookup mysql{MYSQL_MYLIST}}
...
...

Добавлено: 2007-05-29 10:19:59
Zedik
моя благодарность :)

А почему в идеи реализована проверка src и dst для дальнейшего принятия письма без доп проверок? а не один dst.
т.е. если 1@mydomen отправил письмо для 2@awaydomain, то письмо от 2@awaydomain пройдет ТОЛЬКО для юзера 1@mydomen без дополнительных проверок, а вот для 3@mydomen пойдет по всем проверкам.
криво выразил свой вопрос. :|
просто интересен сам замысел, может какие то подводные камни есть :?
у себя сделал проверку только на dst, т.е. если письмо от одного из моих юзеров отсылалось на 2@awaydomain, то принять от 2@awaydomain могу и я

MYSQL_TESTCLIENTMYLIST = SELECT CASE WHEN now() - record_expires > 0 THEN 2 ELSE 1 END FROM mylist WHERE dst_email='$sender_address'

Добавлено: 2007-05-31 8:59:26
robi
ИМХО - интересная идея но зачем?
она ведь полубокая какая то
получаеться что спокойно без проверок принимаем с тех адресов на которые пишут пользователи. + всякие проверки.
более качественней по моему это грейлист. который с первого раза отфутболивает письмо с ошибкой , а если его посылал номальный почтовик, то это писмо повторяеться через некоторое время, письмо принимаеться и пара "получатель - домен отправителя" заноситься в белый список на определенный срок. спам режится на 95% остальные 5 убираються с помощью блек листов.
У меня такая система режет практически 100 % спама.
тема грейлиста здесь уже поднималась
ЗЫ Lissyara ты в свое время обешал глянуть на данный механизм, не смотрел случаем?

Добавлено: 2007-05-31 9:11:57
Zedik
robi писал(а):с первого раза отфутболивает письмо с ошибкой , а если его посылал номальный почтовик, то это писмо повторяеться через некоторое время
уточнение для себя:
тут тогда удаленному отправителю самому придется повторять письмо? или я не правильно мыслю?

Добавлено: 2007-05-31 9:28:47
dikens3
Zedik писал(а):моя благодарность :)

А почему в идеи реализована проверка src и dst для дальнейшего принятия письма без доп проверок? а не один dst.
у себя сделал проверку только на dst, т.е. если письмо от одного из моих юзеров отсылалось на 2@awaydomain, то принять от 2@awaydomain могу и я
А мне этого не требуется. Мне нужна нормальная переписка. Так более безопасно. Т.е. если кто угадает/подберёт отправителя, то придётся ещё и угадать получателя. И всем хорошо. :-)

Добавлено: 2007-05-31 9:30:26
dikens3
Zedik писал(а):тут тогда удаленному отправителю самому придется повторять письмо? или я не правильно мыслю?
Правильно. Только почтовый сервер может повторять отправку, а спамеры(маленькие спамеры) не будут повторять, т.к. рассылают 1 раз в день. :-) Отчасти спасёт на время greylist, но спам сейчас всё более сильно развивается и в будущем это защитой являться не будет.

Добавлено: 2007-05-31 9:32:24
dikens3
robi писал(а):ИМХО - интересная идея но зачем?
она ведь полубокая какая то
получаеться что спокойно без проверок принимаем с тех адресов на которые пишут пользователи. + всякие проверки.
Именно это и нужно. Если по каким-либо причинам кто-то не может прислать нам почту(я могу заболеть? В отпуск уйти?) то данная методика себя оправдывает полностью.

Добавлено: 2007-05-31 14:25:12
dikens3
Тут есть недостаток. bounce сообщения (о переполнениях ящика к примеру) могут не дойти, т.к. отправитель будет уже mailer-daemon и т.п. а хост будет криво настроен или в RBL. :-(