Отправка писем на Python по SMTP
По работе с почтой на Python с помощью SMTPlib в сети довольно много материалов, но попавшиеся мне примеры, описывали smtp подключение без шифрования, хотя популярные почтовые сервисы давно работают только с ним — yandex, mail.ru и тем более google.
В большинстве примеров с SSL перед авторизацией и отправкой почты делается вызов метода starttls():
1 2 3 |
server = smtplib.SMTP('smtp.yandex.ru', 465) server.starttls() server.login(fromaddr,password) |
Но у меня этот код не заработал. После некоторых поисков на stackoverflow попался совет использовать SMTP_SSL вместо SMTP, в результате была написана следующая функция:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import smtplib # функция отправки письма на почту def mail(to, subject, message): sender = 'email отправителя' sender_password = 'пароль отправителя' mail_lib = smtplib.SMTP_SSL('smtp.yandex.ru', 465) mail_lib.login(sender, sender_password) for to_item in to: msg = 'From: %s\r\nTo: %s\r\nContent-Type: text/html; charset="utf-8"\r\nSubject: %s\r\n\r\n' % (sender, to_item, subject) msg += message mail_lib.sendmail(sender, to_item, msg) mail_lib.quit() |
Переменная sender, объявленная внутри функции, принимает значение от кого отправляем письмо, sender_password — соответственно пароль отправителя.
Входные параметры функции:
to — массив получателей письма (часто получателями являются разработчик и клиент, поэтому массив, а не строка)
subject — тема письма
message — текст письма.
Пример вызова функции:
1 2 |
mail(['email 1го получателя', 'email 2го получателя'], 'Ошибка импорта', 'Возникла ошибка в скрипте импорта Import.py:<br>' + text) |
Т.к. в Content-Type указано text/html, то можно использовать HTML-теги, в частности <br> для перевода строки. Если поставить text/plain, то переход на новую строку будет символами \r\n.
Функция работает на Python 2.7, но на Python 3.6 получил проблемы с кодировкой для русских символов:
1 2 3 4 5 6 7 8 9 10 |
Traceback (most recent call last): File "test3.py", line 118, in <module> echo_error('test error') File "test3.py", line 102, in echo_error 'test message<br>' + text) File "test3.py", line 90, in mail mail_lib.sendmail(sender, to_item, msg) File "C:\Program Files (x86)\Python36-32\lib\smtplib.py", line 855, in sendmail msg = _fix_eols(msg).encode('ascii') UnicodeEncodeError: 'ascii' codec can't encode characters in position 101-106: ordinal not in range(128) |
Свой скрипт я запускал на Windows 10, так что у Вас этой проблемы может не быть. У меня оперативно исправить ошибку не получилось, поэтому пока забил. Письма на английском отправляются без проблем.
Так же письма не сохраняются в папке «Отправленные» на почтовом сервере. Если это нужно , то требуется их положить на сервер по протоколу IMAP.
Источники:
Официальная документация (для тех, кто хорошо знает английский):
https://docs.python.org/2/library/smtplib.html
https://docs.python.org/2/library/email.html
https://docs.python.org/2/library/email-examples.html
Оригинальную функцию взял отсюда: http://python-3.ru/page/otpravka-pisem-iz-python-smtplib
Здесь помимо прочего описано как добавить вложение: https://python-scripts.com/send-email-smtp-python
Ответ, в котором нашлось решение: https://stackoverflow.com/questions/24672079/send-email-using-smtp-ssl-port-465