На спам отвечать письмом, с инфой как добавиться в вайтлист
Модератор: xM
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
На спам отвечать письмом, с инфой как добавиться в вайтлист
Всем доброго времени суток)
Прошелся по интернету, но не смог подобрать правильный запрос к поисковику.
Прошелся по этому форуму, но не нашел идей.
Прошу помощи или совета отдельной темой.
Есть EXIM 4.71 + Spamassassin 3.3.1.
Spamassassin замечательно работает - определяет бОльшую часть спама и метит, как ***SPAM***.
Но в почтовые ящики этот спам все равно проходит (чтобы не терялась нормальная почта, которую определили под спам).
Начальство попросило сделать так, чтобы спамовые письма отбрасывались.
НО чтобы на каждое отброшенное спам-письмо отправлялось ответное письмо с текстом типа:
"Ваше письмо было распознано, как спам. Если это не спам, сделайте ку".
Ну и вместо "ку":
- отправить письмо на адрес типа nespam-user@domain (чтобы быть занесенным в whitelist);
- пройти по ссылочке, которая сверится с базой данных и занесет email этого человека в whitelist;
- отправить СМС на короткий номер ;
Идея в том, чтобы автоматически или полуавтоматически генерировать whitelist для тех бедолаг, чьи письма Spamassassin определяет спамом.
А остальное резать, как спам.
Мне показалось, что для этого логичнее всего отправлять ответные письма (или их более правильно называть bounce письма) с информацией ("ты похож на спамера"), и с инструкцей, как попасть в whitelist.
В принципе, все упирается в генерацию ответного (bounce) письма.
Все что нашел у exim, это тут:
http://www.lissyara.su/doc/exim/4.62/ma ... ion/#14.22
bounce_message_file, bounce_message_text и т.д.
Но как-то их не хватает для генерации bounce сообщения, чтобы туда включить нужный email или ссылку.
Подразумевается, что у каждого ответного сообщения будет свой email, или ссылка, которые занесут человека в whitelist.
Например, email будет вида 8937489374327.nespam.user@domain
Или ссылка вида: domain/nospam?id=8937489374327
Есть мысль, что придется делать через коммандную строку и скрипты.
Но, может быть, есть более красивое, или просто уже работающее решение?
Буду очень благодарен даже за наводку, куда копать.
UPD:
Пока писал, пришла в голову мысль, что возможно проще будет сделать адрес типа: nespam-user@domain и воспользоваться возможностями bounce_message_text.
Или все же есть надежда?
Прошелся по интернету, но не смог подобрать правильный запрос к поисковику.
Прошелся по этому форуму, но не нашел идей.
Прошу помощи или совета отдельной темой.
Есть EXIM 4.71 + Spamassassin 3.3.1.
Spamassassin замечательно работает - определяет бОльшую часть спама и метит, как ***SPAM***.
Но в почтовые ящики этот спам все равно проходит (чтобы не терялась нормальная почта, которую определили под спам).
Начальство попросило сделать так, чтобы спамовые письма отбрасывались.
НО чтобы на каждое отброшенное спам-письмо отправлялось ответное письмо с текстом типа:
"Ваше письмо было распознано, как спам. Если это не спам, сделайте ку".
Ну и вместо "ку":
- отправить письмо на адрес типа nespam-user@domain (чтобы быть занесенным в whitelist);
- пройти по ссылочке, которая сверится с базой данных и занесет email этого человека в whitelist;
- отправить СМС на короткий номер ;
Идея в том, чтобы автоматически или полуавтоматически генерировать whitelist для тех бедолаг, чьи письма Spamassassin определяет спамом.
А остальное резать, как спам.
Мне показалось, что для этого логичнее всего отправлять ответные письма (или их более правильно называть bounce письма) с информацией ("ты похож на спамера"), и с инструкцей, как попасть в whitelist.
В принципе, все упирается в генерацию ответного (bounce) письма.
Все что нашел у exim, это тут:
http://www.lissyara.su/doc/exim/4.62/ma ... ion/#14.22
bounce_message_file, bounce_message_text и т.д.
Но как-то их не хватает для генерации bounce сообщения, чтобы туда включить нужный email или ссылку.
Подразумевается, что у каждого ответного сообщения будет свой email, или ссылка, которые занесут человека в whitelist.
Например, email будет вида 8937489374327.nespam.user@domain
Или ссылка вида: domain/nospam?id=8937489374327
Есть мысль, что придется делать через коммандную строку и скрипты.
Но, может быть, есть более красивое, или просто уже работающее решение?
Буду очень благодарен даже за наводку, куда копать.
UPD:
Пока писал, пришла в голову мысль, что возможно проще будет сделать адрес типа: nespam-user@domain и воспользоваться возможностями bounce_message_text.
Или все же есть надежда?
<'\/'>
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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/
- Morty
- ст. лейтенант
- Сообщения: 1370
- Зарегистрирован: 2007-07-17 23:25:12
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
2 мысли вижу:
1) там где у тебя спамассасин допустим дропает письмо которе спам
выдавать
2) фильтром
в фильтр
соотвесно продумываешь логику и старничку где смогут сами себя добавлять
PS: может я гдето неправильно технически выразился - но идея я думаю просматриваеться
1) там где у тебя спамассасин допустим дропает письмо которе спам
выдавать
Код: Выделить всё
drop ....(спамассасин балы)
message = "Your message was detected as possible spam, if it NOT spam
contact admin@mydomain.com for whitelisting your mail-srv"
!recipients = /usr/whiterecipients
в фильтр
Код: Выделить всё
if $header_гдеонотам contain "SPAM"
then
mail
to $sender_address
bcc "iaadmin@mydomain.com"
from "dontreply@mydomain.com"
subject "SPam attention RE: $h_subject:"
text " Мы распознали ваше письмо как возможный спам оно было отправлено от ... здесь фантазируешь
со всякими аля $sender_address и прочими если нада. Если это не так просьма свзаться с нами по такому то имейл
или зайти на такойто сайт и добавить себя в вайтлист"
PS: может я гдето неправильно технически выразился - но идея я думаю просматриваеться
- dikens3
- подполковник
- Сообщения: 4856
- Зарегистрирован: 2006-09-06 16:24:08
- Откуда: Нижний Новгород
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Я бы сделал по типу как на укр.нет.
если баллов столько-то, то выдавать fakereject (письмо реально проходит до пользователей), и указывать причину:
Ваши письмо определено как спам, если это не так, перейдите по ссылке http://xxxxx.xxx.xx
Таким образом:
1. Пользователь уведомляется о проблеме.
2. Отправка боунсов не нужна вообще.
Ну и подумать про ВЕБ сервер и перенаправлять туда-обратно данные. Защиту от ботов поставить конечно.
если баллов столько-то, то выдавать fakereject (письмо реально проходит до пользователей), и указывать причину:
Ваши письмо определено как спам, если это не так, перейдите по ссылке http://xxxxx.xxx.xx
Таким образом:
1. Пользователь уведомляется о проблеме.
2. Отправка боунсов не нужна вообще.
Ну и подумать про ВЕБ сервер и перенаправлять туда-обратно данные. Защиту от ботов поставить конечно.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
- Alex Keda
- стреляли...
- Сообщения: 35466
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
и какой процент тех кто по ссылке ходит?
Убей их всех! Бог потом рассортирует...
- Morty
- ст. лейтенант
- Сообщения: 1370
- Зарегистрирован: 2007-07-17 23:25:12
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
вот топикстартер нам потом и раскажет
- dikens3
- подполковник
- Сообщения: 4856
- Зарегистрирован: 2006-09-06 16:24:08
- Откуда: Нижний Новгород
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Вообще проблема белого листа - это проблема получателя, а не отправителя. В данном случае перекладывается формирование белого листа на клиентов.Alex Keda писал(а):и какой процент тех кто по ссылке ходит?
Я свою проблему решил формированием белого листа при отправке. Если от кого-либо почта не доходит, пользователь ему тупо отправляет письмо и всё, он в белом листе.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
- Alex Keda
- стреляли...
- Сообщения: 35466
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
та у всех так...
Убей их всех! Бог потом рассортирует...
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Спасибо за подсказки)
fake reject интересная мысль, но не подходит - основная цель в том, что спам-письма нужно отбрасывать (+ уведомлять отправителя о недоставке).
А так письма будут проходить ( а отправитель будет уведомлен о том, что к теме его письма добавлено ***SPAM***).
Формирование whitelist'а из отправляемых - мысль хорошая, но тоже не подходит - часто пишут совсем новые люди с новых адресов.
Кстати, их письма часто и метятся, как спам, по понятным причинам
Ходить по ссылке, действительно, не все будут, и не все смогут.
Особенно не смогут пользователи всяких blackberry.
Если смотреть по баллам, то 5 баллов - вполне достаточно, чтобы считать письмо спамом.
В spamassassin стоит такой же порог, а значит для таких письма будет срабатывать условие:
Т.е. можно смотреть не на превышение баллов, а на это условие.
Очень понравилась мысль про системный фильтр.
Можно слать письмо с адреса nospam@domain (ну или nespam@, herspam@ ).
Чтобы пользователь мог тупо нажать "ответить".
Нужно только посмотреть, можно ли туда включить кусок письма пользователя (которое определилось, как спам).
А то пользователь напишет, пожалуется, а понять, почему его посчитали за спам, будет не из чего.
Ну или сделать этот nospam@ автоматическим - все, кто сюда напишут, попадут в вайтлист (для чего я и привел варианты типа herspam@, чтобы спам-боты туда письма не слали).
Ещё хочу спросить у вас.
В случае:
message - это будет просто сообщение, или полноценное письмо?
Если сообщение, то почтовый сервер отправителя включит это сообщение в письмо о недоставке.
А ещё включит туда кучу текста на английском, чем отобьет желание отправителя читать и мой текст.
А ещё, если это сообщение, то когда отправитель - наш же клиент (ну, шлют друг другу в пределах одного почтового сервера), то он увидит не письмо, а окошко с сообщением.
Окошко с сообщением - это ещё в лучшем случае (если почтовый клиент - thunderbird).
Всякие outlook'и вообще любят не показывать серверное сообщение об ошибке
fake reject интересная мысль, но не подходит - основная цель в том, что спам-письма нужно отбрасывать (+ уведомлять отправителя о недоставке).
А так письма будут проходить ( а отправитель будет уведомлен о том, что к теме его письма добавлено ***SPAM***).
Формирование whitelist'а из отправляемых - мысль хорошая, но тоже не подходит - часто пишут совсем новые люди с новых адресов.
Кстати, их письма часто и метятся, как спам, по понятным причинам
Ходить по ссылке, действительно, не все будут, и не все смогут.
Особенно не смогут пользователи всяких blackberry.
Если смотреть по баллам, то 5 баллов - вполне достаточно, чтобы считать письмо спамом.
В spamassassin стоит такой же порог, а значит для таких письма будет срабатывать условие:
Код: Выделить всё
spam = ....
Очень понравилась мысль про системный фильтр.
Можно слать письмо с адреса nospam@domain (ну или nespam@, herspam@ ).
Чтобы пользователь мог тупо нажать "ответить".
Нужно только посмотреть, можно ли туда включить кусок письма пользователя (которое определилось, как спам).
А то пользователь напишет, пожалуется, а понять, почему его посчитали за спам, будет не из чего.
Ну или сделать этот nospam@ автоматическим - все, кто сюда напишут, попадут в вайтлист (для чего я и привел варианты типа herspam@, чтобы спам-боты туда письма не слали).
Ещё хочу спросить у вас.
В случае:
Код: Выделить всё
drop ....(спамассасин балы)
message = "Your message was detected as possible spam, if it NOT spam
contact admin@mydomain.com for whitelisting your mail-srv"
Если сообщение, то почтовый сервер отправителя включит это сообщение в письмо о недоставке.
А ещё включит туда кучу текста на английском, чем отобьет желание отправителя читать и мой текст.
А ещё, если это сообщение, то когда отправитель - наш же клиент (ну, шлют друг другу в пределах одного почтового сервера), то он увидит не письмо, а окошко с сообщением.
Окошко с сообщением - это ещё в лучшем случае (если почтовый клиент - thunderbird).
Всякие outlook'и вообще любят не показывать серверное сообщение об ошибке
<'\/'>
- dikens3
- подполковник
- Сообщения: 4856
- Зарегистрирован: 2006-09-06 16:24:08
- Откуда: Нижний Новгород
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
XoRe писал(а):Но в почтовые ящики этот спам все равно проходит (чтобы не терялась нормальная почта, которую определили под спам).
То отбрасывать, то нет.XoRe писал(а):fake reject интересная мысль, но не подходит - основная цель в том, что спам-письма нужно отбрасывать (+ уведомлять отправителя о недоставке).
Сделайте просто deny.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
- Morty
- ст. лейтенант
- Сообщения: 1370
- Зарегистрирован: 2007-07-17 23:25:12
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
составь любой acl deny (по хосту или email ...) так чтоб ты под него попалmessage - это будет просто сообщение, или полноценное письмо?
и посмотри что получиться
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Да, так и получается.Morty писал(а):составь любой acl deny (по хосту или email ...) так чтоб ты под него попал
и посмотри что получиться
Если в пределах одного сервера, то почтовый клиент не дает отправить и показывает ошибку.
Если с сервера на сервер, то приходит письмо "Delivery to the following recipient failed permanently:"
Выжарусь более точно:dikens3 писал(а):То отбрасывать, то нет.
Сделайте просто deny.
Нужно отбрасывать письма и посылать bounce письмо с моим текстом.
Deny - да, но вместе с ним нужно отправить письмо, в котором сказать, что делать.
Чтобы, в случае ошибки, отправитель мог понять, в чем дело и достучаться до сервера.
Обычное message не пойдет - оно или сразу покажет ошибку окошком (не письмом), либо добавит в письмо много лишнего текста.
Кстати, а никто не реализовывал такую мысль?
Проверять subject на предмет, скажем, "no_spam".
Если такое есть, то пропускать письмо (и добавлять в whitelist).
Ну и в bounce письмах писать "отправьте это письмо ещё раз, только добавьте в тему no_spam".
Эдакая kaptcha )
У нас почтовый сервер не настолько большой, чтобы спаммеры вносили изменения в свои спам-боты, чтобы те правильно реагировали на такое.
Я подумал, что так будет дешево, сердито и эффективно)
<'\/'>
- Morty
- ст. лейтенант
- Сообщения: 1370
- Зарегистрирован: 2007-07-17 23:25:12
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
http://dspamwiki.expass.de/Installation/Exim/EximКстати, а никто не реализовывал такую мысль?
Проверять subject на предмет, скажем, "no_spam".
только там по local_part
PS: ты лучше вектор задай себе а то кидаешься то так то эдак, что сам понимать будешь что удобно юзеру будет и потом колдуй
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Мудрое руководство помогло с трудным вопросом определения вектора (читаем: не оценило оригинальную идею с no_spam ).Morty писал(а): PS: ты лучше вектор задай себе а то кидаешься то так то эдак, что сам понимать будешь что удобно юзеру будет и потом колдуй
Буду делать через system_filter.
Отпишусь сюда о результатах, вдруг ещё кому пригодится)
<'\/'>
- Morty
- ст. лейтенант
- Сообщения: 1370
- Зарегистрирован: 2007-07-17 23:25:12
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
давай)
будем ждать твоих впечатлений)
будем ждать твоих впечатлений)
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
После чтения документации, реализовал такой вариант.
В system filter:
System filter работает со следующими параметрами:
Ну и для отсылки писем используется транспорт remote_smtp:
Письма сохраняются в файлы /var/spool/exim/.yyy_spam_save/${message_exim_id}.save (транспорт system_save работает).
А вот сформированные письма не хотят отсылаться.
Выдают такую ошибку:
2010-05-17 09:58:01 >lexore@gmail.com <system-filter> T=remote_smtp defer (-1): remote_smtp transport called with no hosts set
Гугление дало немного результатов.
Пробовал сделать отдельный транспорт с такими параметрами:
Я предположил, что hosts - это то, откуда могут присылать письма через этот транспорт.
С ним ругается так:
May 17 16:51:38 ns exim[27193]: 1ODznC-0006yy-HL == >lexore@gmail.com <system-filter> T=system_smtp defer (0): system_smtp transport found host localhost.nnt.ru to be local
В system filter:
Код: Выделить всё
# Exim filter
if $header_subject: contains "HOIMAMAHOI" and
$sender_address is "${lookup mysql{REPLACE INTO yyy_spam_save SET `address` = '$sender_address', \
`date` = now(), `message_id` = '$message_exim_id', `active` = 1}{$sender_address}}" and
not $header_x-yyy-spam: is "answer"
then
save ".yyy_spam_save/${message_exim_id}.save"
mail to $sender_address
from arbuse@yyy.ru
extra_headers "X-yyy-spam: answer"
subject "TUK-TUK"
expand file "/var/spool/mail/.yyy_spam_save/.text"
seen finish
endif
Код: Выделить всё
system_filter = /etc/exim/system-filter
#system_filter_pipe_transport = address_pipe
system_filter_user = mail
system_filter_group= mail
system_filter_file_transport = system_save
system_filter_reply_transport = remote_smtp
Код: Выделить всё
remote_smtp:
driver = smtp
dkim_selector = yyy
dkim_private_key = /etc/exim/dk2/rsa.private
dkim_canon = nofws
dkim_domain = yyy.ru
А вот сформированные письма не хотят отсылаться.
Выдают такую ошибку:
2010-05-17 09:58:01 >lexore@gmail.com <system-filter> T=remote_smtp defer (-1): remote_smtp transport called with no hosts set
Гугление дало немного результатов.
Пробовал сделать отдельный транспорт с такими параметрами:
Код: Выделить всё
system_smtp:
driver = smtp
dkim_selector = yyy
dkim_private_key = /etc/exim/dk2/rsa.private
dkim_canon = nofws
dkim_domain = yyy.ru
hosts = localhost : 127.0.0.0/8 : 192.168.1.0/24 : 217.72.0.0/20
С ним ругается так:
May 17 16:51:38 ns exim[27193]: 1ODznC-0006yy-HL == >lexore@gmail.com <system-filter> T=system_smtp defer (0): system_smtp transport found host localhost.nnt.ru to be local
<'\/'>
- XoRe
- рядовой
- Сообщения: 13
- Зарегистрирован: 2007-10-15 18:04:04
- Откуда: Россия
- Контактная информация:
Re: На спам отвечать письмом, с инфой как добавиться в вайтл
Короче.
Плюнул на не работающую отправку писем из system-filter.
Потом плюнул на не работающую отправку писем с помощью программы mail из bash.
И написал скрипт на perl, который все делает сам.
Добавил в system-filter обработку писем со спамом, и обработку писем пользователей.
Теперь схема такая:
Если письмо определилось, как спам, то в таблицу заносится запись о нем, а отсылающему генерируется письмо "напишите нам на antispam@xxx.ru".
Если отсылатель - человек, то он отвечает на письмо, system-filter ловит этот ответ, заносит человека в whitelist, и шлет ему письмо "все ОК".
После многочисленных мудоханий с кривыми стандартами, получилась рабочая схема.
Адреса и subject письма корректно парсятся и декодируются, скрипт отправляет корректные письма.
При приеме письма, его текст сохраняется в папку /var/spool/mail/.xxx_spam_save
Туда же сохраняются логи.
Смотрите, чтобы у вас эта папка существовала и exim мог в неё писать.
Ну или поменяйте на свою.
Так же, нужно везде поменять xxx на ваш домен (а то будете долбиться на xxx.ru )
Ещё момент, когда одно письмо приходит на много адресов, то и ответ идет со множества адресов
Но это уже нужно резать средствами exim.
Рекомендую сделать ящик antispam, и проверять его - некоторые могут попросить добавить в whitelist совсем не те ящики, с которых пишут.
И нужно будет добавить их ручками.
Понадобилось добавить в конфиг exim'а опцию:
А в acl для rcpt в самом начале добавить:
Плюс транспорт для сохранения сообщений в файл:
И, после всего, что у меня было с exim, получился вот такой system-filter:
Понадобилась вот такая табличка в БД:
Ну и сам скрипт /etc/exim/antispam.pl:
Плюнул на не работающую отправку писем из system-filter.
Потом плюнул на не работающую отправку писем с помощью программы mail из bash.
И написал скрипт на perl, который все делает сам.
Добавил в system-filter обработку писем со спамом, и обработку писем пользователей.
Теперь схема такая:
Если письмо определилось, как спам, то в таблицу заносится запись о нем, а отсылающему генерируется письмо "напишите нам на antispam@xxx.ru".
Если отсылатель - человек, то он отвечает на письмо, system-filter ловит этот ответ, заносит человека в whitelist, и шлет ему письмо "все ОК".
После многочисленных мудоханий с кривыми стандартами, получилась рабочая схема.
Адреса и subject письма корректно парсятся и декодируются, скрипт отправляет корректные письма.
При приеме письма, его текст сохраняется в папку /var/spool/mail/.xxx_spam_save
Туда же сохраняются логи.
Смотрите, чтобы у вас эта папка существовала и exim мог в неё писать.
Ну или поменяйте на свою.
Так же, нужно везде поменять xxx на ваш домен (а то будете долбиться на xxx.ru )
Ещё момент, когда одно письмо приходит на много адресов, то и ответ идет со множества адресов
Но это уже нужно резать средствами exim.
Рекомендую сделать ящик antispam, и проверять его - некоторые могут попросить добавить в whitelist совсем не те ящики, с которых пишут.
И нужно будет добавить их ручками.
Понадобилось добавить в конфиг exim'а опцию:
Код: Выделить всё
check_rfc2047_length = false
Код: Выделить всё
warn set acl_m1 = ${lc:${sender_address_local_part}@${sender_address_domain}}
warn set acl_m2 = ${lc:${local_part}@${domain}}
Код: Выделить всё
# system save
system_save:
driver = appendfile
file = /var/spool/mail/${address_file}
delivery_date_add
envelope_to_add
return_path_add
user = mail
group = mail
mode = 0600
directory_mode = 0750
create_directory = true
Код: Выделить всё
# recieve antispam mails
if
( $acl_m2 contains "antispam@xxx.ru"
or $h_to: contains "antispam@xxx.ru" )
and not $h_x-xxx-spam: is "answer"
and $acl_m1 is "${lookup mysql{SELECT `sender_address` FROM `xxx_spam_save` \
WHERE `sender_address` = LOWER('$acl_m1') AND `whitelisted` = 0 AND `active` = 1 LIMIT 1}}"
and $acl_m1 is "${lookup mysql{UPDATE `xxx_spam_save` SET `whitelisted` = 1, \
`whitelist_date` = now() WHERE `sender_address` = LOWER('$acl_m1') \
AND `active` = 1}{$acl_m1}}"
then
save ".xxx_spam_save/${message_exim_id}.save.antispam"
pipe "/etc/exim/antispam.pl \"antispam\" \"$acl_m1\" \"$h_from:\" \"$rh_from:\" \"$acl_m2\" \"$h_to:\" \"$rh_to:\" \"$h_subject:\" \"$rh_subject:\""
unseen finish
endif
# block spam mails
if
not $acl_m3 is "accept"
and not $acl_m1 contains "MAILER-DAEMON@"
and not $acl_m1 is ""
and not $acl_m1 is "<>"
and not $acl_m1 is "@"
and ( $header_subject: contains "HOIMAMAHOI"
or $h_x-spam-score: contains "+++++"
or $h_x-dspam-result: contains "Spam" )
and not $acl_m2 contains "antispam@xxx.ru"
and not $h_x-xxx-spam: is "answer"
and not $acl_m1 is "${lookup mysql{SELECT `sender_address` FROM `xxx_spam_save` WHERE \
`sender_address` = LOWER('$acl_m1') and `whitelisted` = 1 AND `active` = 1 LIMIT 1}}"
and $acl_m1 is "${lookup mysql{REPLACE INTO xxx_spam_save SET `sender_address` = LOWER('$acl_m1'), \
`last_message_id` = '$message_exim_id', `active` = 1, `last_change_date` = now()}{$acl_m1}}"
then
save ".xxx_spam_save/${message_exim_id}.save.spam"
pipe "/etc/exim/antispam.pl \"spam\" \"$acl_m1\" \"$h_from:\" \"$rh_from:\" \"$acl_m2\" \"$h_to:\" \"$rh_to:\" \"$h_subject:\" \"$rh_subject:\""
seen finish
endif
Код: Выделить всё
CREATE TABLE `xxx_spam_save` (
`id` int(10) unsigned NOT NULL auto_increment,
`sender_address` varchar(255) NOT NULL default '',
`last_message_id` varchar(255) NOT NULL default '',
`whitelisted` tinyint(1) NOT NULL default '0',
`active` tinyint(1) NOT NULL default '1',
`last_change_date` datetime NOT NULL default '0000-00-00 00:00:00',
`whitelist_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`sender_address`),
KEY `id` (`id`)
) ENGINE=InnoDB;
Код: Выделить всё
#!/usr/bin/perl
$| = 1;
$debug = 1;
$log_file = '/var/spool/mail/.xxx_spam_save/' . $$ . '.sendmail';
$mailserver = 'mail.xxx.ru';
use Net::SMTP;
use Text::Iconv;
use MIME::Base64;
use MIME::QuotedPrint;
sub com_log_open
{
return unless ($debug);
return (open $log, ">$_[0]" or die "$_[0]: $!");
}
sub com_log
{
return unless ($debug);
return unless (defined $log);
print $log "$_[0]\n";
}
sub com_log_close
{
return unless ($debug);
return unless (defined $log);
close $log;
}
com_log_open $log_file;
sub stripe
{
$line = shift;
com_log "to stripe: '$line'";
chomp $line;
$line =~ s/(^\s+|\s+$|[\n\r]+)//g;
com_log "striped: '$line'";
return $line;
}
$goal = shift;
com_log "goal: '$goal'";
$from = shift;
com_log "from: '$from'";
$from_full = shift;
com_log "from_full: '$from_full'";
$from_orig = shift;
com_log "from_orig: '$from_orig'";
$to = shift;
com_log "to: '$to'";
$to_full = shift;
com_log "to_full: '$to_full'";
$to_orig = shift;
com_log "to_orig: '$to_orig'";
$subj = shift;
com_log "subj: '$subj'";
$subj_orig = shift;
com_log "subj_orig: '$subj_orig'";
$from_old = $from_full;
com_log "from_old: '$from_old'";
$to_old = $to_full;
com_log "to_old: '$to_old'";
$subj_old = $subj;
com_log "subj_old: '$subj_old'";
$from = stripe $from;
$from = lc $from;
$from =~ s/\"//g;
com_log "cool from: '$from'";
$to = stripe $to;
$to = lc $to;
$to =~ s/\"//g;
com_log "cool to: '$to'";
$from_orig = stripe $from_orig;
com_log "cool from_orig: '$from_orig'";
$to_orig = stripe $to_orig;
com_log "cool to_orig: '$to_orig'";
$subj_orig = stripe $subj_orig;
com_log "cool subj_orig: '$subj_orig'";
$subj =~ s/^[\s\t]*[SPAM] //g;
if($subj =~ /[\r\n]{0,}[\s\t]{0,}\*\*\*SPAM\*\*\*/)
{
($i, $k) = $subj =~ /^[\s\t]{0,}(.+?)[\s\t]{0,}[\r\n]{0,}[\s\t]{0,}\*\*\*SPAM\*\*\*[\s\t]{0,}(.+?)[\s\t]{0,}$/;
com_log "subj_one: '$i'";
com_log "subj_two: '$k'";
if($i eq $k)
{
com_log "subjects equal, cutting";
$subj = $i;
}
}
if(($from_encode) = $from_orig =~ /^=\?([^\?]+?)\?[^\?]*\?[^\?]+?\?\=/)
{
com_log "from_encode: '$from_encode'";
$from_convert = Text::Iconv->new($from_encode, "utf8");
$from_full = $from_convert->convert($from_full);
com_log "coded from_full: '$from_full'";
$from_result = $from_convert->retval;
com_log "from_result: '$from_result'";
}
else
{
com_log 'no from_encode';
}
if(($to_encode) = $to_orig =~ /^=\?([^\?]+?)\?[^\?]*\?[^\?]+?\?\=/)
{
com_log "to_encode: '$to_encode'";
$to_convert = Text::Iconv->new($to_encode, "utf8");
$to_full = $to_convert->convert($to_full);
com_log "coded to_full: '$to_full'";
$to_result = $to_convert->retval;
com_log "to_result: '$to_result'";
}
else
{
com_log 'no to_encode';
}
if(($subj_encode) = $subj_orig =~ /^=\?([^\?]+?)\?[^\?]*\?[^\?]+?\?\=/)
{
com_log "subj_encode: '$subj_encode'";
$subj_convert = Text::Iconv->new($subj_encode, "utf8");
$subj = $subj_convert->convert($subj);
com_log "coded subj: '$subj'";
$subj_result = $subj_convert->retval;
com_log "subj_result: '$subj_result'";
}
else
{
com_log 'no subj_encode';
}
$cut_subj = $subj;
if(length($cut_subj) > 80)
{
$cut_subj = substr $cut_subj, 0, 77;
$cut_subj .= '...';
}
$subject = encode_base64("Re: $subj", '');
chomp $subject;
com_log "encoded subject: '$subject'";
$subject = '=?UTF-8?B?' . $subject . '?=';
com_log "full subject: '$subject'";
$support_addr = 'support@xxx.ru';
$addr = 'xspam@xxx.ru';
com_log "addr: '$addr'";
$h1 = 'X-xxx-spam: answer';
com_log "h1: '$h1'";
$h2 = 'MIME-Version: 1.0';
com_log "h2: '$h2'";
$h3= 'Content-Type: text/plain; charset=UTF-8';
com_log "h3: '$h3'";
$h4 = 'Content-Transfer-Encoding: base64';
com_log "h4: '$h4'";
$h5 = "From: $to_orig";
com_log "h5: '$h5'";
$h6 = "To: $from_orig";
com_log "h6: '$h6'";
$h7 = "Subject: $subject";
com_log "h7: '$h7'";
$h8 = "Reply-To: $addr";
com_log "h8: '$h8'";
if($goal eq 'spam')
{ $text = qq~
Тут текст о том, что письмо, отправленное на адрес "$to_full" (с темой "$cut_subj") было автоматически определено как спам.
Но если вы не спаммер, а человек, напишите нам по адресу $addr (или просто ответьте на данное письмо), и вы занесетесь в вайтлист.
Желательно ещё добавить тоже самое на английском.
~; }
elsif($goal eq 'antispam')
{ $text = qq~
Тут пишите, что все хорошо, больше такого не повторится.
Ну и повторите отправку первоначального письма.
Желательно ещё добавить тоже самое на английском.
~; }
else
{ $text = qq~
Ошибка!
Error!
~; }
com_log "===TEXT===";
com_log $text;
com_log "===TEXT===";
$text = encode_base64($text);
com_log "===ENCODED TEXT===";
com_log $text;
com_log "===ENCODED TEXT===";
$smtp = Net::SMTP->new($mailserver);
$smtp->mail($to_orig);
$smtp->to($from_orig);
$smtp->data();
$smtp->datasend($h1 . "\n");
$smtp->datasend($h2 . "\n");
$smtp->datasend($h3 . "\n");
$smtp->datasend($h4 . "\n");
$smtp->datasend($h5 . "\n");
$smtp->datasend($h6 . "\n");
$smtp->datasend($h7 . "\n");
$smtp->datasend($h8 . "\n");
$smtp->datasend("\n");
$smtp->datasend($text . "\n");
$smtp->dataend();
$smtp->quit;
<'\/'>