Массовая рассылка писем с помощью Python

Привет всем! Чем только в жизни не приходится заниматься — в том числе — и вещью, которая называется: массовая рассылка писем с помощью Python. Для этой работы в случае отсутствия Python есть несколько интересных программных продуктов, но сегодня мы познакомимся с более интересным решением и узнаем, как выглядит массовая рассылка писем с помощью Python.

В принципе, основы по отправке электронного письма с помощью Pyhton я рассматривал в этой записи. Фактически, от создания спам-машины нас отделяет работа со списком получателей, и адресами, с которых мы будем производить отправку писем (уверен, вы понимаете, что отправлять, например, миллион электронных писем с одного ящика — не эффективно, и обречено на провал). А значит, наша задача будет выглядеть следующим образом:
1. Обрабатываем список адресов, которые нужны для рассылки (конечно, можно поставить свой smtp-сервер, и работать через него, но это — другая история 😉 )
2. Обрабатываем список адресов, на которые будем производить рассылку
3. И — сама рассылка.

Я решил немного скорректировать задачу, и программа, представленная ниже будет состоять из трех частей:
1. Функция, отвечающая за генерацию адресов для рассылки (все адреса генерируются случайным образом, аналогично генерируются пароли к ним, и все это сохраняется в Excel-файл)
2. Функция, отвечающая за создание списка адресов — получателей. Адреса генерируются аналогично с пунктом выше, только без паролей, и сохраняются в текстовый файл.
3. Функция, которая будет производить рассылку. Учитывая, что описанная задача представляет собой чисто умозрительный пример — вы сможете адаптировать код под собственные нужды 😉

Итак, поехали!

  1. '''
  2. Спам-машина :) Адреса для рассылки хранятся в Excel-файле в колонках:
  3. А - адрес почты
  4. В - пароль доступа к ней
  5.  
  6. Адреса получателей - в текстовом файле.
  7. Алгоритм работы:
  8. 1. Получаем из Excel-файла связку: логин-пароль
  9. 2. Берем адрес из списка отправителей, и отправляем письмо на него. После отправки адрес получателя удаляется из списка
  10.  
  11. '''
  12.  
  13. import openpyxl
  14. import random
  15. import re
  16. import smtplib
  17. from email.mime.text import MIMEText
  18. from email.header import Header
  19.  
  20. #start_line = 1
  21. max_mail = int(input('Сколько адресов нужно: '))
  22.  
  23. def create_sender_list():
  24. 	start_line = 1
  25. 	wb = openpyxl.Workbook()
  26. 	column_a = 'A'
  27. 	column_b = 'B'
  28. 	while start_line <= max_mail:
  29. 		sheets_list = wb.sheetnames  # Получаем список всех листов в файле
  30. 		sheet_active = wb[sheets_list[0]]  # Начинаем работать с самым первым
  31. 		mail_server_list = ['gmail.com', 'yandex.ru', 'outlook.com', 'mail.ru']
  32. 		random_value = random.randrange(1, 10) #Генерируем случайное число от 1 до 10
  33. 		random_mail = random.sample('abcdefghijklmnopqrstuvwxyz0123456789', random_value) #Генерируем случайный адрес из набора символов
  34. 		random_mail = ''.join(random_mail)
  35. 		random_mail_server = mail_server_list[random.randrange(0, len(mail_server_list))] #Выбираем случайный почтовый сервер
  36. 		random_mail = random_mail + '@' + random_mail_server #Создаем итоговый адрес
  37. 		start_line = start_line + 1
  38. 		start_line = str(start_line)
  39. 		sheet_active[column_a + start_line] = random_mail
  40. 		start_line = int(start_line)
  41.  
  42. 		#Генерируем пароли к почте
  43. 		random_value = random.randrange(8, 12) #Генерируем длину пароля (от 8 до 12 символов)
  44. 		password_for_mail = random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*', random_value) #Генерируем сам пароль с использованием символов в скобках
  45. 		password_for_mail = ''.join(password_for_mail)
  46.  
  47. 		#А теперь пишем все в файл
  48. 		start_line = str(start_line)
  49. 		sheet_active[column_b + start_line] = password_for_mail
  50. 		start_line = int(start_line)
  51. 		print(random_mail, ':', password_for_mail, ' - создан')
  52.  
  53. 		wb.save('sender_base.xlsx')
  54. 	print('База почтовых адресов для отправки создана.\n')
  55.  
  56. def create_recipient_list():
  57. 	start_line = 1
  58. 	while start_line <=  max_mail * 3:
  59. 		random_value = random.randrange(1, 10)
  60. 		random_mail = random.sample('abcdefghijklmnopqrstuvwxyz0123456789', random_value)
  61. 		random_mail = ''.join(random_mail)
  62. 		random_mail = random_mail + '@gmail.com'
  63. 		with open('recipient_list.txt', 'a', encoding='utf8') as f:
  64. 			f.write(random_mail + '\n')
  65. 		start_line = start_line + 1
  66. 	print('База получателей создана :)')
  67.  
  68. def spam():
  69. 	print('Начинаем работу... \n')
  70. 	global recipient_list
  71.  
  72. 	recipient_list = []
  73. 	with open('recipient_list.txt', 'r', encoding='utf8') as f:
  74. 		for mail in f:
  75. 			mail = mail.replace('[', '').replace('\'', '').replace(']', '').replace('\n', '')
  76.  
  77. 			recipient_list.append(mail)
  78. 			print(mail)
  79.  
  80. 			#Начинаем работать с файлом адресов для отправки
  81. 			path = 'sender_base.xlsx'  # Какой файл адресов для рассылки читаем?
  82. 			workbook = openpyxl.load_workbook(path)  # Собственно - читаем сам файл
  83. 			sheets_list = workbook.sheetnames  # Получаем список всех листов в книге
  84. 			global data_from_row, sheet, column_count, random_column, mail_adress_recipient, column_a, column_b, work_column_a, work_column_b, mail_server #Делаем глобальные переменные (уточнить)
  85. 			sheet = workbook[sheets_list[0]]  # Делаем активным самый первый лист в книге
  86. 			column_count = sheet.max_row
  87. 			print(column_count)
  88. 			random_column = random.randrange(2, column_count) #получаем случайную строку
  89. 			random_column = str(random_column)
  90.  
  91. 			column_a = 'A'
  92. 			column_b = 'B'
  93.  
  94. 			work_column_a = column_a + random_column
  95. 			#work_column_a = str(work_column_a)
  96.  
  97. 			work_column_b = column_b + random_column
  98. 			#work_column_b = str(work_column_b)
  99.  
  100. 			#Определяем почтовый сервер
  101. 			print(work_column_a)
  102.  
  103. 			data_from_row = sheet[work_column_a].value
  104.  
  105. 			regxp = '(@\w+.\w+)'
  106. 			mail_server = re.findall(regxp, data_from_row)
  107. 			print('Почтовый сервер:', mail_server)
  108. 			mail_server = str(mail_server)
  109. 			mail_server = mail_server.replace('[', '').replace(']', '').replace('\'','')
  110. 			print('Определили почтовый сервер:', mail_server)
  111.  
  112. 			#А теперь начинаем рассылать со случайной строкой с учетом почтового сервера:
  113. 			if mail_server == '@gmail.com':
  114. 				print('Работаем через Gmail')
  115. 				mailsender = smtplib.SMTP('smtp.gmail.com', 587)
  116. 				mailsender.starttls()
  117. 				mailsender.login(work_column_a, work_column_b)
  118. 				mail_subject = 'Тема сообщения'
  119. 				mail_body = 'Текст сообщения'
  120. 				msg = MIMEText(mail_body, 'plain', 'utf-8')
  121. 				msg['Subject'] = Header(mail_subject, 'utf-8')
  122. 				mailsender.sendmail(work_column_a, mail, msg.as_string())
  123. 				mailsender.quit()
  124. 				print('Сообщение на адрес', mail, 'отправлено')
  125.  
  126. 			elif mail_server == '@yandex.ru':
  127. 				print('Работаем через Yandex')
  128. 				mailsender = smtplib.SMTP('smtp.yandex.ru', 587)
  129. 				mailsender.starttls()
  130. 				mailsender.login(work_column_a, work_column_b)
  131. 				mail_subject = 'Тема сообщения'
  132. 				mail_body = 'Текст сообщения'
  133. 				msg = MIMEText(mail_body, 'plain', 'utf-8')
  134. 				msg['Subject'] = Header(mail_subject, 'utf-8')
  135. 				mailsender.sendmail(work_column_a, mail, msg.as_string())
  136. 				mailsender.quit()
  137. 				print('Сообщение на адрес', mail, 'отправлено')
  138.  
  139. 			elif mail_server == '@mail.ru':
  140. 				print('Работаем через Mail.ru')
  141. 				mailsender = smtplib.SMTP('smtp.mail.ru', 587)
  142. 				mailsender.starttls()
  143. 				mailsender.login(work_column_a, work_column_b)
  144. 				mail_subject = 'Тема сообщения'
  145. 				mail_body = 'Текст сообщения'
  146. 				msg = MIMEText(mail_body, 'plain', 'utf-8')
  147. 				msg['Subject'] = Header(mail_subject, 'utf-8')
  148. 				mailsender.sendmail(work_column_a, mail, msg.as_string())
  149. 				mailsender.quit()
  150. 				print('Сообщение на адрес', mail, 'отправлено')
  151.  
  152. 			elif mail_server == '@outlook.com':
  153. 				print('Работаем с Outlook.com')
  154. 				mailsender = smtplib.SMTP('smtp.outlook.com', 587)
  155. 				mailsender.starttls()
  156. 				mailsender.login(work_column_a, work_column_b)
  157. 				mail_subject = 'Тема сообщения'
  158. 				mail_body = 'Текст сообщения'
  159. 				msg = MIMEText(mail_body, 'plain', 'utf-8')
  160. 				msg['Subject'] = Header(mail_subject, 'utf-8')
  161. 				mailsender.sendmail(work_column_a, mail, msg.as_string())
  162. 				mailsender.quit()
  163. 				print('Сообщение на адрес', mail, 'отправлено')
  164.  
  165. def work():
  166. 	create_sender_list() #Создаем список адресов с которых будем отправлять
  167. 	create_recipient_list() #Создаем список адресов на которые будем отправлять
  168. 	spam() #Работаем
  169.  
  170. work()

Как всегда — полный код программы доступен на Git 🙂 С вопросами — добро пожаловать на почту, или в Telegram 🙂

Важно: в связи с неоднократно повторенным вопросом — почему программа генерирует почтовые адреса, а они не рабочие уточняю (писал это выше, но все же) — программа генерирует темповые (фейковые) адреса, которые нужны для примера, не более. Сама же функция, отвечающая за рассылку полностью рабочая. Что бы программа работала просто в режиме рассылки писем — закомментируйте следующий кусок:

  1. def work():
  2.     create_sender_list()  # Создаем список адресов с которых будем отправлять - удалить эту строку, если нам нужна только рассылка
  3.     create_recipient_list()  # Создаем список адресов на которые будем отправлять - удалить эту строку, если нам нужна только рассылка
  4.     spam()  # Работаем