Как отправить сообщение на почту python
Перейти к содержимому

Как отправить сообщение на почту python

  • автор:

Как отправить письмо на почту с помощью Python?

Подскажите, понадобилось на python отправлять сообщение на почту yandex.
Нашел код, но вылетает ошибка.
Почитал, написано что ошибка может вылетать, так как пароль может быть не в кодировке utf-8.
Пишу в коде для password, addr_from, addr_to это: encode(encoding=’utf-8′) — ноль эмоций.
Подскажите, как тогда исправить ошибку?

import smtplib # Импортируем библиотеку по работе с SMTP # Добавляем необходимые подклассы - MIME-типы from email.mime.multipart import MIMEMultipart # Многокомпонентный объект from email.mime.text import MIMEText # Текст/HTML addr_from = "[email protected]" addr_to = "[email protected]" password = "pass" # пароль от почты addr_from msg = MIMEMultipart() # Создаем сообщение msg['From'] = addr_from # Адресат msg['To'] = addr_to # Получатель msg['Subject'] = 'Тема сообщения' # Тема сообщения body = "Текст сообщения" msg.attach(MIMEText(body, 'plain')) # Добавляем в сообщение текст server = smtplib.SMTP_SSL('smtp.yandex.ru', 465) # Создаем объект SMTP # server.starttls() # Начинаем шифрованный обмен по TLS server.login(addr_from, password) # Получаем доступ server.send_message(msg) # Отправляем сообщение server.quit() # Выходим 
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Error: authentication failed: This user does not have access rights to this service') 

Отправка электронных писем с помощью Python

img

В этой статье посмотрим как можно отправлять электронные письма при помощи Python. Есть и более простые способы это сделать, но мне больше подошел именно следующий вариант.

Python Send Email

Итак, вот как это выглядит: у вас есть имена и адреса электронной почты некоторой группы контактов. И вы хотите отправить каждому из них письмо, добавив в начале сообщения «Уважаемый [имя]».

Для простоты вы можете хранить всю контактную информацию просто в файле, а не в базе данных. Также вы можете сохранить в файл шаблон сообщения, которое вы хотите отправить.

Модуль smtplib в Python – это практически все, что вам понадобиться для отправки простых электронных писем без заполнения темы письма или какой-либо еще дополнительной информации. Но, конечно, для настоящих писем вам необходимо заполнить строку темы письма и другую информацию, и, возможно, даже прикрепить изображения или какие-то другие вложения.

Вот тут и приходит на помощь пакет email в Python. Имейте в виду, что нельзя отправить сообщение через электронную почту, используя только этот пакет. Вам необходимо совместить email и smtplib .

Обязательно ознакомьтесь с подробной официальной документацией для каждого из этих пакетов.

Вот четыре основных шага для отправки электронных писем с помощью Python:

  1. Настройте SMTP-сервер и войдите в свою учетную запись.
  2. Создайте объект сообщения MIMEMultipart и загрузите его с соответствующими заголовками для полей From (От), To (Кому) и Subject (Тема).
  3. Добавьте тело сообщения.
  4. Отправьте сообщение с помощью объекта SMTP-сервера.

А теперь давайте рассмотрим весь процесс.

Допустим, что у вас есть файл контактов mycontacts.txt , который выглядит вот так:

user@computer ~ $ cat mycontacts.txt john johndoe@example.com katie katie2016@example.com

Каждая строка соответствует одному контакту. В каждой строке пишется имя, а за ним следует адрес электронной почты. У меня все сохранено в нижнем регистре. Я оставлю преобразования любых полей или некоторых начальных букв в верхний регистр логике программирования, если это будет необходимо. В Python это все довольно просто.

Далее у нас есть файл с шаблоном сообщения message.txt .

user@computer ~ $ cat message.txt Dear $, This is a test message. Have a great weekend! Yours Truly

Обратили внимание на $ ? Это шаблонная строка в Python. Шаблонные строки можно легко заменить другими строками; в данном примере $ будет заменено настоящим именем человека (вы скоро это увидите).

А теперь давайте перейдем к коду Python. Для начала нам необходимо прочитать контакты из файла mycontacts.txt . Мы, кстати, можем обобщить это в отдельную функцию.

# Function to read the contacts from a given contact file and return a # list of names and email addresses def get_contacts(filename): names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails

Функция get_contacts() в качестве аргумента принимает имя файла. Она откроет этот файл, прочитает каждую строку (то есть каждый контакт), разделит их на имя и адрес электронной почты, а затем добавит их в два отдельных списка. И, наконец, в качестве результата работы функции возвращаются эти два списка.

Также нам нужна функция для того, чтобы прочитать шаблон сообщения (такой как message.txt ) и вернуть объект типа Template , созданный из его содержимого.

from string import Template def read_template(filename): with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content)

Как и предыдущая функция, в качестве аргумента она принимает имя файла.

Для того, чтобы отправить письмо, вам необходимо использовать протокол SMTP (Simple Mail Transfer Protocol – протокол простого обмена электронной почтой). Как уже упоминалось ранее, у Python есть необходимые для этого библиотеки.

# import the smtplib module. It should be included in Python by default import smtplib # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD)

В приведенном выше фрагменте кода вы импортируете smtplib , а затем создаете экземпляр SMTP, который формирует SMTP-соединение. В качестве параметра он принимает адрес хоста и номер порта, оба эти параметра полностью зависят от настроек SMTP вашего поставщика услуг электронной почты. Например, в случае Outlook строка под номером 4 будет выглядеть вот так:

s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587)

Для того, чтобы все работало, вам необходимо использовать адрес хоста и номер порта конкретно вашего поставщика услуг электронной почты.

MY_ADDRESS и PASSWORD – это две переменные, которые содержат полный адрес электронной почты и пароль от учетной записи, которую вы собираетесь использовать.

А теперь самое время получить контактную информацию и шаблон сообщения, используя функции, которые мы определили ранее.

names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt')

А теперь давайте отправим отдельное письмо каждому из этих контактов.

# import necessary packages from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg

Для каждого name (имя) и email (адрес электронной почты) (из файла с контактами) вы создаете объект MIMEMultipart , настраиваете заголовки типов содержимого From (от), To (кому), Subject (тема) как словарь ключевых слов, а затем прикрепляете тело сообщения к объекту MIMEMultipart в виде обычного текста. Возможно, вам захочется прочитать документацию, чтобы узнать больше о других типах MIME , с которыми вы также можете поэкспериментировать.

Также обратите внимание, что в строке 10 выше я заменяю $ фактическим именем, которое было извлечено из файла с контактами с помощью механизма шаблонизации в Python.

В данном конкретном примере я каждый раз удаляю объект MIMEMultipart и создаю его заново при каждой итерации цикла.

Как только вы проделаете все это, то сможете отправить сообщение, используя простую удобную функцию send_message() объекта SMTP, который вы создали ранее.

А вот и полный код:

import smtplib from string import Template from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText MY_ADDRESS = 'my_address@example.comm' PASSWORD = 'mypassword' def get_contacts(filename): """ Return two lists names, emails containing names and email addresses read from a file specified by filename. """ names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails def read_template(filename): """ Returns a Template object comprising the contents of the file specified by filename. """ with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) def main(): names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt') # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD) # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # Prints out the message body for our sake print(message) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg # Terminate the SMTP session and close the connection s.quit() if __name__ == '__main__': main()

Python Telegram бот, отправить письмо с файлом на почту

Python Telegram бот, отправить письмо с файлом на почту

Это небольшой пост, скорее заметка, где мы разработаем асинхронного Telegram бота на Python, и научим его отправлять сообщения на электронную почту и перенаправлять прикрепленный, вложенный файл.

Старт

Прежде всего нужно разрешить внешним приложением использовать почтовый ящик для отправки электронных писем. (Для демонстрации использовал почту Яндекс) Для этого на странице управление аккаунтом переходим во вкладку безопасность и создаем пароль для внешнего приложения.

Python Telegram bot отправка файла на электронную почту

Отправка письма

Установим библиотеку, с помощью который будем асинхронно передавать письма.

pip install aiosmtplib

Создадим файл smtp.py . Укажем адрес электронной почты и пароль, что создали ранее, и попробуем отправить письмо с текстом «Привет» самим себе.

from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from aiosmtplib import SMTP import asyncio EMAIL = 'example@yandex.ru' PWD = 'password' async def send_mail(subject, to, msg): message = MIMEMultipart() message["From"] = EMAIL message["To"] = to message["Subject"] = subject message.attach(MIMEText(f" ", "html", "utf-8")) smtp_client = SMTP(hostname="smtp.yandex.ru", port=465, use_tls=True) async with smtp_client: await smtp_client.login(EMAIL, PWD) await smtp_client.send_message(message) if __name__ == '__main__': asyncio.run(send_mail('Тема письма', 'example@yandex.ru', '

Привет

'))

Python Telegram bot отправка файла на электронную почту

Письмо успешно доставлено.

Телеграм бот

Установим библиотеку для удобного взаимодействия с Telegram Bot API.

pip install pyTelegramBotAPI

Создадим файл main.py , и напишем простого бота, который на сообщение с текстом “Письмо” будет отправлять на почту id пользователя.

Для этого импортируем ранее созданный smtp.py и добавляем функцию send_mail к обработчику сообщений.

from telebot.async_telebot import AsyncTeleBot import asyncio import smtp TOKEN = 'TOKEN' bot = AsyncTeleBot(TOKEN) @bot.message_handler(commands=['start']) async def send_welcome(message): await bot.send_message(message.chat.id, "Привет") @bot.message_handler(func=lambda message: message.text.lower() == 'письмо') async def send_mail_text(message): await bot.send_message(message.chat.id, 'Письмо отправлено') cormail = smtp.send_mail('Новое сообщение','example@yandex.ru', f'

User ID ') asyncio.gather(asyncio.create_task(cormail)) asyncio.run(bot.polling())

Проверяем, отправив сообщение боту.

Python Telegram bot отправка файла на электронную почту

Письмо с ID пользователя доставлено.

Отправка файла

Тут все просто, немного изменим содержимое функции send_mail и добавим новый параметр url . Не забываем импортировать aiohttp , io , и MIMEApplication

. message.attach(MIMEText(f" ", "html", "utf-8")) if url: async with aiohttp.ClientSession() as session: async with session.get(url) as responce: buffer = io.BytesIO(await responce.read()) part = MIMEApplication(buffer.read(), Name=url.split('/')[-1]) part['Content-Disposition'] = f'attachment; filename=' message.attach(part) smtp_client = SMTP(hostname="smtp.yandex.ru", port=465, use_tls=True) . 

Так же в боте добавим новую функцию, и сам обработчик для перенаправления полученного файла на почту.

@bot.message_handler(content_types=['document']) async def send_mail_document(message): await bot.send_message(message.chat.id, 'Файл отправлен') document_id = message.document.file_id file_info = await bot.get_file(document_id) url_file = f'http://api.telegram.org/file/bot/' cormail = smtp.send_mail('Новое сообщение', 'example@yandex.ru', f'

Файл отправлен пользователем ID ', url_file) asyncio.gather(asyncio.create_task(cormail))

Запускаем и наслаждаемся.

Как отправить сообщение на почту python

портфолио

Python. Простая отправка email уведомлений.

При решении задач, связанных с мониторингом, почти всегда сталкиваемся с проблемой уведомления по электронной почте. В этом нам поможет стандартная библиотека Python — smtplib.

Задача: отправлять письмо в качестве предупреждения системы. В тело письма добавить текст, взятый из параметра вызова. Использовать обычный ящик на gmail.com, с которого и отправлять сообщения.

Почему возникла такая необходимость? Нужен был простой способ отправки e-mail сообщений. Без установки MTA (Mail Tranfer Agent), таких как qmail или postfix. Без прямой и обратной DNS зоны, если отсутствует доверительный (корпоративный) почтовый сервер. Без настройки RELAY и прочих танцев… Одним словом, простой! =))

Скрипт написан для использования с ОС Linux. Будет ли работать с продукцией Microsoft не знаю.
Реализация с комментариями mail.py:

#!/usr/bin/python #file mail.py import smtplib import sys #Параметр, передаваемый при запуске скрипта: txtparam=sys.argv[1] #От кого: fromaddr = 'Mr. Robot ' #Кому: toaddr = 'Administrator ' #Тема письма: subj = 'Notification from system' #Текст сообщения: msg_txt = 'Notice:\n\n ' + txtparam + '\n\nBye!' # #Создаем письмо (заголовки и текст) msg = "From: %s\nTo: %s\nSubject: %s\n\n%s" % ( fromaddr, toaddr, subj, msg_txt) #Логин gmail аккаунта. Пишем только имя ящика. #Например, если почтовый ящик someaccount@gmail.com, пишем: username = 'someaccount' #Соответственно, пароль от ящика: password = 'somepassword' #Инициализируем соединение с сервером gmail по протоколу smtp. server = smtplib.SMTP('smtp.gmail.com:587') #Выводим на консоль лог работы с сервером (для отладки) server.set_debuglevel(1); #Переводим соединение в защищенный режим (Transport Layer Security) server.starttls() #Проводим авторизацию: server.login(username,password) #Отправляем письмо: server.sendmail(fromaddr, toaddr, msg) #Закрываем соединение с сервером server.quit()

Скрипт используем следующим образом:
$> mail.py «Web server is down»

F.A.Q.
Q: Почему не используется русская кодировка?
A: Процесс формирования письма гораздо сложнее. В большинстве случаев не оправдан.

Q: Почему Python, а не shell?
А: Для использования shell нужен консольный mail клиент. Обычно таковой отсутствует.

Q: Почему не Perl?
A: Для работы с почтой требуется установка дополнительных библиотек. Python сразу готов к работе.

Q: Где использовать?
A: В любых сервисах автоматизации или мониторинга, в качестве внешнего вызова. Например, Nagios или собственный скрипт, написанный на shell.

root4root aka admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *