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

Привет всем! Чем только в жизни не приходится заниматься — в том числе — и вещью, которая называется: массовая рассылка писем с помощью 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()  # Работаем

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