Готовый код спам-машины для рассылки писем по списку

Привет всем! Старенькая запись, посвященная спаму (вообще странно — все, что посвящено взломам-атакам-спаму-и-прочему пользуется бОльшим спросом, чем что-то положительное 🙂 ) до сих пор вызывает интерес и даже вопросы, среди которых частенько попадаются просьбы разместить полный код спам-машины для рассылки писем по списку (если он — этот код — есть). Он есть 🙂

Полный код — ниже. Комментировать особо нечего — в основе работы кода лежат два Excel-файла:
recipient_base.xlsx — файл, в котором лежит список получателей рассылок
sender_base.xlsx — в котором хранятся все аккаунты, с которых будет производиться рассылка (и пароли к ним, да 🙂 )
Примеры файлов — доступны по ссылкам 🙂

Кроме этого, что бы не попасть в спам-лист — каждый адрес должен иметь определенные лимиты отправки почты за один раз. А дальше в дело вступает библиотека openpyxl и библиотека smtplib (о работе с каждой из них я писал ранее).

Алгоритм очень прост: открываем файл отправителей, получаем логин-пароль, соединяемся с сервером, и отправляем определенное количество писем, после чего — меняем адрес отправителя на следующий в списке.

 ''' Как добавлять в html-письмо какой-то текст из базы: body_html_1 = '



Привет!
Это тестовое сообщение
' body_html_2 = recipient_mail (например, добавляем почтовый адрес получателя) body_html_3 = '
Сделанное для проверки работы почтового робота
' \ 'Алекс

' body_html = body_html_1 + body_html_2 + body_html_3 ''' import openpyxl import random import re import smtplib from email.mime.image import MIMEImage from email.header import Header from email.utils import COMMASPACE, formatdate from email.mime.application import MIMEApplication from os.path import basename import email import email.mime.application from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from termcolor import colored print('Поехали! \n(с)Ю.А.Гагарин\n') # Создаем все необходимые переменные path_to_recipient_base = 'recipient_base.xlsx' a_recipient_base = 'A' b_recipient_base = 'B' c_recipient_base = 'C' start_line_recipient = 1 path_to_sender_base = 'sender_base.xlsx' a_sender_base = 'A' b_sender_base = 'B' start_line_sender = 1 start_number_in_mail_list = 0 gmail_min_mail = 1 # Задаем минимальное значение писем к этому почтовому серверу gmail_max_mail = 10 # Задаем максимальное количество писем, отправляемых с одного почтовго сервера outlook_min_mail = 1 # Задаем минимальное значение писем к этому почтовому серверу outlook_max_mail = 10 # Задаем максимальное количество писем, отправляемых с одного почтовго сервера mail_ru_min_mail = 1 # Задаем минимальное значение писем к этому почтовому серверу mail_ru_max_mail = 10 # Задаем максимальное количество писем, отправляемых с одного почтовго сервера filename = 'recipient_list.txt' # Указываем, какой файл нужно присоединять к отправляемому письму subject = 'тест письма для рассылки' # Указываем тему письма для рассылки body = 'Просто текст в письме в обычном формате' # Текст письма для рассылки body_html = '

Привет!
Это тестовое сообщение
' \ 'Сделанное для проверки работы почтового робота
' \ 'Алекс

' #Текст письма в html-формате reply_to_address = 'bill@microsoft.com' #Тут указываем адрес для общего ответа Reply-to workbook_recipient = openpyxl.load_workbook(path_to_recipient_base) workbook_sender = openpyxl.load_workbook(path_to_sender_base) sheets_list_recipient = workbook_recipient.sheetnames sheets_list_sender = workbook_sender.sheetnames active_sheet_recipient = workbook_recipient[sheets_list_recipient[0]] active_sheet_sender = workbook_sender[sheets_list_sender[0]] finish_line_recipient = active_sheet_recipient.max_row # Получили максимальное количество строк в файле отправителей finish_line_sender = active_sheet_sender.max_row # Получили максимальное количество строк в файле получателей print('Количество получателей:', finish_line_recipient) print('Количество адресов для рассылки:', finish_line_sender) while start_line_recipient <= finish_line_recipient: start_line_recipient = str(start_line_recipient) start_line_sender = str(start_line_sender) work_column_a_sender = a_sender_base + start_line_sender work_column_b_sender = b_sender_base + start_line_sender sender_name = active_sheet_sender[work_column_a_sender].value # Получили логин отправителя sender_password = active_sheet_sender[work_column_b_sender].value # Получили пароль от почты отправителя print('\nОтправляем через аккаунт:', sender_name, ':', sender_password) regxp = '(@\w+.\w+)' mail_server = re.findall(regxp, sender_name) mail_server = str(mail_server) mail_server = mail_server.replace('[', '').replace(']', '').replace('\'', '') print(mail_server) if mail_server == '@gmail.com': print('Работаем через Gmail:\n') print('Максимум писем через один аккаунт Gmail:', gmail_max_mail) while gmail_min_mail <= gmail_max_mail: start_line_recipient = str(start_line_recipient) work_column_a_recipient = a_recipient_base + start_line_recipient work_column_b_recipient = b_recipient_base + start_line_recipient work_column_c_recipient = c_recipient_base + start_line_recipient recipient_name = active_sheet_recipient[work_column_a_recipient].value recipient_surname = active_sheet_recipient[work_column_b_recipient].value recipient_mail = active_sheet_recipient[work_column_c_recipient].value if recipient_mail == None: break else: print('Sending mail to', recipient_mail) email_sender = work_column_a_sender email_sender_password = work_column_b_sender msg = MIMEMultipart() msg['From'] = email_sender msg['To'] = recipient_mail msg.add_header('reply-to', reply_to_address) #Отмечаем как комментарий, если не нужен поддельный ответ msg['Subject'] = subject #msg.attach(MIMEText(body, 'plain')) # Ветка для отправки простого текста msg.attach(MIMEText(body_html, 'html', 'utf-8')) #Ветка для отправки html-письма attachment = open(filename, 'rb') #Ветка - добавлять атач или нет part = MIMEBase('application', 'octet-stream')#Ветка - добавлять атач или нет part.set_payload((attachment).read())#Ветка - добавлять атач или нет encoders.encode_base64(part)#Ветка - добавлять атач или нет part.add_header('Content-Disposition', 'attachment; filename= ' + filename)#Ветка - добавлять атач или нет msg.attach(part)#Ветка - добавлять атач или нет text = msg.as_string() server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(sender_name, sender_password) server.sendmail(email_sender, recipient_mail, text) server.quit() print('Письмо', gmail_min_mail, 'из', gmail_max_mail, 'возможных в одном аккаунте - отправлено!\n') start_line_recipient = int(start_line_recipient) start_line_recipient = start_line_recipient + 1 gmail_min_mail = gmail_min_mail + 1 elif mail_server == '@outlook.com': print('Работаем через Outlook:\n') #Тут нужно добавить ветку работы через сервера Outlook.com :) else: print(colored('\nОшибка сервера:', 'red'), mail_server, '\nВведите данные!') start_line_sender = int(start_line_sender) start_line_sender = start_line_sender + 1 start_line_recipient = int(start_line_recipient) start_line_recipient = start_line_recipient + 1 print(colored('А вы, однако, молодцы! Наспамили, так наспамили :)', 'green'))

Полный код доступен по ссылке 🙂

Как всегда - в случае возникновения вопросов пишите на почту, или в Telegram 🙂

Support the Blog!

Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut