На спам отвечать письмом, с инфой как добавиться в вайтлист

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

На спам отвечать письмом, с инфой как добавиться в вайтлист

Непрочитанное сообщение XoRe » 2010-05-06 17:28:15

Всем доброго времени суток)
Прошелся по интернету, но не смог подобрать правильный запрос к поисковику.
Прошелся по этому форуму, но не нашел идей.
Прошу помощи или совета отдельной темой.

Есть 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
Хостинг 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/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Morty » 2010-05-06 17:57:03

2 мысли вижу:
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
2) фильтром
в фильтр

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

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: может я гдето неправильно технически выразился - но идея я думаю просматриваеться :smile:

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

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение dikens3 » 2010-05-06 19:35:13

Я бы сделал по типу как на укр.нет.

если баллов столько-то, то выдавать fakereject (письмо реально проходит до пользователей), и указывать причину:
Ваши письмо определено как спам, если это не так, перейдите по ссылке http://xxxxx.xxx.xx

Таким образом:
1. Пользователь уведомляется о проблеме.
2. Отправка боунсов не нужна вообще.


Ну и подумать про ВЕБ сервер и перенаправлять туда-обратно данные. Защиту от ботов поставить конечно.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

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

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Alex Keda » 2010-05-06 22:09:56

и какой процент тех кто по ссылке ходит?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Morty » 2010-05-06 22:23:27

вот топикстартер нам потом и раскажет

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

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение dikens3 » 2010-05-07 0:23:05

Alex Keda писал(а):и какой процент тех кто по ссылке ходит?
Вообще проблема белого листа - это проблема получателя, а не отправителя. В данном случае перекладывается формирование белого листа на клиентов.

Я свою проблему решил формированием белого листа при отправке. Если от кого-либо почта не доходит, пользователь ему тупо отправляет письмо и всё, он в белом листе.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

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

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Alex Keda » 2010-05-07 9:29:28

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

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение XoRe » 2010-05-07 11:37:29

Спасибо за подсказки)
fake reject интересная мысль, но не подходит - основная цель в том, что спам-письма нужно отбрасывать (+ уведомлять отправителя о недоставке).
А так письма будут проходить ( а отправитель будет уведомлен о том, что к теме его письма добавлено ***SPAM***).

Формирование whitelist'а из отправляемых - мысль хорошая, но тоже не подходит - часто пишут совсем новые люди с новых адресов.
Кстати, их письма часто и метятся, как спам, по понятным причинам :smile:

Ходить по ссылке, действительно, не все будут, и не все смогут.
Особенно не смогут пользователи всяких 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"
message - это будет просто сообщение, или полноценное письмо?
Если сообщение, то почтовый сервер отправителя включит это сообщение в письмо о недоставке.
А ещё включит туда кучу текста на английском, чем отобьет желание отправителя читать и мой текст.
А ещё, если это сообщение, то когда отправитель - наш же клиент (ну, шлют друг другу в пределах одного почтового сервера), то он увидит не письмо, а окошко с сообщением.
Окошко с сообщением - это ещё в лучшем случае (если почтовый клиент - thunderbird).
Всякие outlook'и вообще любят не показывать серверное сообщение об ошибке =)
<'\/'>

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

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение dikens3 » 2010-05-07 11:45:22

XoRe писал(а):Но в почтовые ящики этот спам все равно проходит (чтобы не терялась нормальная почта, которую определили под спам).
XoRe писал(а):fake reject интересная мысль, но не подходит - основная цель в том, что спам-письма нужно отбрасывать (+ уведомлять отправителя о недоставке).
То отбрасывать, то нет.
Сделайте просто deny.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Morty » 2010-05-07 12:08:16

message - это будет просто сообщение, или полноценное письмо?
составь любой acl deny (по хосту или email ...) так чтоб ты под него попал
и посмотри что получиться

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение XoRe » 2010-05-07 12:47:28

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: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Morty » 2010-05-07 13:31:41

Кстати, а никто не реализовывал такую мысль?
Проверять subject на предмет, скажем, "no_spam".
http://dspamwiki.expass.de/Installation/Exim/Exim
только там по local_part

PS: ты лучше вектор задай себе :"": а то кидаешься то так то эдак, что сам понимать будешь что удобно юзеру будет и потом колдуй

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение XoRe » 2010-05-07 14:14:50

Morty писал(а): PS: ты лучше вектор задай себе :"": а то кидаешься то так то эдак, что сам понимать будешь что удобно юзеру будет и потом колдуй
Мудрое руководство помогло с трудным вопросом определения вектора (читаем: не оценило оригинальную идею с no_spam :smile: ).
Буду делать через system_filter.
Отпишусь сюда о результатах, вдруг ещё кому пригодится)
<'\/'>

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение Morty » 2010-05-07 15:11:15

давай)
будем ждать твоих впечатлений)

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение XoRe » 2010-05-17 15:54:16

После чтения документации, реализовал такой вариант.
В 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 работает со следующими параметрами:

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

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:

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

remote_smtp:
  driver                = smtp
    dkim_selector = yyy 
    dkim_private_key = /etc/exim/dk2/rsa.private
    dkim_canon = nofws
    dkim_domain = yyy.ru
Письма сохраняются в файлы /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

Гугление дало немного результатов.
Пробовал сделать отдельный транспорт с такими параметрами:

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

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
Я предположил, что 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
<'\/'>

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: На спам отвечать письмом, с инфой как добавиться в вайтл

Непрочитанное сообщение XoRe » 2010-06-08 10:58:11

Короче.
Плюнул на не работающую отправку писем из 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
А в acl для rcpt в самом начале добавить:

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

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
И, после всего, что у меня было с exim, получился вот такой system-filter:

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

# 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;
Ну и сам скрипт /etc/exim/antispam.pl:

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

#!/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;
<'\/'>