Привет всем! Старенькая запись, посвященная спаму (вообще странно — все, что посвящено взломам-атакам-спаму-и-прочему пользуется бОльшим спросом, чем что-то положительное 🙂 ) до сих пор вызывает интерес и даже вопросы, среди которых частенько попадаются просьбы разместить полный код спам-машины для рассылки писем по списку (если он — этот код — есть). Он есть 🙂
Полный код — ниже. Комментировать особо нечего — в основе работы кода лежат два Excel-файла:
recipient_base.xlsx — файл, в котором лежит список получателей рассылок
sender_base.xlsx — в котором хранятся все аккаунты, с которых будет производиться рассылка (и пароли к ним, да 🙂 )
Примеры файлов — доступны по ссылкам 🙂
Кроме этого, что бы не попасть в спам-лист — каждый адрес должен иметь определенные лимиты отправки почты за один раз. А дальше в дело вступает библиотека openpyxl и библиотека smtplib (о работе с каждой из них я писал ранее).
Алгоритм очень прост: открываем файл отправителей, получаем логин-пароль, соединяемся с сервером, и отправляем определенное количество писем, после чего — меняем адрес отправителя на следующий в списке.
-
'''
-
Как добавлять в html-письмо какой-то текст из базы:
-
body_html_1 = '<html><head></head><body><p>Привет!<br>Это тестовое сообщение<br>'
-
body_html_2 = recipient_mail (например, добавляем почтовый адрес получателя)
-
body_html_3 = '<br>Сделанное для проверки работы почтового робота<br>' \
-
'<a href="https://lavrynenko.com">Алекс</a></p></body></html>'
-
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><head></head><body><p>Привет!<br>Это тестовое сообщение<br>' \
-
'Сделанное для проверки работы почтового робота<br>' \
-
'<a href="https://lavrynenko.com">Алекс</a></p></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 🙂