Отправка электронной почты через SMTP в Python3
SMTP (Simple Mail Transfer Protocol) — это набор правил для передачи почты с адреса отправителя на адрес получателя, и он управляет способом ретрансляции сообщений.
smtplib в Python предоставляет удобный способ отправки электронных писем. Это простая обёртка вокруг протокола SMTP.
Синтаксис создания объекта SMTP в Python выглядит следующим образом:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Описание параметра:
- host: хост SMTP-сервера. Можно указать IP-адрес хоста или доменное имя, например example.com. Это необязательный параметр.
- port: если вы указываете параметр host, необходимо указать номер порта, используемого службой SMTP. Обычно номер порта SMTP — 25.
- local_hostname: если SMTP находится на вашем локальном компьютере, достаточно указать адрес сервера как localhost.
Объект SMTP в Python использует метод sendmail для отправки электронной почты. Синтаксис выглядит следующим образом:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
Описание параметра:
- from_addr: адрес электронной почты отправителя.
- to_addrs: список строк — адреса получателей.
- msg: сообщение для отправки.
Здесь нужно обратить внимание на третий параметр. msg — это строка, представляющая электронное письмо. Мы знаем, что электронное письмо обычно состоит из темы, отправителя, получателя, содержимого письма, вложений и т. д. При отправке письма обращайте внимание на формат msg. Этот формат определён в протоколе SMTP.
Пример
Ниже приведён простой пример отправки электронного письма с помощью Python:
Пример
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Тест отправки электронной почты Python...', 'plain', 'utf-8')
message['From'] = Header("Пример", 'utf-8')
message['To'] = Header("Тест", 'utf-8')
subject = 'Тест электронной почты Python SMTP'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("Письмо успешно отправлено")
except smtplib.SMTPException:
print ("Ошибка: Не удалось отправить письмо")
Мы используем три кавычки для настройки информации электронной почты. Стандартное электронное письмо требует трёх частей информации заголовка:From, To, иSubjectКаждая часть информации отделяется пустой строкой.
Мы создаём экземпляр объекта SMTP модуля smtplibsmtpObjдля подключения к SMTP-доступу и используемsendmailметод для отправки сообщения.
Запустите вышеприведённую программу. Если у вас на машине установлен sendmail, она выведет:
$ python3 test.py
邮件发送成功
Проверьте входящие (обычно в папке «Спам»), и вы увидите сообщение электронной почты:

Если у нас нет доступа к sendmail на нашей машине, мы также можем использовать SMTP-доступ от других сервисов (QQ, NetEase, Google и т. д.).
Пример
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host="smtp.XXX.com"
mail_user="XXXX"
mail_pass="XXXXXX"
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Тест отправки электронной почты Python...', 'plain', 'utf-8')
message['From'] = Header("Пример", 'utf-8')
message['To'] = Header("Тест", 'utf-8')
subject = 'Тест email через SMTP на Python'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print ("Письмо успешно отправлено")
except smtplib.SMTPException:
print ("Ошибка: Не удалось отправить электронное письмо")
Использование Python для отправки HTML-писем
Разница между отправкой HTML-письма и обычного текстового письма в Python заключается в установке _subtype в MIMEText в html. Конкретный код выглядит следующим образом:
Пример
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
mail_msg = """<p>Тест отправки электронной почты Python...</p>
<p><a href="http://www.example.com">Это ссылка</a></p>"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("Пример", 'utf-8')
message['To'] = Header("Тест", 'utf-8')
subject = 'Тест email через SMTP на Python'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("Письмо успешно отправлено")
except smtplib.SMTPException:
print ("Ошибка: Не удалось отправить электронное письмо")
Запустите вышеприведённую программу. Если у вас на машине установлен sendmail, она выведет:
$ python3 test.py
邮件发送成功
Проверьте входящие (обычно в папке «Спам»), и вы увидите сообщение электронной почты:

Отправка писем с вложениями на Python
Чтобы отправить письмо с вложениями, сначала создайте экземпляр MIMEMultipart(), затем создайте вложения. Если вложений несколько, создавайте их по одному, и наконец используйте smtplib.smtp для отправки.
Пример
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEMultipart()
message['From'] = Header("Пример", 'utf-8')
message['To'] = Header("Тест", 'utf-8')
subject = 'Тест электронной почты Python SMTP'
message['Subject'] = Header(subject, 'utf-8')
message.attach(MIMEText('Это пример теста отправки электронной почты на Python...', 'plain', 'utf-8'))
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
att2 = MIMEText(open('example.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="example.txt"'
message.attach(att2)
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("Письмо успешно отправлено")
except smtplib.SMTPException:
print ("Ошибка: Не удалось отправить письмо")
$ python3 test.py
邮件发送成功
Проверьте входящие (обычно в папке «Спам»), и вы увидите сообщение электронной почты:

Добавление изображений в HTML-текст
В HTML-тексте электронного письма добавление внешних ссылок обычно не поддерживается почтовыми сервисами. Ниже показан правильный пример добавления изображений:
Пример
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("Пример", 'utf-8')
msgRoot['To'] = Header("Тест", 'utf-8')
subject = 'Тест отправки email через Python SMTP'
msgRoot['Subject'] = Header(subject, 'utf-8')
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
mail_msg = """<p>Тест отправки электронной почты на Python...</p>
<p><a href="http://www.example.com">Ссылка на пример руководства</a></p>
<p>Демонстрация изображения:</p>
<p><img src="cid:image1"></p>"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, msgRoot.as_string())
print ("Письмо успешно отправлено")
except smtplib.SMTPException:
print ("Ошибка: Не удалось отправить письмо")
$ python3 test.py
邮件发送成功
Проверьте входящие (если письмо попало в папку спама, возможно, потребуется переместить его во входящие для правильного отображения), и вы увидите сообщение электронной почты:

Отправка через сторонний SMTP-сервис
Здесь мы используем SMTP-сервис QQ Mail (также можно использовать 163, Gmail и т. д.). Вам необходимо настроить следующее:

В QQ Mail пароль задаётся путём генерации кода авторизации:

Адрес SMTP-сервера QQ Mail: smtp.qq.com, SSL-порт: 465.
В следующем примере вам нужно изменить: адрес электронной почты отправителя (ваша почта QQ), пароль, адрес электронной почты получателя (можно отправить самому себе).
QQ SMTP
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='[email protected]'
my_pass = 'xxxxxxxxxx'
my_user='[email protected]'
def mail():
ret=True
try:
msg=MIMEText('Заполните содержимое электронного письма','plain','utf-8')
msg['From']=formataddr(["FromExample",my_sender])
msg['To']=formataddr(["FK",my_user])
msg['Subject']="Тест отправки электронного письма (пример)"
server=smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(my_sender, my_pass)
server.sendmail(my_sender,[my_user,],msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail()
if ret:
print("Письмо успешно отправлено")
else:
print("Не удалось отправить письмо")
$ python test.py
邮件发送成功
После успешной отправки войдите в почтовый ящик получателя, чтобы просмотреть:

Дополнительные материалы см. здесь:https://docs.python.org/3/library/email-examples.html。
Другие расширения