- Прикручиваем скрипт для отправки почты на Python (SSL/TLS)
- Матчасть
- Подключение
- Отправка
- Настройка ящика
- Пишем код
- Вариант для SSL
- Python smtp tls Яндекс почта
- Как отправить письмо с помощью SMTPlib
- 1. Оформите письмо с помощью заголовков
- 2. Закодируйте письмо
- 3. Подключитесь к почтовому сервису
- Адреса для нескольких популярных сервисов:
- 4. Отправьте письмо
- Бонус: если хочется отправить письмо через Gmail
- Попробуйте бесплатные уроки по Python
Прикручиваем скрипт для отправки почты на Python (SSL/TLS)
Эйчары большие любители устраивать регулярное ревью позиции, как они это объясняют «в корреляции с твоими целями». Представь их удивление, когда ты скажешь, что теперь твоя цель — написать почтовый скрипт для отправки почты на Python
Для отправки электронной почты используется протокол SMTP. Python в данном случае — не панацея. Поднять почтовый сервер можно и на node.js, а чтобы не пропустить все лайфхаки по программированию на фрейморках рекомендуем занести в закладки блог Babacoding.
Матчасть
Электронную почту в Python можно отправлять двумя способами: поднять собственный SMTP-сервер (с помощью модуля smtpd), либо написать скрипт с помощью библиотеки smtplib, являющейся клиентом этого протокола
Во втором случае для отправки нам нужно подключиться к какому-либо SMTP-серверу, например smtp.yandex.ru, поэтому для примера мы возьмем свой электронный ящик на Яндексе, но можно использовать абсолютно любую, даже доменную почту.
Если вдруг у вас нет библиотеки smtplib, её можно установить через менеджер пакетов PIP, командой C:\Python>python -m pip install smtplib через CMD (переместитесь с помощью команды CD в каталог, где у вас установлен Python)
Подключение
Подключаться к серверу мы будем через конструктор класса SMTP — именно он инкапсулирует SMTP-соединение
class smtplib.SMTP(host=», port=0, local_hostname=None, [timeout, ]source_address=None)
- Host — указывается IP-адрес или домен SMTP-сервера
- Port — указывается порт подключения. Тут всё зависит от того, используется ли на сервере шифрование. Как правило, порт без шифрования — 25, с TLS — 587, c SSL — 465)
- Local_hostname — если SMTP-сервер расположен на локальном ПК, то необходимо указать localhost.
- Source_address — необязательный параметр, который позволяет выполнять привязку к определенному исходному адресу на машине с несколькими сетевыми интерфейсами и/или к определенному исходному TCP-порту
Отправка
Отправка самого сообщения происходит за счет метода SMTP.sendmail —
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())
- From_addr — адрес отправителя.
- To_addrs — адрес получателя
- Msg — отправляемое сообщение (формат этого параметра должен быть строкой)
Настройка ящика
Так как мы тестируем отправку через ящик Яндекса, перед тем как начать необходимо проверить настройки — скрипт работает как обычный почтовый клиент.
Первым делом, необходимо проверить, включен ли в ящике IMAP (без него SMTP работать не будет по соображениям безопасности)
Если у вас активны пароли приложений — не забудьте получить дополнительный пароль для своего скрипта:
Пишем код
Импортируем нужные для работы библиотеки:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText
Далее создаём сообщение с помощью класса MIMEMultipart — нужно указать все заголовки (части) составного сообщения. MIMEText предназначен для текста (например, text/plain или text/html), если все сообщение находится в текстовом формате или его часть.
msg = MIMEMultipart() msg['From'] = '****@yandex.ru' msg['To'] = '****@gmail.com' msg['Subject'] = 'Тест скрипта SMTP' message = 'Это тестовое сообщение и отвечать на него не нужно' msg.attach(MIMEText(message))
Если нужно написать сообщение в несколько строк используйте символ переноса строки \n
message = ‘Это тестовое сообщение и отвечать на него не нужно \n Но если очень хочется, то можно’
Создаём экземпляр (объект) класса SMTP. Обратите внимание на строчку mailserver.set_debuglevel(True) — так мы включаем режим отладки, чтобы в случае проблем можно было посмотреть логи
mailserver = smtplib.SMTP('smtp.yandex.ru',587) mailserver.set_debuglevel(True)
Дальше нам нужно инициировать рукопожатие TLS. Отправляем команду ehlo() — сервер должен ответить на него. Затем запускаем сам протокол. После запуска вы должны снова вызвать ehlo() перед аутентификацией.
# Определяем, поддерживает ли сервер TLS mailserver.ehlo() # Защищаем соединение с помощью шифрования tls mailserver.starttls() # Повторно идентифицируем себя как зашифрованное соединение перед аутентификацией. mailserver.ehlo()
Подключаемся к серверу, отправляем письмо. Используем as_string (), чтобы превратить MIMEText в строку
mailserver.login('*****@yandex.ru', 'здесь_пароль') mailserver.sendmail('*****@yandex.ru','****@gmail.com',msg.as_string())
Финальный вариант кода. В нём мы добавили простую обработку исключений (try/except) для удобства вывода
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText msg = MIMEMultipart() msg['From'] = '******@yandex.ru' msg['To'] = '*****@gmail.com' msg['Subject'] = 'Тест скрипта SMTP' message = 'Это тестовое сообщение и отвечать на него не нужно' msg.attach(MIMEText(message)) try: mailserver = smtplib.SMTP('smtp.yandex.ru',587) mailserver.set_debuglevel(True) # Определяем, поддерживает ли сервер TLS mailserver.ehlo() # Защищаем соединение с помощью шифрования tls mailserver.starttls() # Повторно идентифицируем себя как зашифрованное соединение перед аутентификацией. mailserver.ehlo() mailserver.login('******@yandex.ru', 'здесь_пароль') mailserver.sendmail('******@yandex.ru','******@gmail.com',msg.as_string()) mailserver.quit() print("Письмо успешно отправлено") except smtplib.SMTPException: print("Ошибка: Невозможно отправить сообщение")
Письмо успешно дошло адресату:
Для отправки нескольким получателям добавьте конструкцию
recipients = [‘1@mail.com’, ‘2@mail.com’]
В строчке mailserver.sendmail исправьте код
mailserver.sendmail (*****@yandex.ru, recipients, msg.as_string())
Вариант для SSL
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText msg = MIMEMultipart() msg['From'] = '*******@yandex.ru' msg['To'] = '******@gmail.com' msg['Subject'] = 'Тест скрипта SMTP' message = 'Это тестовое сообщение и отвечать на него не нужно' msg.attach(MIMEText(message)) try: mailserver = smtplib.SMTP_SSL('smtp.yandex.ru',465) mailserver.set_debuglevel(True) mailserver.login('*****@yandex.ru', 'здесь_пароль') mailserver.sendmail('*****@yandex.ru','******@gmail.com',msg.as_string()) mailserver.quit() print("Письмо успешно отправлено") except smtplib.SMTPException: print("Ошибка: Невозможно отправить сообщение")
Python smtp tls Яндекс почта
Недавно перешли на корпоративную Яндекс почту в связи с этим у системного администратора встала задача по отправке почты через защищенный smtp Яндекса.
На самом деле можно воспользоваться и PHP или перенастроить Postfix для этого, но Python для этого как-то более заинтересовал, в силу того, что все заработало с первого раза да и код смотриться куда более понятным и лаконичным.
В феврале 2014 года был издана программа Перископ — Кейвоном Бейкпуром и Джо Берштейном. Благодаря этой программе Вы можете очутиться совместно с другими слушателями на концерте популярных групп, пуститься в путешествие по миру через камеру, посетить вечеринку или экскурсию.
Ну да ладно давайте перейдем непосредcтвенно к небольшому и лаконичному коду на Python.
Для этого создадим файлик с именем mail-yandex.py (разумеется на Linux), но как понимается этот код скорее всего заработает и на ОС Windows.
Поместив туда следующее содержимое, разумеется указать свои данные отправителя и получателя. Так же он подходит и для других почтовых сервисов.
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
msg = MIMEMultipart()
msg[‘From’] = ‘от кого’
msg[‘To’] = ‘кому’
msg[‘Subject’] = ‘simple email in python’
message = ‘here is the email’
msg.attach(MIMEText(message))
mailserver = smtplib.SMTP(‘smtp.yandex.ru’,587)
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login(‘ваш логин Яндекс’, ‘ваш пароль Яндекс’)
mailserver.sendmail(‘от кого’,’кому’,msg.as_string())
mailserver.quit()
Теперь осталось только переписать все скрипты на Python, а заодно и вспомнить, подучить его возможности.
Количество просмотров: 8471
Комментарии к статье:
Автор комментария: Никита
Дата: 2016-04-27
Добавить комментарий
Как отправить письмо с помощью SMTPlib
SMTP — Simple Mail Transfer Protocol (Простой Протокол Передачи Почты). Но слово простой совсем не значит, что есть крутой. SMTP — самый популярный протокол для отправки почты между серверами.
По итогу этого туториала вы сможете правильно оформить своё письмо и отправить его по почте.
1. Оформите письмо с помощью заголовков
Чтобы отправить письмо, ваша программа должна связаться с сервером почтового сервиса (Gmail, Yandex, Mail.ru и т.д.) и передать ему всю нужную информацию: кому, от кого, что в письме. Протокол устанавливает правила, как должно выглядеть такое сообщение:
From: Адрес отправителя To: Адрес получателя Subject: Заголовок письма Content-Type: text/plain; charset="UTF-8"; Начало вашего текста .
Например, если нужно отправить письмо Привет! с адреса mymail@gmail.com на адрес friend@gmail.com с заголовком Важно! , сообщение должно выглядеть так:
From: mymail@gmail.com To: friend@gmail.com Subject: Важно! Content-Type: text/plain; charset="UTF-8"; Привет!
2. Закодируйте письмо
Русский язык не поддерживается в протоколе SMTP, поэтому письмо надо предварительно закодировать в UTF-8 . Вот как это делается:
letter = """\ From: mymail@gmail.com To: friend@gmail.com Subject: Важно! Content-Type: text/plain; charset="UTF-8"; Привет!""" letter = letter.encode("UTF-8") print(letter)
b'From: mymail@gmail.com\nTo: friend@gmail.com\nSubject: \xd0\x92\xd0\xb0\xd0\xb6\xd0\xbd\xd0\xbe!\nContent-Type: text/plain; charset="UTF-8";\n\n\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!'
3. Подключитесь к почтовому сервису
С письмом понятно, но как же передать всё это серверу? Чтобы с ним общаться, нужно знать его адрес. Почтовые сайты сами публикуют адреса своих SMTP серверов.
Адреса для нескольких популярных сервисов:
Для примера возьмём Gmail. В первую очередь свяжемся с сервером:
import smtplib server = smtplib.SMTP_SSL('smtp.gmail.com:465')
Затем зайдём в свой почтовый ящик. Для этого передайте методу .login() свои логин и пароль:
import smtplib server = smtplib.SMTP_SSL('smtp.gmail.com:465') server.login(login, password)
4. Отправьте письмо
Теперь, когда письмо закодировано, его можно наконец-то отправить. Метод .sendmail() ждёт от вас 3 значения: от кого, кому и что передать. Да, вы уже указали это в письме, но придётся указать второй раз:
import smtplib server = smtplib.SMTP_SSL('smtp.gmail.com:465') server.login(login, password) server.sendmail(email_from, email_to, message) server.quit()
Обратите внимание, что в конце мы прощаемся с сервером методом .quit() , чтобы он больше не ждал от нас писем. Это правило хорошего тона. Соблюдать его не обязательно, но бездушной машине будет приятно.
Бонус: если хочется отправить письмо через Gmail
При запуске кода вы можете получить ошибку SSL такого вида:
smtplib ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131)
Проблема связана с устаревшей версией протокола шифрования SSL. Чинится ошибка добавлением ещё нескольких строк кода с явным указанием номера версии. Подробно проблема обсуждается на StackOverflow.
... server = smtplib.SMTP('smtp.gmail.com:587') import ssl # переместите в шапку файла context = ssl.SSLContext(ssl.PROTOCOL_TLS) server.ehlo() server.starttls(context=context) server.ehlo() ...
При запуске код либо заработает, либо вывалится ошибка с кодом 535-5.7.8 :
SMTPAuthenticationError 535-5.7.8 Username and Password not accepted
Эта ошибка связана с настройками безопасности на Gmail. Зайдите из-под своего аккаунта на страницу Ненадежные приложения и разрешите доступ “Небезопасным приложениям”. Подробно проблема обсуждается на StackOverlfow.
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.