Машина Для E-mail Спамминга

Тема в разделе "Базовые решения", создана пользователем BlackShadow, 21 ноя 2012.

  1. BlackShadow

    BlackShadow Well-Known Member

    Регистрация:
    4 фев 2011
    Сообщения:
    111
    Симпатии:
    1
    Я сейчас работаю фрилансером на одном хорошем сайте и как-то мне встретилось задание по рассылке спам-сообщений на мыла. Я долго думал над реализацией кода и пришел к хорошему результату. Единственная проблема, которая была - это количество адресов. Их было порядка 24 000.

    Естественно, сервер бы не выдержал нагрузки в 24 000 письма при отправке через мой любимый SMTP путем присоединения адресата запросом "RCPT TO". И с того момента я родил целую домашнюю спам-машину. И пока я пишу данный топик, машина отправляет эти письма.

    Она состоит из:
    • index.php - основной и начальный файл, где происходит первичная настройка SMTP и MySQL
    • savesettings.php - сохраняет данные, указанные в index.php
    • spamsettings.php - здесь происходит настройка письма (указывается тема, кому, от кого и текст письма)
    • savespamsettings.php - сохраняет данные, указанные в spamsettings.php
    • startspam.php - непосредственно рабочий файл, который формирует SMTP-запрос и отправляет письмо.
    • addinmysql.php - добавочный файл, который позволяет из текстового файла с адресами (отделенные переносом строки) импортировать данные в MySQL-базу, откуда в будущем будут браться эти же адреса. Здесь адреса очищаются от лишней информации + удаляются повторяющиеся адреса

    Как я воплотил отправку? А просто. Я сделал счетчик, количество которого сохранил в файле start.txt. Он начинается с нуля. В файле limit.txt я храню лимит сообщений за один SMTP-запрос (например, число 10). И постепенно прибавляю число start.txt на число в limit.txt посредством мета-тега обновления, пока оно не станет равным количеству адресов в массиве.

    "Каком массиве?" спросите вы. Я отвечу, что перед тем, как выбрать следующую порцию адресатов, я добавляю ВСЕХ адресатов в массив из MySQL-базы. А потом уже путем цикла FOR прикрепляю текущий десяток адресов.

    Вот рабочий файл startspam.php с комментариями, которые только тут:
    Код (PHP):
    <small><?php
    set_time_limit(0); // устанавливаю лимит на 0
    $act = $_GET['act']; // это переменная задается в файле spamsettigs.php. Она решает, разово ли послать письмо или существующей MySQL-базе
    $fl = "serversettings.txt"; // в этом файле хранятся сохраненные данные о настройке сервера и MySQL
    $data = "";
    $fp = fopen($fl,"r");
    while(!feof($fp)){
    $data .= fgets($fp,2);
    }
    fclose($fp);
    $arr_data = explode("|",$data); // превращаю полученные данные в массив
    $mail_server = $arr_data[0]; // сервер почты (в виде "yandex.ru", к примеру)
    $smtp_port = $arr_data[1]; // порт SMTP
    $smtp_login = $arr_data[2]; // ваш логин для указанного сервера почты
    $smtp_password = $arr_data[3]; // ваш пароль для логина для указанного сервера почты
    $sql_server = $arr_data[4]; // сервер с mysql-базой (лучше всё делать на денвере, поэтому localhost)
    $sql_user = $arr_data[5]; // пользователь mysql-базы (root)
    $sql_password = $arr_data[6]; // пароль для пользователя mysql-базы (пустое поле)
    $sql_db = $arr_data[7]; // база данных с адресами
    $sql_table = $arr_data[8]; // таблица с адресами

    $smtp_server = "smtp.".$mail_server; // формируем SMTP-сервер
    // ВЫВОД ДАННЫХ ДЛЯ ПРОВЕРКИ
    echo "
    <hr/>
    <b>Данные сервера:</b><br/>
    mail_server = $mail_server<br/>
    smtp_port = $smtp_port<br/>
    smtp_login = $smtp_login<br/>
    smtp_password = $smtp_password<br/>
    sql_server = $sql_server<br/>
    sql_user = $sql_user<br/>
    sql_password = $sql_password<br/>
    sql_db = $sql_db<br/>
    sql_table = $sql_table<br/>
    smtp_server = $smtp_server<br/>
    "
    ;

    $fl = "spamsettings.txt"; // файл для хранения данных о письме

    $data = "";
    $fp = fopen($fl,"r");
    while(!feof($fp)){
    $data .= fgets($fp,2);
    }
    fclose($fp);

    $arr_data = explode("|",$data); // то же, что и с сервером

    $subject = $arr_data[0]; // тема письма
    $TOname = $arr_data[1]; // для кого (имя)
    $TOemail = $arr_data[2]; // для кого (email) - необходимо при разовой рассылке
    $FROMname = $arr_data[3]; // от кого (имя) - любое
    $FROMemail = $arr_data[4]; // от кого (email) - ЛЮБОЙ, хоть putin@vvp.ru

    $txt = "";
    $fp = fopen("mail.txt","r");
    while(!feof($fp)){
    $txt .= fgets($fp,2); // получаем текст письма
    }
    fclose($fp);

    // ВЫВОД ДАННЫХ О ПИСЬМЕ
    echo "
    <hr/>
    <b>Данные письма:</b><br/>
    subject = $subject<br/>
    Oname = $TOname<br/>
    TOemail = $TOemail<br/>
    FROMname = $FROMname<br/>
    FROMemail = $FROMemail<br/>
    "
    ;


    // ФУНКЦИЯ ОТПРАВКА ЗАПРОСА
    function get_data($smtp_conn){
    $data="";
    while($str = @fgets($smtp_conn,515)){
    $data .= $str;
    if(substr($str,3,1) == " "){
    break;
    }
    }
    return $data;
    }

    // ФОРМИРУЕМ ЗАГОЛОВОК ПИСЬМА
    $header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
    $header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($FROMname)))."?= <".$FROMemail.">\r\n";
    $header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
    $header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($FROMname)))."?= <".$FROMemail.">\r\n";
    $header.="X-Priority: 3 (Normal)\r\n";
    $header.="Message-ID: <172562218.".date("YmjHis")."@".$mail_server.">\r\n";
    $header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($TOname)))."?= ".$TOemail."\r\n";
    $header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode($subject)))."?=\r\n";
    $header.="MIME-Version: 1.0\r\n";
    $header.="Content-Type: text/plain; charset=windows-1251\r\n";
    $header.="Content-Transfer-Encoding: 8bit\r\n";

    // ПОДКЛЮЧАЕМСЯ К СЕРВЕРУ
    $smtp_conn = fsockopen($smtp_server, $smtp_port,$errno, $errstr, 10);
    if(!$smtp_conn){
    echo "соединение с сервером не прошло";
    fclose($smtp_conn);
    }
    // ПОЛУЧАЕМ ДОСТУП К СЕРВЕРУ
    $data = get_data($smtp_conn);
    fputs($smtp_conn,"EHLO ".$mail_server."\r\n");
    $code = substr(get_data($smtp_conn),0,3);
    if($code != 250){
    echo "Ошибка приветсвия EHLO";
    fclose($smtp_conn);
    }

    // ПРОБУЕМ ЗАПУСТИТЬ АВТОРИЗАЦИЮ
    fputs($smtp_conn,"AUTH LOGIN\r\n");
    $code = substr(get_data($smtp_conn),0,3);
    if($code != 334){
    echo "Сервер не разрешил начать авторизацию";
    fclose($smtp_conn);
    }

    // ВВОДИМ ЛОГИН
    fputs($smtp_conn,base64_encode($smtp_login)."\r\n");
    $code = substr(get_data($smtp_conn),0,3);
    if($code != 334){
    echo "Ошибка доступа к такому юзеру";
    fclose($smtp_conn);
    }

    //ВВОДИМ ПАРОЛЬ
    fputs($smtp_conn,base64_encode($smtp_password)."\r\n");
    $code = substr(get_data($smtp_conn),0,3);
    if($code != 235){
    echo "Неправильный пароль";
    fclose($smtp_conn);
    }

    // ФОРМИРУЕМ ИЗНАЧАЛЬНОЕ "ОТ КОГО"
    fputs($smtp_conn,"MAIL FROM:".$smtp_login."@".$mail_server."\r\n");
    $code = substr(get_data($smtp_conn),0,3);
    if($code != 250){
    echo "Сервер отказал в команде MAIL FROM";
    fclose($smtp_conn);
    }

    // Если мы выбрали разовую рассылку
    if ($act == "once"){
    fputs($smtp_conn,"RCPT TO:<".$TOemail.">\r\n");
    $data = get_data($smtp_conn);
    echo "<b>$TOemail</b> - Прикреплен<br/>";
    $stoped = 1;
    } else

    // Если мы выбрали мультирассылку mysql-базе адресатов
    if ($act == "multy"){
    // Соединяемся с базой
    mysql_connect($sql_server, $sql_user, $sql_password) OR DIE("Не могу создать соединение ");
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($sql_db) or die(mysql_error());

    // Получаем все строки в массиве
    $resulter = mysql_query('SELECT * FROM emails');// делаем выборку из таблицы
    if (mysql_num_rows($resulter) >= 1){
    for($i=0; $i<=mysql_num_rows($resulter)-1; $i++){ // МЕГА БОЛЬШОЙ ЦИКЛ
    mysql_data_seek($resulter,$i);
    $row = mysql_fetch_array($resulter);
    $ema = $row['email'];
    $idem = $row['id'];
    if ($ema != ""){
    $arras[] = $ema; // добавляем в массив адресата
    }
    }
    }

    // СЧИТЫВАЕМ ЛИМИТ ОТПРАВКИ
    $fl = "limit.txt";
    $limit = "";
    $fp = fopen($fl,"r");
    while(!feof($fp)){
    $limit .= fgets($fp,2);
    }
    fclose($fp);

    // СЧИТЫВАЕМ НАЧАЛЬНУЮ ПОЗИЦИЮ
    $fl = "start.txt";
    $start = "";
    $fp = fopen($fl,"r");
    while(!feof($fp)){
    $start .= fgets($fp,2);
    }
    fclose($fp);

    // Формируем СТАРТ и КОНЕЦ
    if ($start < 10){
    $BEGIN = 0;
    } else {
    $BEGIN = $start+1;
    }
    $ENDER = $start + $limit;
    if ($ENDER >= count($arras)){ // если мы достигли конца массива, то создаем стопор
    $ENDER = count($arras)-1;
    $stoped = 1;
    } else { // если нет - снимаем стопор
    $stoped = 0;
    }

    // НАЧИНАЕМ ЦИКЛ ПРИКРЕПЛЕНИЯ АДРЕСАТОВ
    for ($i=$BEGIN; $i<=$ENDER; $i++){
    $emme = $arras[$i];
    $idem = $i+1;
    fputs($smtp_conn,"RCPT TO:<".$emme.">\r\n");
    $data = get_data($smtp_conn);
    echo "$idem) <b>$emme</b> - Прикреплен<br/>";
    }
    }

    // Прикрепляем данные
    fputs($smtp_conn,"DATA\r\n");
    $data = get_data($smtp_conn);

    // Прикрепляем заголовок и текст
    fputs($smtp_conn,$header."\r\n".$txt."\r\n.\r\n");
    $data = get_data($smtp_conn);

    // Письмо отправляется и
    // выходим
    fputs($smtp_conn,"QUIT\r\n");

    // Закрываем соединение
    fclose($smtp_conn);

    if ($stoped == 1){ // если стопор есть - оповещаем об успешной рассылке
    echo "
    <hr/>
    <b>Рассылка завершена!</b> <a href=\"index.php\">Вернуться</a>
    "
    ;

    } else { // если стопора нет...

    // Увеличиваем счетчик порций
    $fl = "start.txt";
    $start += $limit;
    $fp = fopen($fl,"w+");
    $fw = fwrite($fp,$start);
    fclose($fp);

    // Перезагружаемся
    echo "
    <hr/>
    Начало новой отправки данных...
    <meta http-equiv=\"refresh\" content=\"0; url=startspam.php?act=multy\">"
    ;
    }

    ?>
    </small>
    Как пользоваться машиной:
    • Создайте новый сайт на денвере и разместите в нем файлы (V:/home/site.ru/www/*)
    • Запустите/перезагрузите денвер
    • Зайдите на сайт и заполните настройки SMTP (я пользуюсь яндексом, поэтому у меня стоят в сервере yandex.ru, а также логин и пароль от яндекс.почты)
    • Настройте MySQL-базу в phpMyAdmin денвера и укажите те же данные, что и при создании базы и таблицы
    • Нажмите Сохранить. Теперь вы можете настроить письмо
    • В настройках письма укажите от кого, кому и текст, включая как имя, так и е-mail
    • Нажмите Сохранить. Вы завершили все настройки
    • ДЛЯ ОТПРАВКИ ПИСЬМА ТОЛЬКО НА УКАЗАННОЕ "Кому (e-mail)" НАЖМИТЕ "Начать расcылку разово"
    • ДЛЯ ОТПРАВКИ ПИСЬМА БАЗЕ АДРЕСАТОВ в MYSQL-БАЗЕ НАЖМИТЕ "Начать расcылку базе"

    Как пользоваться AddInMySQL.php
    • Для начала создайте базу данных и таблицу в phpMyAdmin и выполните настройку на странице index.php. Только потом продолжайте читать.
    • Теперь о добавлении: для этого файл txt должен иметь вид адресов, разделенных переносом строки
    • Если адреса разделены не переносом строки, а любым другим знаком (файл csv), то исправьте в этом фрагменте кода символы "\n" на указанный символ (также в кавычках):
      Код (PHP):
      $arr = explode("\n",$datas);
    • Впишите имя этого файла в разделе "Создать базу MySQL из текстового файла" и нажмите Вперед
    • Если всё было соблюдено, то в указанной MySQL-базе отобразится ваша база адресатов

    Как видите, всё просто. Но единственный минус - это производительность. С начала написания статьи до сего момента скрипт отправил около 10000 писем из 24000. Но в целом - он рабочий и очень мне нравится. В аттаче я привязал архив с файлами. Кто хочет - пользуйтесь. Если что - отпишите в теме по оптимизации кода, по улучшению производительности скрипта, если у вас появились вопросы по настройке или использованию скрипта и прочим возможным вопросам по скрипту.

    Спасибо за внимание.
     

    Вложения:

    • spamer.rar
      Размер файла:
      5,2 КБ
      Просмотров:
      3
    kot-gor нравится это.
  2. HeavyHell

    HeavyHell New Member

    Регистрация:
    13 фев 2015
    Сообщения:
    2
    Симпатии:
    0
    уверен на 99 из 100 что все письма улетают в папку спам и соответственно толку от такой рассылки все ближе к 0
     
  3. Runinterface

    Runinterface Member

    Регистрация:
    24 окт 2016
    Сообщения:
    5
    Симпатии:
    0
    Думаю что все таки зависит от каких адресов будет прилетать сообщения.
     
Загрузка...

Поделиться этой страницей