При решении задач, связанных с мониторингом, почти всегда сталкиваемся с проблемой уведомления по электронной почте. В этом нам поможет стандартная библиотека 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.
root4root aka admin
Чума чувак, спасип тебе за экономию моего времени
На Windows работает, проверял на Python 3.4.0.
Работает с gmail, а вот с mail.ru почему-то не работает — в лог вообще ничего не сыпется, как будто сервер не отвечает. Порт указывал 465, как написано здесь: http://help.mail.ru/enmail-help/mailer/popsmtp.
Кто-нибудь решил эту проблему (с mail.ru)?
Огромное спасибо
Q: Почему не используется русская кодировка?
A: Процесс формирования письма гораздо сложнее.
и все же .. где почитать? как разобраться, чтобы поддерживалась кириллица ?
Почитать по поводу заголовков: кодировка и MIME. В принципе там не так уж всё и сложно, может быть я соберусь как-нибудь написать пост с поддержкой русского.
а точка с запятой зачем в конце 29-ой строки??? это же Python — разделители не нужны
Спасибо большое =)
Спасибо, все толково, корректно, профессионально. Браво!
Спасибо за статью! Очень доходчиво все написано.