Автоматизация электронной почты на Python
Debian-LabCегодня мы с Вами будем использовать 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