Гид по технологиям

Как автоматизировать отправку жалоб в Spamcop

9 min read Email Automation Обновлено 27 Nov 2025
Автоматизация отправки жалоб в Spamcop
Автоматизация отправки жалоб в 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), можно адаптировать команды.

Что будет сделано — шаги высокого уровня

  1. Создать аккаунт в Spamcop.
  2. Настроить фильтр, помещающий спам в Maildir/.Spam/cur/.
  3. Скрипт пересылки (fe.sh) периодически перебирает письма и пересылает их на адрес Spamcop.
  4. Spamcop пришлёт письмо с ссылкой подтверждения — настроить фильтр, который складывает такие письма в Maildir/.Spamcop-Reply/cur/.
  5. Скрипт верификации (vs.sh) извлекает sc?id=… строки и передаёт их в локальный PHP-скрипт.
  6. PHP-скрипт (index.php) использует Snoopy для получения формы подтверждения и отправки её на сервер Spamcop.
  7. Всё это запускается через 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("");  
                foreach ($aArray as $aKey => $aValue) {  
                        print("");  
                        if (!is_array($aValue)) {  
                                if (empty($aValue)) {  
                                        print("");  
                                } else {  
                                        print("");  
                                }  
                        } else {  
                                print("");  
                        }  
                        print("");  
                }  
                print("
KeyValue
$aKey$aValue$aKey$aValue$aKey(array)"); displayArray($aValue); 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('
", $pos_start); $res = substr($results, $pos_start, $pos_end); $res = explode('"', $res); $res = $res[1]; if($val == "comment") { $res = ""; } $submit_vars["send".$i] = "on"; $submit_vars[$val.$i] = $res; } $i--; } $submit_vars["submit"] = "Send Spam Report(s) Now"; foreach($form_vars as $val) { // Get Field Value $findme = 'name="' . $val . '"'; $offset = strlen($findme); $pos_start = strpos($results, $findme) + $offset; $pos_end = strpos($results, ">", $pos_start); $res = substr($results, $pos_start, $pos_end); $res = explode('"', $res); $res = $res[1]; if($val == "notes") { $res = ""; } $submit_vars[$val] = $res; } // Display the data to be sent --> can be deactivated displayArray($submit_vars); // Create a new instance to submit the form data $snoopy = new Snoopy; $submit_url = "http://www.spamcop.net/sc"; if($snoopy->submit($submit_url,$submit_vars)) { while(list($key,$val) = each($snoopy->headers)) { echo $key.": ".$val."
\n"; } echo "

\n"; echo "

".htmlspecialchars($snoopy->results)."
\n"; } else { echo "error fetching document: ".$snoopy->error."\n"; } ?>

Заметки:

  • Скрипт выводит таблицу с данными перед отправкой — это удобно для отладки, но в рабочей системе можно отключить вызов 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.

Финальные заметки и рекомендации

  1. Проверьте права доступа (chown/chmod) для всех скриптов и папок. Скрипты должны быть исполняемыми для пользователя, от имени которого работают cron задачи.
  2. Убедитесь, что вы не отправляете одно и то же письмо несколько раз — это может снизить вашу репутацию и качество данных Spamcop.
  3. Настройте резервную копию скриптов и конфигурации.
  4. Начните с более редких запусков cron (например, 1 раз в час), затем уменьшайте интервал, если нужно больше оперативности.

Важно: автоматизация ускоряет процесс включения IP/домена в RBL, но может привести к ложным срабатываниям. Контролируйте логи и проверяйте случаи спорных отправок.

Альтернативные подходы

  • Использовать curl вместо lynx. Например: curl -G –data-urlencode “data=$DATA” “$URL”. Это даёт больше контроля над таймаутами и кодировками.
  • Писать на Python с использованием requests и mailparser для более надёжного парсинга писем.
  • Использовать API (если Spamcop предоставляет), вместо эмуляции веб-формы — это надежнее и стабильнее.

Когда автоматизация может не подойти:

  • Если в вашей доменной зоне много переадресаций и вы не уверены, что пересылаемые письма содержат корректные заголовки.
  • Если политика организации запрещает автоматическую отправку жалоб третьим лицам.

Мини-методология развёртывания (шаги для безопасного запуска)

  1. Подготовьте тестовую виртуальную машину с Maildir и тестовым аккаунтом Spamcop.
  2. Настройте фильтрацию спама в тестовую папку.
  3. Запустите fe.sh вручную на паре тестовых писем и проверьте, что Spamcop получил письма.
  4. Отслеживайте возвращаемые письма от Spamcop и убедитесь, что vs.sh корректно извлекает sc?id=.
  5. Запустите index.php вручную через браузер/lynx и проследите результат.
  6. Включите cron с частотой 1 раз в час. Мониторьте логи 24–72 часа.
  7. При успешных тестах уменьшайте интервал 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), и я помогу адаптировать.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Сброс Samsung при заблокированном телефоне
Мобильные устройства

Сброс Samsung при заблокированном телефоне

Как разогнать монитор через NVIDIA Control Panel
Гайды

Как разогнать монитор через NVIDIA Control Panel

APC_INDEX_MISMATCH: как исправить BSOD в Windows
Инструкции

APC_INDEX_MISMATCH: как исправить BSOD в Windows

Как исправить ошибку Blink 1011
Техническая поддержка

Как исправить ошибку Blink 1011

Восстановление удалённых SMS на Samsung
Мобильные

Восстановление удалённых SMS на Samsung

Как сбросить Samsung планшет до заводских настроек
Руководство

Как сбросить Samsung планшет до заводских настроек