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

Как автоматизировать отправку жалоб в 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
Автор
Редакция

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство