Автоматизация электронной почты на Python

Автоматизация электронной почты на Python

Debian-Lab

Cегодня мы с Вами будем использовать Python для массовой рассылки любому количеству людей, столько раз, сколько захотим, без необходимости вручную заполнять сотни электронных писем.

Мы можем сделать это с помощью smtplib из стандартной библиотеки python. В котором используется протокол Simple Mail Transfer Protocol 4, также известный как SMTP.

Что Вам потребуется:

  • Установленный Python 3.7+
  • email аккаунт который поддерживает SMTP
  • Список получателей

Настройка

Создайте новый файл python с именем client.py и сразу импортируйте нужные нам библиотеки:

import smtplib
from email.mime.multipart import MIMEMultipart # Creating email messages
from email.mime.text import MIMEText           # Creating email body text
from email.utils import formataddr             # Formatting email headers
from email.mime.base import MIMEBase           # Handling email attachments
from email import encoders                     # Encoding email attachments

import config

Теперь создайте новый файл с именем config.py, это для упрощения использования программы, вместо того, чтобы пробираться через много кода для изменения простых вещей, таких как список получателей, нам нужно будет только отредактировать только config.py.

Мы будем использовать Gmail, но Вы можете использовать любого провайдера электронной почты. Убедитесь, что config.py находится в том же каталоге, что и client.py, и добавьте следующее:

smtp_addr = 'smtp.gmail.com'      # Gmails SMTP server
smtp_port = 587                   # SMTP supported port for Gmail

attachments = [                   # Locations of Attachments, relative or full path, leave as empty [] for no attachments
    'important.pdf', 
    'cat.png',
    '/opt/opt_cat.jpeg',
]

which_sender_to_use = 0           # Leave at 0 to use the first sender in dictionary
senders = {
    'user@gmail.com':'PASSWORD',  # Your actual email and password from provider
    'user1@gmail.com':'PASSWORD', # This is not particularly secure, consider using a throw-away account or encryption
}

receivers = {                     # The List of recipients, mail will go to each.
    'user@protonmail.com':'User', # <receiver_email>:<receiver_actual_name(Optional - leave as "" for no-name)>
    'john@gmail.com':'John Smith',
    'sparrow1828@outlook.com':'Captain Jack Sparrow',
}

Мы используем 587 порт для Gmail SMTP, который позволяет нам начать разговор в виде обычного текста, а затем включить TLS.

Все, мы настроили наш проект, теперь мы можем перейти к запуску нашего SMTP-клиента.

Используем SMTP

Теперь, когда у нас есть база для приложения, вернемся к client.py.

smtp_client = smtplib.SMTP(config.smtp_addr, config.smtp_port)
# smtp_client.set_debuglevel(True) # Uncomment for verbose logging in console

smtp_client.ehlo() # Extended Hello to SMTP server, client identifies itself to initiate conversation
smtp_client.starttls() # The connection now uses TLS encryption
smtp_client.ehlo() # We introduce ourselves to the server again under TLS

# Grab our username and password from config.py
username = list(config.senders.keys())[config.which_sender_to_use]
password = config.senders[username]

smtp_client.login(username, password) # Attempt to login to our email account

Если все пойдет хорошо, мы теперь войдем в нашу учетную запись электронной почты с использованием шифрования TLS. Если вы получаете сообщение об ошибке аутентификации и используете Gmail, убедитесь, что вы включили опцию "разрешить работу небезопасным приложениям". Google классифицирует все попытки входа в систему вне браузера как небезопасные и блокирует их по умолчанию.

Создание сообщений

Теперь мы можем отправлять электронные письма с помощью SMTP. Это бесполезно без возможности формировать разумные сообщения электронной почты с темами, вложениями и текстом. Давайте напишем функцию создания сообщения в client.py.

def makeEmailMessage(receiver_name, receiver, subject, attachments=None, extra=''):
    # Make body using f-string, extra is an optional parameter to include text in body.
    body = f"""Hi {receiver_name},

{extra}"""
    msg = MIMEMultipart() # Use MIME standard for email formatting
    msg['From'] = username # Email address used for login
    msg['To'] = formataddr((receiver_name, receiver)) # Actual name of receiver will show instead of email address
    msg['Subject'] = subject
    body = MIMEText(body)
    msg.attach(body) # This does not "attach" the body text as a file, it is added to the text content of email 

    # Handle case of 0 attachments
    if attachments is None:
        attachments = []

    # Every file in attachments will be added to msg using standard email encoding
    # The files local name will be used to name it
    for file in attachments:
        attach_file = open(file, 'rb') # open in binary mode
        email_file = MIMEBase('application', 'octate-stream')
        email_file.set_payload((attach_file).read())
        encoders.encode_base64(email_file)

        email_file.add_header('Content-Disposition', 'attachment', filename=file)
        msg.attach(email_file) # The processed file is now added to the email

    return msg

Массовая рассылка

Теперь мы можем начать рассылать спам и раздражать всех в нашем словаре получателей из config.py. В этом примере я собираюсь использовать цикл for. Если бы я отправлял статическое электронное письмо с одинаковым содержанием в каждом электронном письме, я бы не использовал цикл, вместо этого использовал бы список получателей и отправлял бы всю почту сразу

Итак, продолжаем в client.py:

def genNuclearLaunchCodes(n): # Example of function which isn't purely static
    return ("6E 75 6B 65 21" * n)

iteration = 1
for receiver in config.receivers:
    msg = makeEmailMessage(config.receivers[receiver], receiver, 'SUBJECT HERE', config.attachments, genNuclearLaunchCodes(iteration))
    smtp_client.send_message(msg, username, receiver) # The email will be sent through the SMTP account we've logged into
    print(f'{iteration}: email sent to {receiver} from {username}')
    iteration += 1

Добавьте правильные данные в config.py, затем мы сможем запустить client.py, и наша почта будет отправлена.

⏳ Наш основной канал - @debian_lab

Report Page