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

BlackShadow

Well-Known Member
04.02.2011
111
3
#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. Но в целом - он рабочий и очень мне нравится. В аттаче я привязал архив с файлами. Кто хочет - пользуйтесь. Если что - отпишите в теме по оптимизации кода, по улучшению производительности скрипта, если у вас появились вопросы по настройке или использованию скрипта и прочим возможным вопросам по скрипту.

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

Вложения

Симпатии: Понравилось kot-gor

HeavyHell

New Member
13.02.2015
2
0
#2
уверен на 99 из 100 что все письма улетают в папку спам и соответственно толку от такой рассылки все ближе к 0
 

Runinterface

Well-Known Member
24.10.2016
57
38
#3
уверен на 99 из 100 что все письма улетают в папку спам и соответственно толку от такой рассылки все ближе к 0
Думаю что все таки зависит от каких адресов будет прилетать сообщения.
 
O

Olej

Гость
#4
Я сейчас работаю фрилансером на одном хорошем сайте и как-то мне встретилось задание по рассылке спам-сообщений на мыла.
А я с такими придурками-спамерами, которые сильно достают, поступаю просто:
- заводится 2 mail-адреса на публичных пост-ресурсах, допускающих пересылку почты
- на 1-м адресе указывается пересылка на 2-й + на мэйл придурка-спамера...
- на 2-м адресе указывается пересылка на 1-й + на мэйл придурка-спамера...
- шлём навстречу друг-другу
- ... и я запускаю одно инициализирующее письмо с subject типа "сдохни, гнида" на любой из 2-х адресов...
- и пусть этого придурка удавит его собственный провайдер. :D

Это работает лучше всякой спам-машины - это как кувалночкой по темени ... остужает.
 
Последнее редактирование модератором:

ghostphisher

гарант codeby
Gold Team
07.12.2016
1 958
2 145
#5
Вы на дату топа посмотрите 21 ноя 2012
За это время механизм борьбы улучшился во много раз и сам по себе спам уже сходит на нет. Остаются "уязвимыми" частные почтовики, на которых админы не настроили спам фильтры.
 
O

Olej

Гость
#6
За это время механизм борьбы улучшился во много раз и сам по себе спам уже сходит на нет.
Спам, возможно, глобально и "сходит на нет" у кого-то вообще... , но я ежедневно вытираю десяток-другой писем от проституток с американского континента (gmail.com)... это не считая наших русскоязычных умельцев, желающих что-то впарить (yandex.ru) и которым очень хотелось бы дать в морду.
 
Последнее редактирование модератором:
Симпатии: Понравилось nikos