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

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

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

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

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

  1. '''
  2. Как добавлять в html-письмо какой-то текст из базы:
  3. body_html_1 = '<html><head></head><body><p>Привет!<br>Это тестовое сообщение<br>'
  4. body_html_2 = recipient_mail (например, добавляем почтовый адрес получателя)
  5. body_html_3 = '<br>Сделанное для проверки работы почтового робота<br>' \
  6.             '<a href="https://lavrynenko.com">Алекс</a></p></body></html>'
  7. body_html = body_html_1 + body_html_2 + body_html_3
  8. '''
  9.  
  10. import openpyxl
  11. import random
  12. import re
  13. import smtplib
  14. from email.mime.image import MIMEImage
  15. from email.header import Header
  16. from email.utils import COMMASPACE, formatdate
  17. from email.mime.application import MIMEApplication
  18. from os.path import basename
  19. import email
  20. import email.mime.application
  21. from email.mime.text import MIMEText
  22. from email.mime.multipart import MIMEMultipart
  23. from email.mime.base import MIMEBase
  24. from email import encoders
  25. from termcolor import colored
  26.  
  27. print('Поехали! \n(с)Ю.А.Гагарин\n')
  28.  
  29. # Создаем все необходимые переменные
  30. path_to_recipient_base = 'recipient_base.xlsx'
  31. a_recipient_base = 'A'
  32. b_recipient_base = 'B'
  33. c_recipient_base = 'C'
  34. start_line_recipient = 1
  35.  
  36. path_to_sender_base = 'sender_base.xlsx'
  37. a_sender_base = 'A'
  38. b_sender_base = 'B'
  39. start_line_sender = 1
  40. start_number_in_mail_list = 0
  41.  
  42. gmail_min_mail = 1  # Задаем минимальное значение писем к этому почтовому серверу
  43. gmail_max_mail = 10  # Задаем максимальное количество писем, отправляемых с одного почтовго сервера
  44.  
  45. outlook_min_mail = 1  # Задаем минимальное значение писем к этому почтовому серверу
  46. outlook_max_mail = 10  # Задаем максимальное количество писем, отправляемых с одного почтовго сервера
  47.  
  48. mail_ru_min_mail = 1  # Задаем минимальное значение писем к этому почтовому серверу
  49. mail_ru_max_mail = 10  # Задаем максимальное количество писем, отправляемых с одного почтовго сервера
  50.  
  51. filename = 'recipient_list.txt'  # Указываем, какой файл нужно присоединять к отправляемому письму
  52. subject = 'тест письма для рассылки'  # Указываем тему письма для рассылки
  53. body = 'Просто текст в письме в обычном формате'  # Текст письма для рассылки
  54. body_html = '<html><head></head><body><p>Привет!<br>Это тестовое сообщение<br>' \
  55.             'Сделанное для проверки работы почтового робота<br>' \
  56.             '<a href="https://lavrynenko.com">Алекс</a></p></body></html>' #Текст письма в html-формате
  57.  
  58. reply_to_address = 'bill@microsoft.com' #Тут указываем адрес для общего ответа Reply-to
  59.  
  60. workbook_recipient = openpyxl.load_workbook(path_to_recipient_base)
  61. workbook_sender = openpyxl.load_workbook(path_to_sender_base)
  62.  
  63. sheets_list_recipient = workbook_recipient.sheetnames
  64. sheets_list_sender = workbook_sender.sheetnames
  65.  
  66. active_sheet_recipient = workbook_recipient[sheets_list_recipient[0]]
  67. active_sheet_sender = workbook_sender[sheets_list_sender[0]]
  68.  
  69. finish_line_recipient = active_sheet_recipient.max_row  # Получили максимальное количество строк в файле отправителей
  70. finish_line_sender = active_sheet_sender.max_row  # Получили максимальное количество строк в файле получателей
  71.  
  72. print('Количество получателей:', finish_line_recipient)
  73. print('Количество адресов для рассылки:', finish_line_sender)
  74.  
  75. while start_line_recipient <= finish_line_recipient:
  76.     start_line_recipient = str(start_line_recipient)
  77.  
  78.     start_line_sender = str(start_line_sender)
  79.     work_column_a_sender = a_sender_base + start_line_sender
  80.     work_column_b_sender = b_sender_base + start_line_sender
  81.     sender_name = active_sheet_sender[work_column_a_sender].value  # Получили логин отправителя
  82.     sender_password = active_sheet_sender[work_column_b_sender].value  # Получили пароль от почты отправителя
  83.     print('\nОтправляем через аккаунт:', sender_name, ':', sender_password)
  84.  
  85.     regxp = '(@\w+.\w+)'
  86.     mail_server = re.findall(regxp, sender_name)
  87.     mail_server = str(mail_server)
  88.     mail_server = mail_server.replace('[', '').replace(']', '').replace('\'', '')
  89.     print(mail_server)
  90.  
  91.     if mail_server == '@gmail.com':
  92.         print('Работаем через Gmail:\n')
  93.         print('Максимум писем через один аккаунт Gmail:', gmail_max_mail)
  94.         while gmail_min_mail <= gmail_max_mail:
  95.             start_line_recipient = str(start_line_recipient)
  96.             work_column_a_recipient = a_recipient_base + start_line_recipient
  97.             work_column_b_recipient = b_recipient_base + start_line_recipient
  98.             work_column_c_recipient = c_recipient_base + start_line_recipient
  99.             recipient_name = active_sheet_recipient[work_column_a_recipient].value
  100.             recipient_surname = active_sheet_recipient[work_column_b_recipient].value
  101.             recipient_mail = active_sheet_recipient[work_column_c_recipient].value
  102.             if recipient_mail == None:
  103.                 break
  104.             else:
  105.                 print('Sending mail to', recipient_mail)
  106.                 email_sender = work_column_a_sender
  107.                 email_sender_password = work_column_b_sender
  108.                 msg = MIMEMultipart()
  109.                 msg['From'] = email_sender
  110.                 msg['To'] = recipient_mail
  111.                 msg.add_header('reply-to', reply_to_address) #Отмечаем как комментарий, если не нужен поддельный ответ
  112.                 msg['Subject'] = subject
  113.                 #msg.attach(MIMEText(body, 'plain'))  # Ветка для отправки простого текста
  114.                 msg.attach(MIMEText(body_html, 'html', 'utf-8')) #Ветка для отправки html-письма
  115.  
  116.                 attachment = open(filename, 'rb') #Ветка - добавлять атач или нет
  117.                 part = MIMEBase('application', 'octet-stream')#Ветка - добавлять атач или нет
  118.                 part.set_payload((attachment).read())#Ветка - добавлять атач или нет
  119.                 encoders.encode_base64(part)#Ветка - добавлять атач или нет
  120.                 part.add_header('Content-Disposition', 'attachment; filename= ' + filename)#Ветка - добавлять атач или нет
  121.                 msg.attach(part)#Ветка - добавлять атач или нет
  122.  
  123.                 text = msg.as_string()
  124.                 server = smtplib.SMTP('smtp.gmail.com', 587)
  125.                 server.starttls()
  126.                 server.login(sender_name, sender_password)
  127.                 server.sendmail(email_sender, recipient_mail, text)
  128.                 server.quit()
  129.                 print('Письмо', gmail_min_mail, 'из', gmail_max_mail, 'возможных в одном аккаунте - отправлено!\n')
  130.  
  131.                 start_line_recipient = int(start_line_recipient)
  132.                 start_line_recipient = start_line_recipient + 1
  133.                 gmail_min_mail = gmail_min_mail + 1
  134.     elif mail_server == '@outlook.com':
  135.         print('Работаем через Outlook:\n')
  136.         #Тут нужно добавить ветку работы через сервера Outlook.com :)
  137.     else:
  138.         print(colored('\nОшибка сервера:', 'red'), mail_server, '\nВведите данные!')
  139.  
  140.     start_line_sender = int(start_line_sender)
  141.     start_line_sender = start_line_sender + 1
  142.  
  143.     start_line_recipient = int(start_line_recipient)
  144.     start_line_recipient = start_line_recipient + 1
  145. print(colored('А вы, однако, молодцы! Наспамили, так наспамили :)', 'green'))

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

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