Отправка электронной почты с помощью Python SMTP
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.
Пример
Следующий пример требует, чтобы на вашем компьютере был установлен сервис с поддержкой SMTP, например sendmail.
Ниже приведён простой пример отправки электронного письма с помощью 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 (агент передачи почты), она выведет:
$ python test.py
邮件发送成功
Проверьте входящие (обычно в папке спама), чтобы увидеть письмо:

Если у нас нет доступа к sendmail на нашей машине, мы также можем использовать доступ по SMTP от других поставщиков услуг электронной почты (QQ, NetEase, Google и т. д.).
Пример
import smtplib
from email.mime.text import MIMEText
from email.header import Заголовок
mail_host="smtp.XXX.com"
mail_user="XXXX"
mail_pass="XXXXXX"
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Тест отправки email на 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 "Ошибка: не удалось отправить письмо"
Отправка писем в формате HTML с помощью Python
Разница между отправкой писем в формате 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>Тест отправки email с 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, она выведет:
$ python 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 = 'Тест email через SMTP на Python'
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 "Ошибка: Не удалось отправить письмо"
$ python 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>Тест отправки email с помощью 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 "Ошибка: Не удалось отправить письмо"
$ python 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/2/library/email-examples.html。
Другие расширения