Как автоматизировать отправку жалоб в Spamcop
Введение
Spamcop — сервис, предоставляющий RBL (Real-time Blackhole List) для почтовых серверов, чтобы отклонять входящую почту от известных спамеров. Система опирается на отчёты от пользователей: когда собирается достаточное число жалоб за отрезок времени, нарушитель попадает в чёрный список.
Оригинальная форма отправки жалоб у Spamcop требует ручного вмешательства: переслать письмо на адрес, полученный при регистрации, или скопировать заголовки и тело в веб-форму, затем подтвердить запись по ссылке в письме. Для администраторов и операторов, получающих много спама, это может быть очень утомительно.
Проблема
Spamcop работает только если пользователи активно отправляют и подтверждают жалобы. Ручной процесс — копирование заголовков, отправка и подтверждение по ссылке — рутинен и медлителен. Из-за этого многие жалобы удаляются вместо отправки, что уменьшает качество RBL.
Важно: автоматизация экономит время, но требует аккуратности — неправильная автоматизация может привести к ложным жалобам или срыву процесса обработки почты. Перед развёртыванием протестируйте систему на тестовом аккаунте Spamcop.
Решение — кратко
Идея простая: настроить почтовый поток так, чтобы потенциальный спам попадал в специальную папку Maildir/cur. Скрипт на bash пробегает по этой папке и пересылает каждое письмо на выделенный адрес Spamcop (адрес даётся при регистрации). Второй скрипт обрабатывает входящие письма от Spamcop (папка с ответами), извлекает ссылки подтверждения и передаёт их в локальный PHP-скрипт, который программно заполняет и отправляет форму подтверждения на сайт Spamcop. Все шаги запускаются по расписанию с помощью cron.
Требования и предпосылки
Кратко — что нужно иметь:
- Почтовая папка в формате Maildir (скрипты обходят директорию файловых сообщений, поэтому mbox не подойдёт).
- Умение настраивать cron.
- Bash-скрипты и возможность запускать PHP из командной строки (в примере использован lynx для доступа к PHP-скрипту по HTTP).
- Установка mime-construct для правильной пересылки вложенного сообщения.
- Класс Snoopy (PHP) для эмуляции HTTP-запросов/форм.
- Возможность фильтровать входящую почту (например, procmail), чтобы ответы от Spamcop попадали в отдельную папку.
Примечание: инструкции рассчитаны на Linux-систему с установленными apt-пакетами, bash, PHP и lynx. Если у вас иная ОС или альтернативные инструменты (например, curl вместо lynx), можно адаптировать команды.
Что будет сделано — шаги высокого уровня
- Создать аккаунт в Spamcop.
- Настроить фильтр, помещающий спам в Maildir/.Spam/cur/.
- Скрипт пересылки (fe.sh) периодически перебирает письма и пересылает их на адрес Spamcop.
- Spamcop пришлёт письмо с ссылкой подтверждения — настроить фильтр, который складывает такие письма в Maildir/.Spamcop-Reply/cur/.
- Скрипт верификации (vs.sh) извлекает sc?id=… строки и передаёт их в локальный PHP-скрипт.
- PHP-скрипт (index.php) использует Snoopy для получения формы подтверждения и отправки её на сервер Spamcop.
- Всё это запускается через cron.
Создание аккаунта Spamcop
Зарегистрируйтесь на сайте Spamcop и запомните адрес для пересылки жалоб, который вы получите при регистрации. Этот адрес понадобится в переменной EMAIL в fe.sh.
Важно: используйте отдельный почтовый адрес или catch-all с фильтрами, чтобы ответы от Spamcop можно было отделить от общего потока почты.
Папка для спама
Создайте папку «Spam» в вашей Maildir-структуре. В Maildir важна папка cur: пример пути в статье — /home/mail/web4p1/Maildir/.Spam/cur/
Примечание: скрипт ожидает, что спам будет появляться именно в cur; если ваша система кладёт новые письма в new, адаптируйте путь или процесс перемещения.
Скрипт пересылки — fe.sh
Ниже приведён оригинальный скрипт пересылки без изменений. Отредактируйте переменные FPATH и EMAIL под ваш случай.
#!/bin/bash
# ENTER PATH OF THE EMAILS THAT ARE TO BE SUBMITTED TO SPAMCOP
FPATH="/home/mail/web4p1/Maildir/.Spam/cur"
# ENTER YOUR SPAMCOP EMAIL ADDRESS
EMAIL="........ a.t. spam.spamcop.net"
#################################################################
#################################################################
cd $FPATH
for FILENAME in *
do
# Create email and submit it to the supplied spamcop address
/usr/bin/mime-construct \
--subject "Forwarded spam (MIME encoded)" \
--attachment "Original message" \
--type message/rfc822 \
--encoding base64 \
--file $FILENAME \
--to "$EMAIL"
# Train this email to be spam to the bayesian SA filters
/usr/bin/sa-learn --spam $FILENAME
# Delete email
/bin/rm $FILENAME
doneПояснения и рекомендации:
- FPATH — путь к каталогу с письмами (Maildir/.Spam/cur).
- EMAIL — адрес, полученный от Spamcop при регистрации. В примере он записан в необычном формате; укажите точный адрес.
- mime-construct упаковывает оригинальное сообщение как вложение типа message/rfc822 — это нужно Spamcop.
- sa-learn –spam обучает локальную базу SpamAssassin; если вы не используете SA, удалите эту строку.
- Удаление файла в конце предотвращает повторную отправку.
Важно: перед массовым удалением убедитесь, что скрипт корректно пересылает и что не возникает ошибок. Рекомендуется изначально не удалять файлы, пока не убедитесь, что процесс работает.
Скрипт верификации — vs.sh
Этот скрипт обрабатывает входящие письма от Spamcop, извлекает URL с параметром sc?id= и пересылает его в локальную PHP-точку, которая затем выполняет фактическую отправку подтверждения.
#!/bin/bash
# ENTER PATH OF THE VERIFICATION EMAILS FROM SPAMCOP
FPATH="/home/mail/web4p1/Maildir/.Spamcop-Reply/cur"
# ENTER WEBPATH TO PHP SCRIPT
URL="http://www.domain.com/spamcop/index.php"
#################################################################
#################################################################
cd $FPATH
for FILENAME in *
do
# Get the supplied URL from the spamcop email
DATA=`/bin/grep -F http://www.spamcop.net/sc?id= $FILENAME`
echo $DATA
# Submit the URL to the PHP script
/usr/bin/lynx -dump $URL?data=$DATA
# Remove that file
/bin/rm $FILENAME
doneПояснения:
- FPATH — путь к папке с ответами Spamcop.
- URL — локальный HTTP-адрес к файлу index.php (см. ниже).
- Команда grep извлекает строку с sc?id=; если формат письма отличается, регулярное выражение нужно адаптировать.
- lynx -dump вызывает URL, что эквивалентно GET-запросу; можно использовать curl или wget при желании.
Важно: убедитесь, что входящие письма от Spamcop корректно фильтруются в отдельную папку, иначе скрипт будет обрабатывать неверные сообщения.
PHP-скрипт отправки формы — index.php
Этот PHP-скрипт (использующий Snoopy.class.php) получает HTML-форму подтверждения от Spamcop, парсит поля и программно отправляет POST-запрос.
Содержимое index.php (оставлено без изменений):
0)) {
print("");
print("Key Value ");
foreach ($aArray as $aKey => $aValue) {
print("");
if (!is_array($aValue)) {
if (empty($aValue)) {
print("$aKey $aValue ");
} else {
print("$aKey $aValue ");
}
} else {
print("$aKey(array) ");
displayArray($aValue);
print(" ");
}
print(" ");
}
print("
");
} else {
print("empty or invalid");
}
}
// The default form fields (those are being repeated to everyone the mail is sent to)
$offender = array("type", "master", "info", "sc_comment", "comment");
// The default form fields (these are the unique fields)
$form_vars = array("action", "spamid", "crc", "date", "source", "reports", "goodrelay", "max", "notes");
// Get the URL from the attached parameters
$data_org = $_GET["data"];
// Split it at sc?id= so that you have the "id code" only
$data = explode("sc?id=", $data_org);
$data = $data[1];
// Just some verification
echo "SC-ID: " . $data;
if($data == "") {
echo "done";
exit;
}
echo "
";
// Require the snoopy class for retrieving the form
require_once("Snoopy.class.php");
$snoopy = new Snoopy;
$snoopy->fetch("http://www.spamcop.net/sc?id=" . $data);
$results = $snoopy->results;
// Another verification that it is actually a spam email that can be submitted....
$results = explode('Заметки:
- Скрипт выводит таблицу с данными перед отправкой — это удобно для отладки, но в рабочей системе можно отключить вызов displayArray.
- Строку $submit_vars[“send”.$i] = “on” можно удалить, но тогда нужно добавить поле “on” в массив $offender, как описано в исходной статье. Одна версия заставляет Spamcop отправлять письма на найденные адреса, другая — только отмечает отправку по рекомендациям Spamcop.
Настройка cron
Пример cron-файла (cron.txt):
0,20,40 * * * * /bin/sh /PATH/TO/fe.sh
10,30,50 * * * * /bin/sh /PATH/TO/vs.shВ рабочем варианте автор использовал:
0,20,40 * * * * /bin/sh /home/mail/web4p1/fe.sh > /home/mail/web4p1/output1.txt
10,30,50 * * * * /bin/sh /home/mail/web4p1/vs.sh > /home/mail/web4p1/output2.txtДобавление перенаправления вывода помогает в отладке. Добавьте задание в crontab так:
crontab -uUSER cron.txtЕсли вы запускаете от имени нужного пользователя, опция -uUSER не обязательна. Не рекомендуется запускать всю цепочку от root.
Финальные заметки и рекомендации
- Проверьте права доступа (chown/chmod) для всех скриптов и папок. Скрипты должны быть исполняемыми для пользователя, от имени которого работают cron задачи.
- Убедитесь, что вы не отправляете одно и то же письмо несколько раз — это может снизить вашу репутацию и качество данных Spamcop.
- Настройте резервную копию скриптов и конфигурации.
- Начните с более редких запусков cron (например, 1 раз в час), затем уменьшайте интервал, если нужно больше оперативности.
Важно: автоматизация ускоряет процесс включения IP/домена в RBL, но может привести к ложным срабатываниям. Контролируйте логи и проверяйте случаи спорных отправок.
Альтернативные подходы
- Использовать curl вместо lynx. Например: curl -G –data-urlencode “data=$DATA” “$URL”. Это даёт больше контроля над таймаутами и кодировками.
- Писать на Python с использованием requests и mailparser для более надёжного парсинга писем.
- Использовать API (если Spamcop предоставляет), вместо эмуляции веб-формы — это надежнее и стабильнее.
Когда автоматизация может не подойти:
- Если в вашей доменной зоне много переадресаций и вы не уверены, что пересылаемые письма содержат корректные заголовки.
- Если политика организации запрещает автоматическую отправку жалоб третьим лицам.
Мини-методология развёртывания (шаги для безопасного запуска)
- Подготовьте тестовую виртуальную машину с Maildir и тестовым аккаунтом Spamcop.
- Настройте фильтрацию спама в тестовую папку.
- Запустите fe.sh вручную на паре тестовых писем и проверьте, что Spamcop получил письма.
- Отслеживайте возвращаемые письма от Spamcop и убедитесь, что vs.sh корректно извлекает sc?id=.
- Запустите index.php вручную через браузер/lynx и проследите результат.
- Включите cron с частотой 1 раз в час. Мониторьте логи 24–72 часа.
- При успешных тестах уменьшайте интервал cron.
Рольные контрольные списки
Администратор:
- Убедиться, что Maildir работает и имеет правильную структуру.
- Настроить фильтры procmail/postfix для выделения писем в .Spam и .Spamcop-Reply.
- Назначить пользователя, от имени которого будут запускаться cron-задачи.
- Безопасно настроить права на скрипты.
Оператор службы поддержки:
- Проверить выборку писем для пересылки на предмет ложных срабатываний.
- Мониторить логи cron и output файлы.
- Поддерживать список исключений (например, доверенные адреса, которые не должны отправляться).
Разработчик/интегратор:
- Адаптировать парсинг в vs.sh при изменении формата писем от Spamcop.
- Перевести обработку в стабильный инструмент (curl/PHP-CLI/Python) при необходимости.
Безопасность и конфиденциальность
- Не отправляйте в Spamcop конфиденциальную информацию, если это противоречит политике вашей организации.
- Логи с содержимым писем должны иметь ограниченный доступ — чувствительные данные могут находиться в сообщениях.
- Соблюдайте GDPR/локальные правила при обработке персональных данных: если письма содержат персональные данные пользователей, организуйте процесс с учётом юридических требований.
- Минимизируйте хранение исходных писем: либо удаляйте после успешной отправки, либо архивируйте в защищённое хранилище с шифрованием.
Критерии приёмки
- fe.sh успешно пересылает письма в Spamcop и возвращает HTTP 200/правильные заголовки для доставленных сообщений.
- vs.sh извлекает sc?id= ссылки и передаёт их в PHP-скрипт.
- index.php корректно получает форму с Spamcop и отправляет подтверждение (видно в выводе Snoopy или в логах Spamcop).
- Отсутствуют дублирующиеся отправки одного и того же сообщения.
- Cron запускается с нужной периодичностью и без ошибок.
Отладка и откат
- Если произошли неправильные отправки: временно остановите cron (crontab -r или закомментируйте задания), восстановите из резервной копии и проанализируйте логи.
- Для диагностики включайте вывод в файлы (как в примере с output1.txt/output2.txt) и проверяйте их через несколько циклов.
- Если Spamcop изменил формат страницы, index.php может перестать работать — откатите на версию до изменений и подготовьте новую логику парсинга.
Тесты и критерии приёмки
Тесты:
- Т1: отправить тестовое письмо в .Spam/cur и вручную запустить fe.sh — убедиться, что письмо дошло до Spamcop.
- Т2: получить автоматический ответ от Spamcop, положить его в .Spamcop-Reply/cur и вручную запустить vs.sh — убедиться, что index.php вызван с корректным параметром.
- Т3: симулировать ошибку сети и проверить, что скрипты корректно логируют ошибку и не удаляют исходные файлы, пока не подтверждён успех.
Критерии приёмки — все тесты проходят без потери исходных сообщений и без дублирующих отправок.
Словарь терминов (одно предложение)
- Maildir — файловая структура для хранения почты, где каждое письмо — отдельный файл.
- RBL — список IP/доменных имён, использующихся для блокировки спама.
- Snoopy — PHP-класс для эмуляции HTTP-клиента и работы с веб-формами.
- mime-construct — утилита для создания писем и вложений в формате MIME.
Заключение
Автоматизация процесса отправки и подтверждения жалоб в Spamcop экономит время и повышает объём полезных данных для RBL. При правильной настройке и контроле автоматическая цепочка пересылки и верификации работает надёжно. Начинайте с тестов, ограничивайте частоту и контролируйте логи. При изменениях на стороне Spamcop поддерживайте и обновляйте парсинг в PHP-скрипте.
Если у вас есть улучшения или пожелания — опишите, какая часть процесса вас интересует (парсинг, безопасность, замена lynx на curl, миграция на Python), и я помогу адаптировать.
Похожие материалы
Сброс Samsung при заблокированном телефоне
Как разогнать монитор через NVIDIA Control Panel
APC_INDEX_MISMATCH: как исправить BSOD в Windows
Как исправить ошибку Blink 1011