Python отправка email yandex

Прикручиваем скрипт для отправки почты на 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 — отправляемое сообщение (формат этого параметра должен быть строкой)

Настройка ящика

Так как мы тестируем отправку через ящик Яндекса, перед тем как начать необходимо проверить настройки — скрипт работает как обычный почтовый клиент.

Читайте также:  Java lang assertionerror no further requests expected

Первым делом, необходимо проверить, включен ли в ящике 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("Ошибка: Невозможно отправить сообщение")

Источник

Читайте также:  Vk api чат бот php

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 серверов.

Читайте также:  Статистический анализ данных python

Адреса для нескольких популярных сервисов:

Для примера возьмём 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

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Источник

Оцените статью