Привет всем! Чем только в жизни не приходится заниматься — в том числе — и вещью, которая называется: массовая рассылка писем с помощью Python. Для этой работы в случае отсутствия Python есть несколько интересных программных продуктов, но сегодня мы познакомимся с более интересным решением и узнаем, как выглядит массовая рассылка писем с помощью Python.
В принципе, основы по отправке электронного письма с помощью Pyhton я рассматривал в этой записи. Фактически, от создания спам-машины нас отделяет работа со списком получателей, и адресами, с которых мы будем производить отправку писем (уверен, вы понимаете, что отправлять, например, миллион электронных писем с одного ящика — не эффективно, и обречено на провал). А значит, наша задача будет выглядеть следующим образом:
1. Обрабатываем список адресов, которые нужны для рассылки (конечно, можно поставить свой smtp-сервер, и работать через него, но это — другая история 😉 )
2. Обрабатываем список адресов, на которые будем производить рассылку
3. И — сама рассылка.
Я решил немного скорректировать задачу, и программа, представленная ниже будет состоять из трех частей:
1. Функция, отвечающая за генерацию адресов для рассылки (все адреса генерируются случайным образом, аналогично генерируются пароли к ним, и все это сохраняется в Excel-файл)
2. Функция, отвечающая за создание списка адресов — получателей. Адреса генерируются аналогично с пунктом выше, только без паролей, и сохраняются в текстовый файл.
3. Функция, которая будет производить рассылку. Учитывая, что описанная задача представляет собой чисто умозрительный пример — вы сможете адаптировать код под собственные нужды 😉
Итак, поехали!
-
'''
-
Спам-машина :) Адреса для рассылки хранятся в Excel-файле в колонках:
-
А - адрес почты
-
В - пароль доступа к ней
-
-
Адреса получателей - в текстовом файле.
-
Алгоритм работы:
-
1. Получаем из Excel-файла связку: логин-пароль
-
2. Берем адрес из списка отправителей, и отправляем письмо на него. После отправки адрес получателя удаляется из списка
-
-
'''
-
-
import openpyxl
-
import random
-
import re
-
import smtplib
-
from email.mime.text import MIMEText
-
from email.header import Header
-
-
#start_line = 1
-
max_mail = int(input('Сколько адресов нужно: '))
-
-
def create_sender_list():
-
start_line = 1
-
wb = openpyxl.Workbook()
-
column_a = 'A'
-
column_b = 'B'
-
while start_line <= max_mail:
-
sheets_list = wb.sheetnames # Получаем список всех листов в файле
-
sheet_active = wb[sheets_list[0]] # Начинаем работать с самым первым
-
mail_server_list = ['gmail.com', 'yandex.ru', 'outlook.com', 'mail.ru']
-
random_value = random.randrange(1, 10) #Генерируем случайное число от 1 до 10
-
random_mail = random.sample('abcdefghijklmnopqrstuvwxyz0123456789', random_value) #Генерируем случайный адрес из набора символов
-
random_mail = ''.join(random_mail)
-
random_mail_server = mail_server_list[random.randrange(0, len(mail_server_list))] #Выбираем случайный почтовый сервер
-
random_mail = random_mail + '@' + random_mail_server #Создаем итоговый адрес
-
start_line = start_line + 1
-
start_line = str(start_line)
-
sheet_active[column_a + start_line] = random_mail
-
start_line = int(start_line)
-
-
#Генерируем пароли к почте
-
random_value = random.randrange(8, 12) #Генерируем длину пароля (от 8 до 12 символов)
-
password_for_mail = random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*', random_value) #Генерируем сам пароль с использованием символов в скобках
-
password_for_mail = ''.join(password_for_mail)
-
-
#А теперь пишем все в файл
-
start_line = str(start_line)
-
sheet_active[column_b + start_line] = password_for_mail
-
start_line = int(start_line)
-
print(random_mail, ':', password_for_mail, ' - создан')
-
-
wb.save('sender_base.xlsx')
-
print('База почтовых адресов для отправки создана.\n')
-
-
def create_recipient_list():
-
start_line = 1
-
while start_line <= max_mail * 3:
-
random_value = random.randrange(1, 10)
-
random_mail = random.sample('abcdefghijklmnopqrstuvwxyz0123456789', random_value)
-
random_mail = ''.join(random_mail)
-
random_mail = random_mail + '@gmail.com'
-
with open('recipient_list.txt', 'a', encoding='utf8') as f:
-
f.write(random_mail + '\n')
-
start_line = start_line + 1
-
print('База получателей создана :)')
-
-
def spam():
-
print('Начинаем работу... \n')
-
global recipient_list
-
-
recipient_list = []
-
with open('recipient_list.txt', 'r', encoding='utf8') as f:
-
for mail in f:
-
mail = mail.replace('[', '').replace('\'', '').replace(']', '').replace('\n', '')
-
-
recipient_list.append(mail)
-
print(mail)
-
-
#Начинаем работать с файлом адресов для отправки
-
path = 'sender_base.xlsx' # Какой файл адресов для рассылки читаем?
-
workbook = openpyxl.load_workbook(path) # Собственно - читаем сам файл
-
sheets_list = workbook.sheetnames # Получаем список всех листов в книге
-
global data_from_row, sheet, column_count, random_column, mail_adress_recipient, column_a, column_b, work_column_a, work_column_b, mail_server #Делаем глобальные переменные (уточнить)
-
sheet = workbook[sheets_list[0]] # Делаем активным самый первый лист в книге
-
column_count = sheet.max_row
-
print(column_count)
-
random_column = random.randrange(2, column_count) #получаем случайную строку
-
random_column = str(random_column)
-
-
column_a = 'A'
-
column_b = 'B'
-
-
work_column_a = column_a + random_column
-
#work_column_a = str(work_column_a)
-
-
work_column_b = column_b + random_column
-
#work_column_b = str(work_column_b)
-
-
#Определяем почтовый сервер
-
print(work_column_a)
-
-
data_from_row = sheet[work_column_a].value
-
-
regxp = '(@\w+.\w+)'
-
mail_server = re.findall(regxp, data_from_row)
-
print('Почтовый сервер:', mail_server)
-
mail_server = str(mail_server)
-
mail_server = mail_server.replace('[', '').replace(']', '').replace('\'','')
-
print('Определили почтовый сервер:', mail_server)
-
-
#А теперь начинаем рассылать со случайной строкой с учетом почтового сервера:
-
if mail_server == '@gmail.com':
-
print('Работаем через Gmail')
-
mailsender = smtplib.SMTP('smtp.gmail.com', 587)
-
mailsender.starttls()
-
mailsender.login(work_column_a, work_column_b)
-
mail_subject = 'Тема сообщения'
-
mail_body = 'Текст сообщения'
-
msg = MIMEText(mail_body, 'plain', 'utf-8')
-
msg['Subject'] = Header(mail_subject, 'utf-8')
-
mailsender.sendmail(work_column_a, mail, msg.as_string())
-
mailsender.quit()
-
print('Сообщение на адрес', mail, 'отправлено')
-
-
elif mail_server == '@yandex.ru':
-
print('Работаем через Yandex')
-
mailsender = smtplib.SMTP('smtp.yandex.ru', 587)
-
mailsender.starttls()
-
mailsender.login(work_column_a, work_column_b)
-
mail_subject = 'Тема сообщения'
-
mail_body = 'Текст сообщения'
-
msg = MIMEText(mail_body, 'plain', 'utf-8')
-
msg['Subject'] = Header(mail_subject, 'utf-8')
-
mailsender.sendmail(work_column_a, mail, msg.as_string())
-
mailsender.quit()
-
print('Сообщение на адрес', mail, 'отправлено')
-
-
elif mail_server == '@mail.ru':
-
print('Работаем через Mail.ru')
-
mailsender = smtplib.SMTP('smtp.mail.ru', 587)
-
mailsender.starttls()
-
mailsender.login(work_column_a, work_column_b)
-
mail_subject = 'Тема сообщения'
-
mail_body = 'Текст сообщения'
-
msg = MIMEText(mail_body, 'plain', 'utf-8')
-
msg['Subject'] = Header(mail_subject, 'utf-8')
-
mailsender.sendmail(work_column_a, mail, msg.as_string())
-
mailsender.quit()
-
print('Сообщение на адрес', mail, 'отправлено')
-
-
elif mail_server == '@outlook.com':
-
print('Работаем с Outlook.com')
-
mailsender = smtplib.SMTP('smtp.outlook.com', 587)
-
mailsender.starttls()
-
mailsender.login(work_column_a, work_column_b)
-
mail_subject = 'Тема сообщения'
-
mail_body = 'Текст сообщения'
-
msg = MIMEText(mail_body, 'plain', 'utf-8')
-
msg['Subject'] = Header(mail_subject, 'utf-8')
-
mailsender.sendmail(work_column_a, mail, msg.as_string())
-
mailsender.quit()
-
print('Сообщение на адрес', mail, 'отправлено')
-
-
def work():
-
create_sender_list() #Создаем список адресов с которых будем отправлять
-
create_recipient_list() #Создаем список адресов на которые будем отправлять
-
spam() #Работаем
-
-
work()
Как всегда — полный код программы доступен на Git 🙂 С вопросами — добро пожаловать на почту, или в Telegram 🙂
Важно: в связи с неоднократно повторенным вопросом — почему программа генерирует почтовые адреса, а они не рабочие уточняю (писал это выше, но все же) — программа генерирует темповые (фейковые) адреса, которые нужны для примера, не более. Сама же функция, отвечающая за рассылку полностью рабочая. Что бы программа работала просто в режиме рассылки писем — закомментируйте следующий кусок:
-
def work():
-
create_sender_list() # Создаем список адресов с которых будем отправлять - удалить эту строку, если нам нужна только рассылка
-
create_recipient_list() # Создаем список адресов на которые будем отправлять - удалить эту строку, если нам нужна только рассылка
-
spam() # Работаем