Как стать автором
Обновить

Скрипт рассылки писем по Email (Selenium + Python)

Проблема:

Необходимо рассылать шаблонные письма по готовому списку Email адресов.

Что мы имеем:

  • Специальные программы и сервисы (дорого и для разовой рассылки нет смысла покупать);

  • Плагины для почтовых клиентов (например mail merge для thunderbird, через которую я пробовал делать рассылку и столкнулся с рядом проблем, а еще получил бан);

  • Что-то еще можете написать в комментариях;

  • Руки.

Решение:

Будем использовать Selenium + Python, почту Mail.ru и Chrome.

Скрипт будет выполнять те же действия, что мы выполняли, если бы делали рассылку в ручную.

Скачиваем Google Chrome: Важно чтобы версия браузера совпадала с версией web-driver.

Скачиваем Web-driver

Скачиваем библиотеку: pip install -U selenium.

Порядок работы скрипта:

  1. Запускает браузер;

  2. Переходит на сайт mail.ru, на страницу шаблоны;

  3. Вводит логин и пароль в форму авторизации;

  4. Считывает список адресов из файла .csv;

  5. Запускает цикл;

  6. Нажимает на ссылку первого шаблона в списке;

  7. Заполняет поле кому;

  8. Нажимает кнопку отправить;

    8.1 Если сайт выдает капчу (произойдет после отправки порядка 60 писем), ждет час и снова нажимает на кнопку;

  9. Закрывает модальное окно;

  10. Возвращается к пункту 6.

Рассмотрим основные команды:

  • browser.find_element_by_xpath('/html/body/div[10]/div/div/div[2]/div[2]/div/div/div[1]/span').click() - получение элемента на странице по его идентификатору Xpath (так же можно получить по имени, классу, id). Xpath достаем из инспектора в браузере. Для выбора вашего шаблона возможно стоит поменять в коде мой Xpath на ваш;

  • time.sleep(1) - чтобы браузер успел прогрузить страницу и selenium нашёл элементы которые мы ему задали, выставляем задержку.

Код

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv

# Путь к web-driver
EXE_PATH = 'chromedriver.exe'
# Логин и пароль от вашей почты
EMAIL = [email protected]
PASSWORD  = password
        
# запускаем браузер
browser = webdriver.Chrome(executable_path=EXE_PATH)
# Переходим на страницу шаблонов mail.ru
# Сайт выдаст форму авторизации
browser.get('https://e.mail.ru/templates/')

# Выставляем тайминги задержки чтобы браузер успел прогрузить страницу
time.sleep(5)

# Теперь нам надо авторизоваться
# заполняем поле логин
emailElem = browser.find_element_by_name('username')
emailElem.send_keys(EMAIL)
emailElem.submit()
time.sleep(1)

# заполняем поле пароль
passwordElem = browser.find_element_by_name('password')
passwordElem.send_keys(PASSWORD)
passwordElem.submit()
time.sleep(5)

# Мы авторизовались, теперь тащим адреса из файла.csv 
# Содержание файла
# ФИО,Email

with open('email_list.csv', encoding="utf-8") as file:
    EMAIL_LIST = csv.reader(file)
    
    # Запускаем цикл
    for row in EMAIL_LIST:
    		# Если mail что то заподозрит, то выкинет капчу, 
        # мы получаем except, ждем некоторое время, и снова отправлем письмо
        try:
        		# ФИО <Email>
            email_to = row[0] + "<" + row[1] + ">"
            
            # Нажимаем кнопку шаблоны (первый в списке шаблон настраиваем заранее)       
            browser.find_element_by_xpath('//*[@id="app-canvas"]/div/div[1]/div[1]/div/div[2]/span/div[2]/div/div/div/div/div[1]/div/div/div/div[1]/div/div/a[1]').click()
            time.sleep(3)     
            
            # Заполняем поле кому
            browser.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/div[1]/div[2]/div[3]/div[2]/div/div/div[1]/div/div[2]/div/div/label/div/div/input').send_keys(email_to)
            time.sleep(1)
           
            # Нажимаем кнопку отправить
            browser.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/div[2]/div[1]/span[1]/span/span').click()
            time.sleep(5)

            # После отправки открывается модальное окно, закрываем его
            browser.find_element_by_xpath('/html/body/div[10]/div/div/div[2]/div[2]/div/div/div[1]/span').click()
            time.sleep(10)
            
        except Exception:
        		# Сообщаем пользователю, что скрипту необходимо переждать
            print('Error! Wait 1 hour\n')
            # Ждем час (можно меньше)
            time.sleep(3600)
            
            # Снова нажимаем кнопку отправить
            browser.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/div[2]/div[1]/span[1]/span/span').click()
            time.sleep(5)

            # Снова закрываем модальное окно
            browser.find_element_by_xpath('/html/body/div[10]/div/div/div[2]/div[2]/div/div/div[1]/span').click()
            time.sleep(10)

print('SUCCESS!')
time.sleep(500)

Доработка:

  • Добавить логирование;

  • Вынести переменные в config.ini;

  • Так же можно вынести тему и текст письма в текстовый файл;

  • Ваши предложения).

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.