• XSS.stack #1 – первый литературный журнал от юзеров форума

Мануал/Книга Скрипт спама по почтам на python

whitehaker

RAID-массив
Пользователь
Регистрация
27.02.2020
Сообщения
84
Реакции
111
Выкладываю только для того что бы ребята которые шарят в спуфинге, помогли поправить код.
Бот сейчас работает, но отправляет через раз во входящие, 50% идет в спам.

Этот бот не продается, только усовершенственная версия продается.

1738488786615.png


1738488802803.png


1738488830292.png


1738488841124.png


1738488861219.png
Python:
# -*- coding: utf-8 -*-
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ParseMode, InlineKeyboardMarkup, InlineKeyboardButton, InputFile
from aiogram.utils import executor
import asyncio
import aiofiles
import aiosmtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from typing import List, Dict, Any

# Замените 'YOUR_BOT_TOKEN' на ваш токен бота
API_TOKEN = 'YOUR_BOT_TOKEN''

# Замените 'ADMIN_CHAT_ID' на ID чата администратора
ADMIN_CHAT_ID = 1111111111

# Пароли для доступа к боту (можно менять)
VALID_PASSWORDS = ['xss.pro', 'password2']

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())
dp.middleware.setup(LoggingMiddleware())

# Состояния для обработки сообщений
class States(StatesGroup):
    START = State()
    AUTHORIZATION = State()
    WAITING_EMAILS = State()
    WAITING_SMTP = State()
    WAITING_SUBJECT = State()
    WAITING_HTML = State()
    SENDING_EMAILS = State()

# Чтение SMTP данных из файла
async def read_smtp_data(file_path: str) -> List[Dict[str, Any]]:
    smtp_data = []
    async with aiofiles.open(file_path, 'r') as file:
        async for line in file:
            parts = line.strip().split('|')
            if len(parts) == 4:
                smtp_data.append({
                    'server': parts[0],
                    'port': int(parts[1]),
                    'username': parts[2],
                    'password': parts[3]
                })
    return smtp_data

# Асинхронная отправка письма с переключением на следующий SMTP сервер при ошибке
async def send_email_with_retry(smtp_infos: List[Dict[str, Any]], to_email: str, subject: str, html_content: str) -> bool:
    for smtp_info in smtp_infos:
        try:
            server = aiosmtplib.SMTP(hostname=smtp_info['server'], port=smtp_info['port'], use_tls=True)
            await server.connect()
            await server.login(smtp_info['username'], smtp_info['password'])

            msg = MIMEMultipart('alternative')
            msg['Subject'] = subject
            msg['From'] = "Nick West <google@google.com>"  # Здесь задаем кастомное имя отправителя
            msg['To'] = "google@google.com"

            part = MIMEText(html_content, 'html')
            msg.attach(part)

            await server.sendmail(smtp_info['username'], to_email, msg.as_string())
            await server.quit()
            print(f"Email {to_email} успешно отправлен через {smtp_info['server']}")
            return True
        except Exception as e:
            print(f"Error sending email to {to_email} via {smtp_info['server']}: {e}")
    return False

# Асинхронная проверка SMTP серверов
async def check_smtp_servers(smtp_data: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
    tasks = [check_single_smtp(server) for server in smtp_data]
    results = await asyncio.gather(*tasks)
    
    working_smtp = [result for result in results if result is not None]
    
    # Обновление файла с рабочими SMTP серверами
    async with aiofiles.open('smtp_data.txt', 'w') as file:
        for smtp_info in working_smtp:
            await file.write(f"{smtp_info['server']}|{smtp_info['port']}|{smtp_info['username']}|{smtp_info['password']}\n")
    
    return working_smtp

async def check_single_smtp(smtp_info: Dict[str, Any]) -> Dict[str, Any] or None:
    try:
        server = aiosmtplib.SMTP(hostname=smtp_info['server'], port=smtp_info['port'], use_tls=True)
        await server.connect()
        await server.login(smtp_info['username'], smtp_info['password'])
        await server.quit()
        return smtp_info
    except Exception as e:
        print(f"SMTP {smtp_info['server']} не работает: {e}")
        return None

# Ограничение на количество одновременных задач
semaphore = asyncio.Semaphore(50)  # Максимальное количество одновременных задач

async def send_email_with_semaphore_and_retry(smtp_infos: List[Dict[str, Any]], to_email: str, subject: str, html_content: str) -> bool:
    async with semaphore:
        return await send_email_with_retry(smtp_infos, to_email, subject, html_content)

@dp.message_handler(commands=['start'])
async def start(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    logging.info(f"User [{chat_id}] started the bot.")
    
    markup = InlineKeyboardMarkup(row_width=2)
    developer_button = InlineKeyboardButton("Разработчик", url="https://t.me/Xploit_V1rus")
    forum_button = InlineKeyboardButton("Наш форум", url="https://xss.pro/")
    get_password_button = InlineKeyboardButton("Хочу пароль", callback_data='get_password')
    markup.add(developer_button, forum_button, get_password_button)
    
    await bot.send_photo(
        chat_id,
        "https://na-sha.ru/data/assets/logo/Hacker_Loop.gif",
        caption=(
            "Добро пожаловать! 🥷\n\n"
            "Наш бот выполняет рассылку электронных писем. \n"
            "Чтобы получить доступ к боту, вам нужно иметь пароль"
        ),
        reply_markup=markup
    )
    await state.finish()  # Сброс состояния перед началом нового цикла
    await States.START.set()

@dp.callback_query_handler(lambda c: c.data == 'get_password', state=States.START)
async def get_password(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.message.chat.id, "Для получения пароля обратитесь к разработчику @Xploit_V1rus")

@dp.message_handler(state=States.START)
async def authorize_user(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    user_state = await state.get_state()
    logging.info(f"User [{chat_id}] state: {user_state}, received password: {message.text}")
    
    if message.text in VALID_PASSWORDS:
        await state.update_data(password=message.text)
        await bot.send_photo(
            chat_id,
            "https://na-sha.ru/data/assets/logo/Hacker_Loop.gif",
            caption=(
                "Вы успешно авторизованы!\n\n"
                "Теперь вы можете начать работу с ботом.\n"
                "Пришлите файл с адресами электронной почты."
            )
        )
        await States.WAITING_EMAILS.set()
    else:
        await bot.send_message(chat_id, "Неверный пароль. Попробуйте снова или получите правильный пароль у разработчика.")

@dp.message_handler(content_types=types.ContentType.DOCUMENT, state=States.WAITING_EMAILS)
async def handle_docs(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    user_state = await state.get_state()
    logging.info(f"User [{chat_id}] state: {user_state}, received document.")
    
    file_info = message.document
    downloaded_file = await bot.download_file_by_id(file_info.file_id)
    
    file_name = file_info.file_name
    if not file_name.endswith('.txt'):
        await bot.send_message(chat_id, "Вы прислали неправильный файл. Пожалуйста, отправьте файл с расширением .txt.")
        return
    
    with open('emails.txt', 'wb') as new_file:
        new_file.write(downloaded_file.read())
    
    await bot.send_message(chat_id, "Проверка файла...")
    
    async with aiofiles.open('emails.txt', 'r') as file:
        content = await file.read()
        if '\n' in content:
            emails = content.split('\n')
        else:
            emails = content.split(',')
        
        emails = [email.strip() for email in emails if email.strip()]
        valid_emails = emails  # Используем все адреса без проверки формата
        
        if not emails:
            await bot.send_message(chat_id, "Файл пустой или не содержит почты.")
        else:
            await state.update_data(emails=valid_emails)
            await bot.send_message(chat_id, f"Файл проверен успешно. Всего {len(valid_emails)} адресов электронной почты.")
            await bot.send_message(chat_id, "Теперь пришли файл с SMTP данными.")
            await States.WAITING_SMTP.set()

@dp.message_handler(content_types=types.ContentType.DOCUMENT, state=States.WAITING_SMTP)
async def handle_smtp_docs(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    user_state = await state.get_state()
    logging.info(f"User [{chat_id}] state: {user_state}, received document.")
    
    file_info = message.document
    downloaded_file = await bot.download_file_by_id(file_info.file_id)
    
    file_name = file_info.file_name
    if not file_name.endswith('.txt'):
        await bot.send_message(chat_id, "Вы прислали неправильный файл. Пожалуйста, отправьте файл с расширением .txt.")
        return
    
    with open('smtp_data.txt', 'wb') as new_file:
        new_file.write(downloaded_file.read())
    
    await bot.send_message(chat_id, "Проверка SMTP серверов...")
    
    smtp_data = await read_smtp_data('smtp_data.txt')
    working_smtp = await check_smtp_servers(smtp_data)
    
    if len(working_smtp) < 1:
        await bot.send_message(chat_id, "На данный момент сервис недоступен. Пожалуйста, попробуйте позже.")
        await bot.send_message(ADMIN_CHAT_ID, "SMTP серверы нужно пополнить!")
        return
    
    await bot.send_document(chat_id, InputFile('smtp_data.txt'), caption=f"Проверка SMTP серверов завершена. Рабочих серверов: {len(working_smtp)}.")
    await bot.send_message(chat_id, "Теперь пришли тему письма.")
    
    await state.update_data(smtp=working_smtp)
    await States.WAITING_SUBJECT.set()

@dp.message_handler(state=States.WAITING_SUBJECT)
async def handle_subject(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    user_state = await state.get_state()
    logging.info(f"User [{chat_id}] state: {user_state}, received subject: {message.text}")
    
    await state.update_data(subject=message.text)
    await bot.send_message(chat_id, "Тема письма получена. Теперь пришли HTML-контент письма.")
    await States.WAITING_HTML.set()

@dp.message_handler(state=States.WAITING_HTML)
async def handle_html(message: types.Message, state: FSMContext):
    chat_id = message.chat.id
    user_state = await state.get_state()
    logging.info(f"User [{chat_id}] state: {user_state}, received HTML content.")
    
    await state.update_data(html_content=message.text)
    
    user_data = await state.get_data()
    emails = user_data['emails']
    subject = user_data['subject']
    html_content = message.text
    working_smtp = user_data['smtp']
    
    await bot.send_message(chat_id, "Начинаю рассылку писем. Ожидайте...")
    
    success_count = 0
    fail_count = 0
    
    log_messages = []
    
    total_emails = len(emails)
    
    for i, email in enumerate(emails):
        sent = False
        for smtp_info in working_smtp:
            if await send_email_with_semaphore_and_retry(working_smtp, email, subject, html_content):
                success_count += 1
                log_messages.append(f"Email {email} успешно отправлен через {smtp_info['server']}.")
                await bot.send_message(chat_id, f"Email {email} успешно отправлен через {smtp_info['server']}.")
                sent = True
                break
        if not sent:
            fail_count += 1
            log_messages.append(f"Не удалось отправить email {email} через все доступные SMTP серверы.")
            await bot.send_message(chat_id, f"Не удалось отправить email {email} через все доступные SMTP серверы.")
    
    log_message = "\n".join(log_messages)
    result_message = f"Рассылка завершена.\nОтправлено {success_count} писем.\nНе отправлено {fail_count} писем."
    
    markup = InlineKeyboardMarkup(row_width=2)
    subscribe_button = InlineKeyboardButton("Наш чат", url="https://t.me/+aY9gajdCs6EwY2Ey")
    forum_button = InlineKeyboardButton("Наш форум", url="https://xss.pro/")
    resend_button = InlineKeyboardButton("Послать еще раз", callback_data='resend')
    markup.add(subscribe_button, forum_button, resend_button)
    
    await bot.send_message(chat_id, result_message + "\n\n" + log_message, reply_markup=markup)
    await state.finish()

@dp.callback_query_handler(lambda c: c.data == 'resend')
async def process_resend(callback_query: types.CallbackQuery):
    chat_id = callback_query.message.chat.id
    logging.info(f"User [{chat_id}] requested to resend emails.")
    
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(chat_id, "Привет! Пришли файл с почтами.")
    await States.WAITING_EMAILS.set()

async def on_startup(dp):
    try:
        me = await bot.get_me()
        print(f"Bot @{me.username} is authorized")
    except Exception as e:
        print(f"Failed to authorize bot: {e}")

if __name__ == '__main__':
    logging.info("Starting bot polling...")
    executor.start_polling(dp, skip_updates=True, on_startup=on_startup)
Первое установим зависимости.
Python:
aiogram==2.25
aiosmtplib
aiofiles
Для тех кто не знает
Python:
pip install aiogram==2.25
Python:
pip install aiosmtplib
Python:
pip install aiofiles
Хотя да трудно будет объяснить для тех кто не знает :D идем дальше, что в коде поменять нужно.
Естественно это ставим ваш токен от бота.
Python:
API_TOKEN = 'YOUR_BOT_TOKEN'

Потом id ваш, для того что бы оповещения приходили, я на будущее сделал эту функцию, так как буду улучшать бота.
Python:
ADMIN_CHAT_ID = 1111111111

Так же тебе нужно поменять msg['From'] = и msg['To'] на свои данные, смотри как у меня.
Python:
msg['From'] = "Nick West <google@google.com>"  # Здесь задаем имя отправителя
msg['To'] = "google@google.com" # Здесь задаем email отправителя

Ну вот и все, можете запускать бота, и начинать тестировать.

Версия python 3.9.18
Дам для теста немного вам рабочих SMTP в бота загружать txt файлом только, как и почты.
PHP:
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.stofanet.dk|465|kim64@stofanet.dk|Smeden1964
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.stofanet.dk|465|karinkjaergaard@stofanet.dk|Ladyhunden1?
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx
smtp.gmail.com|465|4011473@student.upperdarbysd.org|3KZUC5n4
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.gmail.com|465|4011473@student.upperdarbysd.org|3KZUC5n4
smtp.gmail.com|465|casey.toh@student.citrakasih.sch.id|RW%Z3%aK
smtp.iran.ir|465|masoud_ghorbany@iran.ir|Mm09123123178
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx
mail.vpro.com.tr|465|ugurbaris.atalayin@vpro.com.tr|E42BC44C
smtp.af.em-net.ne.jp|465|jcsjw882@af.em-net.ne.jp|416220
smtp.stofanet.dk|465|kim64@stofanet.dk|Smeden1964
smtp.ag.em-net.ne.jp|465|takatsu@ag.em-net.ne.jp|oceano06
smtp.rr.em-net.ne.jp|465|fukumasa21@rr.em-net.ne.jp|522390
smtp.ad.em-net.ne.jp|465|m-kaoru@ad.em-net.ne.jp|35cdkmrx

Почты должны быть тоже в txt файле, и идти в ряд, пример
xss.pro@xss.pro
xss.pro@xss.pro
Для знающих, как можно его усовершенствовать что бы нормально шли сообщения, не в спам, так как сейчас с подменой, большая часть идет в спам.

Будет желания на кофе и сигареты закинуть пару $ вот usdt trc20 TFoXm9zDFKqvkWT3Fm9sR6WrDKbDKyhgC8
 
Я дал всем этот скрипт, можете пользоваться и дорабатывать , я забыл там указать при входе в бота просит пароль , он указан в коде, замените на свой, через запетую можете несколько паролей ставить.
Python:
# Пароли для доступа к боту (можно менять)
VALID_PASSWORDS = ['xss.pro', 'password2']
 
Пожалуйста, обратите внимание, что пользователь заблокирован
где взять еще рабочих smtp?
xss[.]is/forums/105/ Люди совсем обленились, даже внутри форума лень искать чтоле
 
Для знающих, как можно его усовершенствовать что бы нормально шли сообщения, не в спам, так как сейчас с подменой, большая часть идет в спам.
Контент сгенерирован AI
Попадание писем в спам зависит не столько от кода бота, сколько от качества самого письма (наличие подозрительных ссылок, спам-слов, форматирования и уровня персонализации), репутации SMTP-сервера и IP-адреса (настроены ли SPF, DKIM и DMARC, есть ли попадание IP в блэклисты), корректности домена отправителя и его репутации, а также от объёмов и частоты рассылки с одного IP/SMTP. Подмена адреса или домена отправителя (spoofing) почти гарантированно ведёт к попаданию писем в спам.
 
Последнее редактирование модератором:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх