Эта статья является переводом, ссылка на оригиналSending Emails With Python
Мой блог:Дзен-мастер программирования
Вы, вероятно, нашли это руководство, потому что хотели отправлять электронные письма с помощью Python. Возможно, вы хотите написать код, чтобы получать напоминания по электронной почте, отправлять электронное письмо с подтверждением пользователям при создании ими учетной записи или отправлять электронное письмо членам организации, чтобы напомнить им об оплате взносов. Отправка почты — трудоемкая и подверженная ошибкам задача, но ее можно легко автоматизировать с помощью Python.
В этом уроке вы узнаете, как:
-
использовать
SMTP_SSL()
и.starttls()
Настроить безопасное соединение -
Используйте встроенный в Python
smtplib
библиотека для отправки основной электронной почты -
использовать
email
пакет для отправки электронных писем с содержимым HTML и вложениями -
Отправьте множество персонализированных электронных писем, которые содержат файлы CSV с контактными данными
-
использовать
Yagmail
Пакет может отправлять электронные письма из учетной записи Gmail с помощью всего нескольких строк кода.
В конце этого руководства вы найдете несколько транзакционных почтовых сервисов, которые могут быть полезны, когда вы хотите отправлять массовые электронные письма.
Готов начать
Python имеет встроенныйsmtplibМодуль для отправки электронной почты с использованием протокола Simple Mail Transfer Protocol (SMTP).smtplib
использовать в SMTPRFC 821протокол. В примерах этого руководства для отправки электронной почты будет использоваться SMTP-сервер Gmail, но те же принципы применимы и к другим службам электронной почты. Хотя большинство провайдеров электронной почты используют тот же порт подключения, что и в этом руководстве, вы можете использовать поиск Google для быстрого подтверждения.
Чтобы начать работу с этим учебным пособием, сначала настройте учетную запись Gmail для разработки или настройте сервер отладки SMTP, почта не будет отправляться, а будет выводиться на консоль. Оба варианта перечислены ниже. Локальный сервер отладки SMTP можно использовать для устранения любых проблем с функциями электронной почты и обеспечения безошибочной работы вашей электронной почты перед отправкой любых электронных писем.
Вариант 1. Создайте учетную запись Gmail для разработки
Если вы решите использовать свою учетную запись Gmail для отправки электронных писем, я настоятельно рекомендую настроить одноразовую учетную запись для разработки кода. Это связано с тем, что вам необходимо настроить параметры безопасности вашей учетной записи Gmail, чтобы разрешить доступ из вашего кода Python, и вы также можете случайно раскрыть свои данные для входа. Кроме того, я обнаружил, что почтовый ящик моей тестовой учетной записи быстро заполнился тестовыми электронными письмами, которых также было достаточно, чтобы настроить новую учетную запись Gmail для разработки.
Приятной особенностью Gmail является то, что вы можете использовать+
Нет. Добавьте любые модификаторы перед символом @ на адрес электронной почты. Например, отправитьmy+person1@gmail.com
иmy+person2@gmail.com
будет отправлен вmy@gmail.com
. При тестировании функций электронной почты вы можете использовать эту функцию для имитации нескольких адресов, указывающих на один и тот же почтовый ящик.
Чтобы создать адрес Gmail для тестирования кода:
- Создайте новую учетную запись Google
- будетРазрешить настройку менее безопасных приложенийВключено. Обратите внимание, что это может облегчить для других доступ к вашей учетной записи.
Если вы не хотите снижать настройки безопасности своей учетной записи Gmail, ознакомьтесь сДокументация, чтобы узнать, как использовать сценарий Python для авторизации OAuth2 для получения учетных данных доступа.
Вариант 2. Создайте локальный SMTP-сервер.
Вы можете использовать предустановленную версию Pythonsmptd
Модуль запускает локальный сервер отладки SMTP для проверки работы электронной почты. Вместо того, чтобы отправлять электронные письма на указанные адреса, он отбрасывает их и выводит их содержимое на консоль. Запуск локального сервера отладки означает, что вам не нужно иметь дело с шифрованием сообщений или входить на серверы электронной почты с учетными данными.
Вы можете запустить локальный сервер отладки SMTP, введя в командной строке следующее:
python -m smtpd -c DebuggingServer -n localhost:1025
В Linux перед той же командой следует поставитьsudo
.
Любое электронное письмо, отправленное через этот сервер, будет отбрасываться и отображаться по одному в строке в окне терминала.bytes
Объект:
---------- MESSAGE FOLLOWS ----------
b'X-Peer: ::1'
b''
b'From: my@address.com'
b'To: your@address.com'
b'Subject: a local test mail'
b''
b'Hello there, here is a test email'
------------ END MESSAGE ------------
В оставшейся части этого руководства я предполагаю, что вы используете учетную запись Gmail, но если вы используете локальный сервер отладки, обязательно используйтеlocalhost
в качестве адреса SMTP-сервера и используйте порт 1025 вместо порта 465 или 587. Кроме этого, вам не нужно использоватьlogin()
или использоватьSSL / TLS
Зашифрованное общение.
Отправить текстовое письмо
Прежде чем мы углубимся в отправку электронных писем с содержимым HTML и вложениями, вы научитесь отправлять электронные письма в виде обычного текста с помощью Python. Это электронные письма, которые вы можете написать в простом текстовом редакторе. Никаких причудливых вещей вроде форматирования текста или гиперссылок. Вы узнаете об этом позже.
Запустите безопасное SMTP-соединение
Когда вы отправляете электронную почту через Python, вы должны убедиться, что ваше SMTP-соединение зашифровано, чтобы другие не могли легко получить доступ к вашей почте и учетным данным для входа. SSL (Secure Sockets Layer) и TLS (Transport Layer Security) — это два протокола, которые можно использовать для шифрования SMTP-соединений. Вам не нужно использовать ни один из них при использовании локального сервера отладки.
Есть два способа установить безопасное подключение к вашему почтовому серверу:
- использовать
SMTP_SSL()
Установите безопасное SMTP-соединение - используйте небезопасное SMTP-соединение, затем используйте
.starttls()
шифрование
В обоих случаях Gmail использует TLS для шифрования электронной почты, так как это более безопасный преемник SSL. По словам ПитонаМеры предосторожности, настоятельно рекомендуется использоватьsslв модулеcreate_default_context()
.这将加载系统的可信CA证书,启用主机名检查和证书验证,并尝试选择适合的安全的协议和密码设置。
Если вы хотите проверить информацию о шифровании электронных писем в папке «Входящие» Gmail, выберите «Дополнительно» → «Показать оригинал», чтобы просмотреть типы шифрования, перечисленные под заголовком «Полученные».
smtplib— это встроенный модуль Python для отправки электронной почты на любой компьютер в Интернете с помощью демона прослушивателя SMTP или ESMTP.
Сначала я покажу вам, как использоватьSMTP_SSL()
, так как он создает безопасное соединение с самого начала и работает быстрее, чем использование.starttls()
Альтернатива немного короче. Обратите внимание, что при использованииSMTP_SSL()
Затем Gmail требует от вас подключения к порту 465, используйте.starttls()
требуется подключиться к порту 589.
Вариант 1: использоватьSMPT_SSL()
В следующем примере кода используетсяsmtplib
изSMTP_SSL()
Инициализирует зашифрованное TLS-соединение для установки безопасного соединения с SMTP-сервером Gmail.ssl
Контекст по умолчанию проверяет имя хоста и его сертификат и оптимизирует безопасность соединения. Не забудьте указать свой адрес электронной почты вместоmy@gmail.com
:
import smtplib, ssl
port = 465 # For SSL
password = input("Type your password and press enter: ")
# Create a secure SSL context
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
server.login("my@gmail.com", password)
# TODO: Send email here
использоватьwith smtplib.SMTP_SSL() as server
Убедитесь, что соединение автоматически закрывается в конце блока кода с отступом. Если порт равен нулю или не указан, то.SMTP_SSL()
Будет использоваться стандартный порт (порт 465).
Хранение паролей электронной почты в коде небезопасно, особенно если вы планируете поделиться им с другими. Напротив,使用input()
Попросите пользователя ввести пароль при запуске скрипта, как в примере выше. Если вы не хотите, чтобы пароль появлялся на экране при его вводе, вы можете импортироватьgetpassмодуль и использовать.getpass()
Вместо прямого ввода пароля.
Вариант 2: использовать.starttls()
Мы можем создать небезопасное SMTP-соединение и использовать.starttls()
зашифровать его, вместо того, чтобы использовать.SMTP_SSL()
Создавайте безопасные соединения с самого начала.
Для этого создайтеsmtplib.SMTP
Экземпляр, который инкапсулирует SMTP-соединение и позволяет вам получить доступ к его методам. Я рекомендую вам определить SMTP-сервер и порт в начале скрипта, чтобы их было легко настроить.
В следующем фрагменте кода используетсяserver= SMTP()
Не используетсяwith SMTP() as server:
Это формат, который мы использовали в предыдущем примере. Чтобы убедиться, что ваш код не рухнет, если что-то пойдет не так, поместите основной код вtry
блокировать, пустьexcept
блок печатает любые сообщения об ошибках вstdout
:
import smtplib, ssl
smtp_server = "smtp.gmail.com"
port = 587 # For starttls
sender_email = "my@gmail.com"
password = input("Type your password and press enter: ")
# Create a secure SSL context
context = ssl.create_default_context()
# Try to log in to server and send email
try:
server = smtplib.SMTP(smtp_server,port)
server.ehlo() # Can be omitted
server.starttls(context=context) # Secure the connection
server.ehlo() # Can be omitted
server.login(sender_email, password)
# TODO: Send email here
except Exception as e:
# Print any error messages to stdout
print(e)
finally:
server.quit()
Чтобы уведомить сервер, чтобы он знал о себе, вы должны создать.SMTP()
вызывается после объекта.helo()
(SMTP) или.ehlo()
(ESMTP), а в.starttls()
позвони снова. Эта функция состоит из.starttls()
и.sendmail()
Вызывается неявно, поэтому вам не нужно вызывать его явно, если только вы не проверяете расширение службы SMTP сервера..helo()
или.ehlo()
.
Отправьте текстовое письмо
После инициирования безопасного SMTP-соединения с помощью любого из вышеуказанных методов вы можете использовать.sendmail()
отправить письмо:
server.sendmail(sender_mail, receiver_email, message)
я предлагаю вimport
Затем определите адрес электронной почты и содержимое сообщения в верхней части скрипта, чтобы их можно было легко изменить:
sender_email = "my@gmail.com"
receiver_email = "your@gmail.com"
message = """\
Subject: Hi there
This message is sent from Python."""
# Send email here
message
строка начинается с“Subject:Hi there”
начинается, за которым следуют два символа новой строки (\n). Это гарантирует, чтоHi there
отображается как тема электронного письма, а текст, следующий за новой строкой, будет считаться телом электронного письма.
В следующем примере кода используетсяSMTP_SSL()
Чтобы отправлять электронные письма в виде обычного текста:
import smtplib, ssl
port = 465 # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "my@gmail.com" # Enter your address
receiver_email = "your@gmail.com" # Enter receiver address
password = input("Type your password and press enter: ")
message = """\
Subject: Hi there
This message is sent from Python."""
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message)
Это делается с помощью.starttls()
Пример кода для отправки сообщений электронной почты в виде простого текста через зашифрованное SMTP-соединение. как сравнение,server.ehlo()
строки можно опустить, так как они будут заменены на.starttls()
и.sendmail()
Неявный звонок:
import smtplib, ssl
port = 587 # For starttls
smtp_server = "smtp.gmail.com"
sender_email = "my@gmail.com"
receiver_email = "your@gmail.com"
password = input("Type your password and press enter:")
message = """\
Subject: Hi there
This message is sent from Python."""
context = ssl.create_default_context()
with smtplib.SMTP(smtp_server, port) as server:
server.ehlo() # Can be omitted
server.starttls(context=context)
server.ehlo() # Can be omitted
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message)
Отправляйте модные электронные письма
встроенный в Pythonemail
пакет позволяет вам создавать более причудливые электронные письма, которые вы затем можете использоватьsmptlib
передавать. Ниже вы узнаете, как использовать пакет электронной почты для отправки электронных писем с содержимым HTML и вложениями.
Содержит HTML-контент
HTML очень удобна, если вы хотите отформатировать текст по электронной почте (смелый, курсив и т. Д.) Или если вы хотите добавить любые изображения, гиперссылки или адаптивный контент. Наиболее распространенным типом электронной почты сегодня является MIME (многофункциональные расширения интернет-почты) Multipart Tail, которое сочетает в себе HTML и простой текст. MIME Сообщения Pythonemail.mime
模块处理。 Подробнее см.Документация.
Поскольку не все почтовые клиенты отображают HTML-содержимое по умолчанию, а некоторые люди из соображений безопасности предпочитают получать электронные письма только в виде простого текста, важно добавить обычный текст в качестве альтернативы HTML-сообщениям. Поскольку почтовый клиент сначала отобразит последнюю часть вложения, не забудьте добавить HTML-сообщение после обычной текстовой версии.
В приведенном ниже примере нашMIMEText()
объект будет содержать HTML и текстовые версии сообщения,MIMEMultipart("alternative")
Экземпляр объединяет их в одно сообщение с двумя альтернативными вариантами рендеринга:
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
sender_email = "my@gmail.com"
receiver_email = "your@gmail.com"
password = input("Type your password and press enter:")
message = MIMEMultipart("alternative")
message["Subject"] = "multipart test"
message["From"] = sender_email
message["To"] = receiver_email
# Create the plain-text and HTML version of your message
text = """\
Hi,
How are you?
Real Python has many great tutorials:
www.realpython.com"""
html = """\
<html>
<body>
<p>Hi,<br>
How are you?<br>
<a href="http://www.realpython.com">Real Python</a>
has many great tutorials.
</p>
</body>
</html>
"""
# Turn these into plain/html MIMEText objects
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")
# Add HTML/plain-text parts to MIMEMultipart message
# The email client will try to render the last part first
message.attach(part1)
message.attach(part2)
# Create secure connection with server and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
server.login(sender_email, password)
server.sendmail(
sender_email, receiver_email, message.as_string()
)
В этом примере обычный текст и HTML-сообщения сначала определяются как строковые литералы, а затем сохраняются какplain / html MIMEText
объект. Затем вы можете добавить эти дополнения по порядкуMIMEMultipart("alternative")
сообщение и отправляется по защищенному соединению на сервер электронной почты. Не забудьте добавить HTML-сообщение после альтернативного простого текста, поскольку почтовый клиент сначала попытается отобразить последний подраздел.
использоватьemailДобавить вложения
Чтобы отправить двоичный файл на почтовый сервер, предназначенный для обработки текстовых данных, его необходимо закодировать перед передачей. Обычно это делается с помощью base64, который кодирует двоичные данные в печатные символы ASCII.
В следующем примере кода показано, как прикрепить PDF-файл при отправке электронного письма:
import email, smtplib, ssl
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
subject = "An email with attachment from Python"
body = "This is an email with attachment sent from Python"
sender_email = "my@gmail.com"
receiver_email = "your@gmail.com"
password = input("Type your password and press enter:")
# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email # Recommended for mass emails
# Add body to email
message.attach(MIMEText(body, "plain"))
filename = "document.pdf" # In same directory as script
# Open PDF file in binary mode
with open(filename, "rb") as attachment:
# Add file as application/octet-stream
# Email client can usually download this automatically as attachment
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
# Encode file in ASCII characters to send by email
encoders.encode_base64(part)
# Add header as key/value pair to attachment part
part.add_header(
"Content-Disposition",
f"attachment; filename= {filename}",
)
# Add attachment to message and convert message to string
message.attach(part)
text = message.as_string()
# Log in to server using secure context and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, text)
MIMEultipart()
приниматьRFC5233параметры стиля в виде пар ключ/значение, которые хранятся в словаре и передаются вMessage
базовый класс.add_header
метод.
Посмотреть Pythonemail.mime
документацию модуля, чтобы узнать больше об использовании классов MIME.
Отправить несколько персонализированных писем
Представьте, вы хотите отправить электронное письмо членам организации, чтобы напомнить им об оплате их расходов на пожертвования. В качестве альтернативы вы можете отправить персонализированные электронные письма учащимся в классе, которые содержат результаты последней работы. Эти задачи несколько проще в Python.
Создавайте файлы CSV, используя соответствующую личную информацию
Чтобы начать отправку нескольких персонализированных электронных писем, достаточно создать файл CSV (значения, разделенные запятыми), содержащий всю необходимую личную информацию. (Убедитесь, что вы не делитесь личной информацией других людей без их согласия.) Файл CSV можно рассматривать как простую таблицу, где первая строка обычно содержит заголовки столбцов.
Ниже приведеныcontacts_file.csv
Содержимое файла, который я храню в той же папке, что и код Python. Он содержит имена, адреса и степени набора вымышленных персонажей. я используюmy+modifier@gmail.com
Создан для того, чтобы все электронные письма попадали в мой собственный почтовый ящик, в этом примереmy@gmail.com
:
name,email,grade
Ron Obvious,my+ovious@gmail.com,B+
Killer Rabbit of Caerbannog,my+rabbit@gmail.com,A
Brian Cohen,my+brian@gmail.com,C
При создании CSV-файла убедитесь, что ваши значения разделены запятыми и не содержат пробелов.
Пересечение линии для отправки нескольких сообщений
В приведенном ниже примере кода показано, как открыть CSV-файл и просмотреть строки его содержимого (пропустить строку заголовка). Чтобы убедиться, что код работает правильно, прежде чем отправить электронное письмо всем своим контактам. Я распечатал для каждого контактаSending email to ...
, мы можем позже заменить их функциями, которые фактически отправляют электронные письма:
import csv
with open("contacts_file.csv") as file:
reader = csv.reader(file)
next(reader) # Skip header row
for name, email, grade in reader:
print(f"Sending email to {name}")
# Send email here
В приведенном выше примере используйтеopen(filename) as file
: убедитесь, что ваш файл закрыт в конце блока кода.csv.reader()
Файл CSV можно читать построчно и извлекать его значения.next(reader)
Пропустит строку заголовка, займет строкуfor name, email, grade in reader
: Распаковать работу с помощью Python, имя полученного значения хранится в текущем контакте, электронной почте и оценке.
Если значения в файле CSV содержат пробелы с одной или обеих сторон, вы можете использовать.strip()
метод их удаления.
персонализированный контент
ты можешь использоватьstr.format()
Заполните фигурные скобки, чтобы поместить в сообщение персонализированный контент. Например,"hi {name}, you {result} your assignment".format(name="John", result="passed")
даст тебе"hi John, you passed your assignment"
.
Начиная с Python 3.6 форматирование строк может быть выполнено более элегантно с использованием f-строк, но для этого требуется, чтобы заполнители были определены до самой f-строки. Чтобы определить сообщение электронной почты в начале сценария и заполнить заполнители для каждого контакта при циклическом просмотре CSV-файла, используйте более старый.format()
метод.
Имея это в виду, вы можете настроить общее тело сообщения, в котором заполнители могут быть настроены для отдельных лиц.
Кодовый регистр
Следующий пример кода позволяет отправлять персонализированные электронные письма нескольким контактам. Он будет циклически просматривать файл CSV, отображая имя каждого контакта, адрес электронной почты, оценки, как в примере выше.
Общее сообщение определяется в начале скрипта, для каждого контакта в файле CSV его{name}
и{grade}
Все заполнители заполнены, и персонализированное электронное письмо отправляется через безопасное соединение с сервером Gmail, как вы видели ранее:
import csv, smtplib, ssl
message = """Subject: Your grade
Hi {name}, your grade is {grade}"""
from_address = "my@gmail.com"
password = input("Type your password and press enter: ")
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
server.login(from_address, password)
with open("contacts_file.csv") as file:
reader = csv.reader(file)
next(reader) # Skip header row
for name, email, grade in reader:
server.sendmail(
from_address,
email,
message.format(name=name,grade=grade),
)
Yagmail
Существует несколько библиотек, упрощающих отправку электронных писем, таких какEnvelopes,FlankerиYagmail. Разработанный для использования исключительно с Gmail, Yagmail значительно упрощает процесс отправки электронных писем с дружественным API, как показано в примере кода ниже:
import yagmail
receiver = "your@gmail.com"
body = "Hello there from Yagmail"
filename = "document.pdf"
yag = yagmail.SMTP("my@gmail.com")
yag.send(
to=receiver,
subject="Yagmail test with attachment",
contents=body,
attachments=filename,
)
Этот пример кода отправляет электронное письмо с вложением PDF, чем мы используемemail
иsmtplib
Объем примера кода для отправки электронных писем значительно уменьшен.
При настройке Yagmail вы можете добавить аутентификацию Gmail в связку ключей вашей операционной системы, напримерДокументацияописан в. Если вы этого не сделаете, Yagmail при необходимости запросит у вас пароль и автоматически сохранит его в связке ключей.
Транзакционная почтовая служба
Если вы планируете отправлять много электронных писем, хотите проверить статистику электронной почты и хотите обеспечить надежную доставку, вы можете попробовать службу транзакционной электронной почты. Хотя все перечисленные ниже сервисы имеют платные уровни для массовой рассылки электронных писем, они также предлагают бесплатные уровни, чтобы вы могли их опробовать. Некоторые из этих бесплатных планов доступны на неопределенный срок и могут быть достаточными для ваших потребностей в электронной почте.
Ниже приведен обзор бесплатных планов для некоторых основных транзакционных почтовых сервисов. Нажав на имя поставщика, вы попадете в раздел ценообразования на их веб-сайте.
поставщик | бесплатный план |
---|---|
Sendgrid | 40 000 бесплатных писем в течение первых 30 дней, затем 100 писем в день |
Sendinblue | 200 писем/день |
Mailgun | Первые 10 000 писем бесплатно |
Mailjet | 200 писем/день |
Amazon SES | 62 000 писем/месяц |
Вы можете запустить поиск в Google, чтобы узнать, какой провайдер лучше всего соответствует вашим потребностям, или просто попробовать некоторые из бесплатных планов, чтобы увидеть, какой API вам больше нравится.
Пример кода Sendgrid
Вот пример кода для отправки электронной почты с помощью Sendgrid, чтобы показать вам, как использовать службу транзакционной электронной почты Python:
import os
import sendgrid
from sendgrid.helpers.mail import Content, Email, Mail
sg = sendgrid.SendGridAPIClient(
apikey=os.environ.get("SENDGRID_API_KEY")
)
from_email = Email("my@gmail.com")
to_email = Email("your@gmail.com")
subject = "A test email from Sendgrid"
content = Content(
"text/plain", "Here's a test email sent through Python"
)
mail = Mail(from_email, subject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())
# The statements below can be included for debugging purposes
print(response.status_code)
print(response.body)
print(response.headers)
Чтобы запустить этот код, вы должны сначала:
- Зарегистрируйте (бесплатно) учетную запись Sendgrid
- Запросить ключ APIдля аутентификации пользователя
- Введите в командной строке
setx SENDGRID_API_KEY “YOUR_API_KEY”
(Навсегда сохранить этот ключ API), чтобы добавить ключи API, или установитьSENDGRID_API_KEY YOUR_API_KEY
чтобы сохранить его только для текущего сеанса клиента
Для получения информации о том, как настроить Sendgrid на Mac и Windows, см.GithubДополнительную информацию можно найти в репозитории README.
Суммировать
Теперь вы можете инициировать безопасное SMTP-соединение и отправлять несколько персонализированных электронных писем людям из вашего списка контактов!
Вы узнали, как использовать обычный текст для отправки электронных писем в формате HTML и прикрепления файлов к вашим электронным письмам. Пакет Yagmail упрощает все эти задачи при использовании учетной записи Gmail. Если вы планируете отправлять много электронных писем, стоит обратить внимание на службы транзакционной электронной почты.
Наслаждайтесь отправкой электронной почты с помощью Python, но помните: пожалуйста, не спамьте!
Подпишитесь на официальный аккаунт , чтобы узнать больше иностранных высококачественных технических статей.