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

При решении задач, связанных с мониторингом, почти всегда сталкиваемся с проблемой уведомления по электронной почте. В этом нам поможет стандартная библиотека 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 <someaccount@gmail.com>'
#Кому:
toaddr = 'Administrator <email@somedomain.ru>'
#Тема письма:
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.

  • Чума чувак, спасип тебе за экономию моего времени

  • Dimasm:

    На Windows работает, проверял на Python 3.4.0.
    Работает с gmail, а вот с mail.ru почему-то не работает — в лог вообще ничего не сыпется, как будто сервер не отвечает. Порт указывал 465, как написано здесь: http://help.mail.ru/enmail-help/mailer/popsmtp.
    Кто-нибудь решил эту проблему (с mail.ru)?

    • root4root aka admin:
      1
      2
      3
      4
      5
      
      server = smtplib.SMTP_SSL('smtp.mail.ru:465')
      server.set_debuglevel(1);
      server.login(username, password)
      server.sendmail(fromaddr, toaddr, msg)
      server.quit()
  • Anton:

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

    и все же .. где почитать? как разобраться, чтобы поддерживалась кириллица ?

    • root4root aka admin:

      Почитать по поводу заголовков: кодировка и MIME. В принципе там не так уж всё и сложно, может быть я соберусь как-нибудь написать пост с поддержкой русского.

  • игорь:

    а точка с запятой зачем в конце 29-ой строки??? это же Python — разделители не нужны

  • Сталкер Велес:

    Спасибо большое =)

  • Lion:

    Спасибо, все толково, корректно, профессионально. Браво!

  • Оля:

    Спасибо за статью! Очень доходчиво все написано.

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