Рубрики
Без рубрики

Как отправлять электронные письма в Python?

Python предоставляет родной класс электронной почты для обработки сообщений электронной почты. Это делает добавление функций отправки электронной почты в свой приложение Python легкой задачей. В этом посте мы продемонстрируем, как использовать модули Python и классы для создания и отправки электронных писем через SMTP, а также как правильно проверить их. Мы будем ориентироваться в основном … Как отправить электронные письма в Python? Подробнее “

Автор оригинала: Chris.

Python предоставляет родной класс электронной почты для обработки сообщений электронной почты. Это делает добавление функций отправки электронной почты в свой приложение Python легкой задачей. В этом посте мы продемонстрируем, как использовать модули Python и классы для создания и отправки электронных писем через SMTP, а также как правильно проверить их. Мы сосредоточимся в основном на кодировании основных электронных писем HTML, добавляя изображения и прикрепляющие файлы.

Вот как вы можете быстро отправить электронное письмо с Gmail, используя Ягмаил библиотека:

  • Установите Yagmail, запустив команду Пип Установите Ягмаил в вашей оболочке.
  • Установите ключей, запустив команду PIP Установка ключей в вашей оболочке.
  • Выполните следующий фрагмент кода (укажите свое собственное имя пользователя, пароль и адрес электронной почты):
import yagmail
yag = yagmail.SMTP('username', 'password')
yag.send(to = 'receiver@email.com',
         subject = 'hi',
         contents = 'Just wanted to say "hi"')

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

Если вы чувствуете, что ваши навыки кодирования Python нуждаются в некоторых обновлениях, не стесняйтесь загружать высокое разрешение, бесплатные чит-листы Python (PDF):

Отправка по электронной почте в Python

Прежде чем мы начнем работать над созданием и отправкой электронных писем, давайте быстро перейдем по электронной почте инфраструктуру и посмотрите на дополнительные инструменты, которые мы можем использовать.

Мы уже упоминали, что Python имеет встроенную функциональность для отправки электронных писем. smtplib Модуль обрабатывает электронную почту по отправке через SMTP-сервер. Вы можете использовать любой сервис, который вы предпочитаете, пока вы знаете его стандартные учетные данные: хост, порт, имя пользователя и пароль.

Например, если вы используете Amazon SES, вы должны определить его следующим образом:

import smtplib
port = 587 
smtp_server = "email-smtp.us-west-2.amazonaws.com" # hostname depends on the AWS region you use 
login = "your-Amazon-SES-SMTP-name"
password = "your-Amazon-SES-SMTP-password" 
    with smtplib.SMTP(smtp_server, port) as server:
        server.login(login, password)

Примечание. Это и все следующие примеры кода сделаны с помощью Python версии 3.7.2

Если вы предпочитаете Gmail, конфигурация будет выглядеть похоже:

import smtplib, ssl
port = 465  
password = input("your password")
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
    server.login("myname@gmail.com", password)

Просто помните, что вы должны авторизовать свое приложение Python для использования с вашей учетной записью Gmail. Если вы обеспокоены безопасностью, рекомендуется использовать протокол авторизации OAUTT2. В противном случае вы можете просто разрешить менее безопасные приложения (2-этапная проверка должна быть отключена для вашей учетной записи).

Есть несколько популярных клиентов Gmail/SMTP, предназначенные для оптимизации отправки электронной почты. Один из них – Библиотека Питона Ягмаил . Если вы используете Gmail, этот стоит попробовать.

Тестирование электронной почты в Python

Еще один важный аспект отправки электронной почты – тестирование электронной почты. Когда вы начинаете работать с новыми технологиями, вы должны изолировать свои эксперименты от производства и почтовых ящиков реальных пользователей. Вы можете использовать свой собственный адрес электронной почты для целей тестирования, но если вы проверяете отправку функций нескольким получателям (и мы сделаем это в этом руководстве!), Это будет затоплено тестовыми электронными письмами довольно быстро. Еще одна проблема, которая может возникнуть при использовании вашего производственного сервера для проверки электронных писем, является риском повреждения вашей репутации домена.

Тестируйте электронную почту, отправляя локально

Если вы предпочитаете работать в локальной среде, локальный сервер отладки SMTP может быть вариантом, который вы понрете. Для этого Python предлагает SMTPD модуль. У этого есть Debuggingserver Функция, которая будет отказаться от сообщений, которые вы отправляете, и распечатаете их в stdout. . Он совместим со всеми операционными системами.

Python предоставляет модуль SMTPD для целей тестирования. Это позволяет вам использовать localhost для тестирования, с помощью Debuggingserver характерная черта. С этим ваши отправленные сообщения будут отброшены и напечатаны на stdout.

Его можно использовать на двух портах: 1025 и 25:

python -m smtpd -n -c DebuggingServer localhost:1025

Но помните, что корневые разрешения необходимы для порта 25:

sudo python -m smtpd -n -c DebuggingServer localhost:25

Полное тестирование электронной почты с выделенной службой

С Localhost вы сможете убедиться, что ваши электронные письма отправляются и получают список ошибок, если что-то не так. Но это невозможно просмотреть ваши сообщения и убедиться, что изображения отображаются должным образом и убедитесь, что вложения правильно кодируются.

С этой точки зрения мы рекомендуем использовать полнофункциональные инструменты для тестирования электронной почты, что позволит вам проверить отправку, а также проверять содержимое HTML. Есть несколько инструментов, которые могут быть интегрированы как SMTP-сервер. MailParaP ловит все ваши отправленные сообщения и отображают их в виртуальных почтовых ящиках, а также поможет просматривать свой счет для спама, возможные проблемы с HTML и многое другое. Его навсегда бесплатный план достаточно для экспериментов по электронной почте. Для платных планов есть даже адрес электронной почты и поддержка BCC.

Мы будем использовать MailTrap в качестве SMTP-сервера в образцах кода в этом посте, поэтому вот как настроить его. Перейдите в свои параметры входящих данных, введите свое имя пользователя и пароль и вставьте их следующим образом:

import smtplib

port = 2525 
smtp_server = "smtp.mailtrap.io"
login = "1a2b3c4d5e6f7g" # your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # your password generated by Mailtrap

Кроме того, в приложении вы найдете интеграцию и основной пример сценария.

Отладка

Вот еще одна полезная вещь, чтобы упомянуть, прежде чем мы начнем строить сообщения электронной почты. Пакет электронной почты в Python использует исключение и дефектные классы, которые очень полезны для отладки. Мы рекомендуем вам импортировать компонент Gaierror, а затем добавить «попробуйте» и «кроме» блоков:

import smtplib
from socket import gaierror
# … 
try:
    #send your message with credentials specified above
    with smtplib.SMTP(smtp_server, port) as server:
        server.login(login, password)
        server.sendmail(sender, receiver, message)

    # tell the script to report if your message was sent or which errors need to be fixed 
    print('Sent')
except (gaierror, ConnectionRefusedError):
    print('Failed to connect to the server. Bad connection settings?')
except smtplib.SMTPServerDisconnected:
    print('Failed to connect to the server. Wrong user/password?')
except smtplib.SMTPException as e:
    print('SMTP error occurred: ' + str(e))

Наконец, давайте рассмотрим, как создать шаблон электронной почты HTML.

HTML электронные письма в Python

HTML-контент электронной почты представлен в виде типа сообщения MIME и обрабатывается Email.mime модуль. Вы должны добавить как HTML, так и простой текстовые детали, а затем объединить их. В Python это делается со следующими модулями:

from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
message = MIMEMultipart("alternative") 

Полный код сообщения выглядит так:

import smtplib 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
port = 2525 
smtp_server = "smtp.mailtrap.io" 
login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap 
password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap
sender_email = "mailtrap@example.com" 
receiver_email = "new@example.com" 
message = MIMEMultipart("alternative") 
message["Subject"] = "multipart test" 
message["From"] = sender_email 
message["To"] = receiver_email 
# write the plain text part text = """\ Hi, Check out our new post on sending emails with Python! """ 
# write the HTML part html = """\   

Hi,
Check out our new post on sending emails with Python!

""" # convert both parts to MIMEText objects and add them to the MIMEMultipart message part1 = MIMEText(text, "plain") part2 = MIMEText(html, "html") message.attach(part1) message.attach(part2) # send your email with smtplib.SMTP("smtp.mailtrap.io", 2525) as server: server.login(login, password) server.sendmail( sender_email, receiver_email, message.as_string() ) print('Sent')

Вы получите это сообщение в почтовом ящике сразу после того, как вы увидите Отправлено Результат в оболочке:

Как добавить изображения и файлы

Наиболее распространенным использованием случаев отправки электронных писем из ваших приложений Python являются приветственные электронные письма, сброс пароля или подтверждения заказа.   Таким образом, вам нужно добавлять изображения и вложения файлов к вашим сообщениям. В Python вы можете сделать это с помощью соответствующих модулей.

Изображения могут быть добавлены к электронным письмам несколькими способами: CID вложения, встроенные встроенные встроенные (Base64) или связывание к размещенной картинке. Вы можете экспериментировать с каждым из них в вашем коде. Теперь мы рассмотрим, как работать с Inline Instribing. Действительно, это супер легко, вам просто нужно импортировать Base64 Модуль – он будет кодировать изображение в соответствующий формат.

Если мы хотим прикрепить файл, нам нужно импортировать еще два модуля:

from email import encoders
from email.mime.base import MIMEBase

Вот как наш код будет искать сообщение подтверждения заказа, которое содержит как изображения, так и PDF-файлы:

# import the necessary components first
import smtplib
import base64
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.mime.base import MIMEBase


port = 2525
smtp_server = "smtp.mailtrap.io"
login = "40d081ab7d7700" # paste your login generated by Mailtrap
password = "6ff78f7a8ac4a4" # paste your password generated by Mailtrap

sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"
message = MIMEMultipart("alternative")
message["Subject"] = "order confirmation with image and PDF file"
message["From"] = sender_email
message["To"] = receiver_email

# place the image file is in the same directory that you run your Python script from
encoded = base64.b64encode(open("mailtrap-flying.png", "rb").read()).decode()

html = f"""\

 
 

This is an example of how you can send an order confirmation with an image and attached file in Python

""" # Add plain text body to email body = "This is an example of how you can send an order confirmation with an image and attached file in Python" message.attach(MIMEText(body, "plain")) filename = "your_order.pdf" # Open PDF file in binary mode # Place the file in the same directory where you run your Python script from with open(filename, "rb") as attachment: # The content type "application/octet-stream" means that a MIME attachment is a binary file part = MIMEBase("application", "octet-stream") part.set_payload(attachment.read()) # Encode to base64 encoders.encode_base64(part) # Add header part.add_header( "Content-Disposition", f"attachment; filename= {filename}", ) # Add attachment to your message and convert it to string message.attach(part) text = message.as_string() part = MIMEText(html, "html") message.attach(part) # send your email with smtplib.SMTP("smtp.mailtrap.io", 2525) as server: server.login(login, password) server.sendmail( sender_email, receiver_email, message.as_string() ) print('Sent')

Давайте проверим результаты в MailTrap:

Мы можем увидеть встроенное изображение и наш файл, прикрепленный как your_order.pdf. Это означает, что мы все сделали правильно!

Как отправить несколько электронных писем с динамическим контентом

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

Один из самых простых способов сделать это – создание базы данных .csv (не забудьте разместить ее в папку с помощью сценария Python).

Например, давайте использовать имя и адрес электронной почты, самые популярные переменные:

#name,email
John Johnson,john@johnson.com
Peter Peterson,peter@peterson.com

С помощью следующего скрипта этот файл будет открыт:

with open("filename.csv") as file:
       reader = csv.reader(file)

И {имя} будет вставлено из соответствующего столбца:

    for name, email in reader:
            server.sendmail(
               sender,
                email,
                message.format(name=name, recipient=email, sender=sender)
            )

Давайте проверим полный код сообщения с MailTrap:

import csv, smtplib

port = 2525 
smtp_server = "smtp.mailtrap.io"
login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

message = """Subject: Order confirmation
To: {recipient}
From: {sender}

Hi {name}, thanks for your order! We are processing it now and will contact you soon"""
sender = "new@example.com"

with smtplib.SMTP("smtp.mailtrap.io", 2525) as server:
    server.login(login, password)
    with open("contacts.csv") as file:
        reader = csv.reader(file)
        next(reader)  # it skips the header row
        for name, email in reader:
            server.sendmail(
               sender,
                email,
                message.format(name=name, recipient=email, sender=sender)
            )
            print(f'Sent to {name}')

Ответ должен выглядеть как ниже:

Sent to John Johnson
Sent to Peter Peterson
>>>

В результате мы должны получить два сообщения в почтовые ящики на каждого получателя:

Упаковать

В этом посте мы проходили основные варианты отправки электронных питонов из приложения Python. Нативная функциональность довольно богата, так что она проходит эксперименты с электронной почтой легким и веселым. Чтобы углубить ваши знания, мы рекомендуем относиться к официальному Рамочная документация Отказ

Кроме того, вы можете попробовать несколько библиотек для отправки электронной почты, доступные на PYPI. Библиотека Python Ягмаил является одним из самых выдающихся примеров.

Помните: не спам (с большой силой приходит большая ответственность), будь хорошим, и не забудьте проверить ваши электронные письма!

Эта статья была первоначально опубликована в блоге MailTrap: Отправка электронных писем с Python

Если вы чувствуете, что вам не хватает тщательного образования оснований Python, посмотрите в Finxter Free Python Cheat Count Lists (с печатным, High-Res PDFS)!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.