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

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2007-05-21 13:42:59

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

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

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

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

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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-05-21 13:45:21

Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-21 13:59:16

Вот пример моего:
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
Если нужно остальное выложу.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

Непрочитанное сообщение Zedik » 2007-05-21 14:03:33

спасибо
хотелось бы глянуть, сам никак не дотянусь прикрутить этот момент

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-21 15:12:30

Таблица для 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. Можно сделать лучше. Руки не доходят.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

Непрочитанное сообщение Zedik » 2007-05-22 7:39:34

thx :P
важную переписку закончу и буду прикручивать

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

Непрочитанное сообщение Zedik » 2007-05-28 8:33:28

замечен следующий ньюанс,
если в списке пункта назначения(кому) несколько адресатов, то в БД обновляется запись адресата, указанного последним в этом списке(кому)

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-28 8:42:35

Zedik писал(а):замечен следующий ньюанс,
если в списке пункта назначения(кому) несколько адресатов, то в БД обновляется запись адресата, указанного последним в этом списке(кому)
Хех. Баг прямо какой-то. :-) Подумаю.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-28 9:55:47

Вобщем правильнее наверное нужно это дело закинуть в транспорты. Думаю придётся писать фильтр, только вот как он работает я никак не врублюсь.

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

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Непрочитанное сообщение Alex Keda » 2007-05-28 14:35:22

после приёма всего письма - соответственно - после всего что в конфиге exim`a и до того, ка кон что-то начёнт делать с письмом
Убей их всех! Бог потом рассортирует...

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-28 15:35:21

lissyara писал(а):после приёма всего письма - соответственно - после всего что в конфиге exim`a и до того, ка кон что-то начёнт делать с письмом
Т.е. перед отправкой в транспорты?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-28 15:58:40

Вобщем поспрашивал народ в рассылке, оригинальная идея и имеет место жить. :-)

Нужно из 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}}
...
...
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

Непрочитанное сообщение Zedik » 2007-05-29 10:19:59

моя благодарность :)

А почему в идеи реализована проверка 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'

robi
рядовой
Сообщения: 49
Зарегистрирован: 2006-08-17 21:46:31

Непрочитанное сообщение robi » 2007-05-31 8:59:26

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

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

Непрочитанное сообщение Zedik » 2007-05-31 9:11:57

robi писал(а):с первого раза отфутболивает письмо с ошибкой , а если его посылал номальный почтовик, то это писмо повторяеться через некоторое время
уточнение для себя:
тут тогда удаленному отправителю самому придется повторять письмо? или я не правильно мыслю?

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-31 9:28:47

Zedik писал(а):моя благодарность :)

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

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-31 9:30:26

Zedik писал(а):тут тогда удаленному отправителю самому придется повторять письмо? или я не правильно мыслю?
Правильно. Только почтовый сервер может повторять отправку, а спамеры(маленькие спамеры) не будут повторять, т.к. рассылают 1 раз в день. :-) Отчасти спасёт на время greylist, но спам сейчас всё более сильно развивается и в будущем это защитой являться не будет.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-31 9:32:24

robi писал(а):ИМХО - интересная идея но зачем?
она ведь полубокая какая то
получаеться что спокойно без проверок принимаем с тех адресов на которые пишут пользователи. + всякие проверки.
Именно это и нужно. Если по каким-либо причинам кто-то не может прислать нам почту(я могу заболеть? В отпуск уйти?) то данная методика себя оправдывает полностью.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2007-05-31 14:25:12

Тут есть недостаток. bounce сообщения (о переполнениях ящика к примеру) могут не дойти, т.к. отправитель будет уже mailer-daemon и т.п. а хост будет криво настроен или в RBL. :-(
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.