Отправка электронной почты через 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:

Пример

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Адрес электронной почты получателя, можно указать ваш почтовый ящик QQ или другой почтовый ящик # Три параметра: первый — текстовое содержимое, второй 'plain' задаёт текстовый формат, третий 'utf-8' задаёт кодировку. 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 и т. д.).

Пример

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header # Сторонний SMTP-сервис mail_host="smtp.XXX.com" # Установить сервер mail_user="XXXX" # Имя пользователя mail_pass="XXXXXX" # Пароль sender = '[email protected]' receivers = ['[email protected]'] # Адрес электронной почты получателя, можно указать ваш почтовый ящик QQ или другой почтовый ящик 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) # 25 — это номер порта SMTP 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. Конкретный код выглядит следующим образом:

Пример

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Электронная почта получателя, можно указать ваш почтовый ящик QQ или другой почтовый ящик 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 для отправки.

Пример

#!/usr/bin/python3 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]'] # Электронная почта получателя, можно указать свой почтовый ящик QQ или другой почтовый ящик # Создайте экземпляр с вложениями 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')) # Создайте вложение 1, отправьте файл test.txt из текущего каталога 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) # Создайте вложение 2, отправьте файл example.txt из текущего каталога 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-тексте электронного письма добавление внешних ссылок обычно не поддерживается почтовыми сервисами. Ниже показан правильный пример добавления изображений:

Пример

#!/usr/bin/python3 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]'] # Адрес получателя, можно указать вашу почту QQ или другую почту 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() # Определите ID изображения, на который ссылаются в HTML-тексте 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

#!/usr/bin/python3 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) # SMTP-сервер в почте отправителя, порт 25. server.login(my_sender, my_pass) # В скобках указываются учетная запись электронной почты отправителя и пароль электронной почты. server.sendmail(my_sender,[my_user,],msg.as_string()) # В скобках указываются учетная запись отправителя, учетная запись получателя и отправляемое электронное письмо. server.quit() # Закрыть соединение except Exception: # Если инструкции в try не выполняются, будет выполнен следующий ret=False. ret=False return ret ret=mail() if ret: print("Письмо успешно отправлено") else: print("Не удалось отправить письмо")
$ python test.py 
邮件发送成功

После успешной отправки войдите в почтовый ящик получателя, чтобы просмотреть:

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

Другие расширения