Автор оригинала: Mike Driscoll.
Где я работаю, мы запускаем ряд сценариев входа в систему, написанные в Python. Когда ошибка возникает в одном из этих скриптов, мы хотим знать. Итак, мы написали простой сценарий Python, чтобы отправить нам сообщение об ошибке. С тех пор мне нужно было выяснить способ отправки вложений с некоторыми из моих более продвинутых сценариев. Если вы давнее читатель этого блога, вы можете вспомнить WXPymail, которая была простая программа WXPYPHON, которая могла бы отправить электронную почту. В этой статье вы обнаружите, как отправить электронную почту с помощью стандартной библиотеки Python. Мы сосредоточимся на SMTPLIB и модулях электронной почты.
Отправка электронного письма с smtplib
Отправка электронного письма со SMTPLIB Super Simple. Вы хотите увидеть, насколько просто? Конечно, у вас! Давайте взглянем:
import smtplib import string SUBJECT = "Test email from Python" TO = "mike@mydomain.com" FROM = "python@mydomain.com" text = "blah blah blah" BODY = string.join(( "From: %s" % FROM, "To: %s" % TO, "Subject: %s" % SUBJECT , "", text ), "\r\n") server = smtplib.SMTP(HOST) server.sendmail(FROM, [TO], BODY) server.quit()
Обратите внимание, что фактическое соединение и отправка электронного письма были только две строки кода. Остальная часть кода просто создала сообщение для отправки. На работе мы обнимаем это в Callable функции и передаем ее некоторой информации, как то, что была ошибка, и которая отправила ошибку на. Если вам нужно войти в систему, добавьте строку сразу после того, как вы создадите переменную сервера, где вы выполняете следующее: Server.login (имя пользователя, пароль)
Отправить письмо с приложением
Теперь давайте посмотрим, как отправить электронное письмо с приложением. Для этого скрипта мы также будем использовать Email модуль. Вот простой пример, основанный на некоторых кодах, который я недавно написал:
import os import smtplib from email import Encoders from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.Utils import formatdate filePath = r'\\some\path\to\a\file' def sendEmail(TO = "mike@mydomain.com", FROM="support@mydomain.com"): HOST = "mail.mydomain.com" msg = MIMEMultipart() msg["From"] = FROM msg["To"] = TO msg["Subject"] = "You've got mail!" msg['Date'] = formatdate(localtime=True) # attach a file part = MIMEBase('application', "octet-stream") part.set_payload( open(filePath,"rb").read() ) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(filePath)) msg.attach(part) server = smtplib.SMTP(HOST) # server.login(username, password) # optional try: failed = server.sendmail(FROM, TO, msg.as_string()) server.close() except Exception, e: errorMsg = "Unable to send email. Error: %s" % str(e) if __name__ == "__main__": sendEmail()
Здесь происходит честный бит, поэтому давайте вышлем через новые вещи. Сначала мы импортируем все биты и куски, которые нам нужны от Email модуль. Затем мы создаем хорошую функцию для отправки электронной почты. Далее мы создаем Mimemultipart объект. Этот удобный объект проведет нашу электронную почту. Он использует аналогичный интерфейс для добавления таких полей, как, из, субъекта и т. Д. Вы заметите, что у нас также есть поле даты. Это просто захватывает текущую дату вашего компьютера и преобразует его в соответствующую почтовый формат MIME.
Часть, в котором мы больше всего интересуют, это как прикрепить файл. Здесь мы создаем MimeBase Объект и установите его полезную нагрузку в файл, который мы хотим прикрепить. Обратите внимание, что нам нужно сказать ему, чтобы прочитать файл в качестве двоичного файла, даже если файл находится в простом тексте. Далее мы кодируем поток в базе 64. Последние два шага – добавить заголовок, а затем прикрепить объект MIMEBASE к нашему объекту MimemUltiPart. Если у вас были несколько файлов, чтобы прикрепить, то, вероятно, вы, вероятно, захотите установить этот раздел в какой-то цикл и цикл по файлам. На самом деле, вот что я сделал в этом примере WXPymail, который я упоминал ранее.
Во всяком случае, как только вы получите все, что сделали, вы делаете в основном то же самое, что и в приведенном выше примере SMTPLIB. Единственное отличие состоит в том, что мы изменили следующую строку:
server.sendmail(FROM, TO, msg.as_string())
Обратите внимание на MSG.AS_STRING. Нам нужно было преобразовать объект в строку, чтобы сделать эту работу. Мы также помещаем функцию SendMail внутри попытки/кроме оператора в случае, если что-то плохое происходит, и наша электронная почта не отправляет. Если бы мы хотели, мы могли бы завернуть попытку/кроме в то время как Цикл, чтобы мы могли повторно отправлять по электронной почте x количество раз, если оно не удалось.
Обертывание
Мы охватываем, как отправить простую электронную почту и как отправить один с помощью вложения. Модуль электронной почты имеет большие функциональные возможности, встроенные в него, что здесь не покрывается, поэтому обязательно прочитайте документацию. Иметь веселье кодировать!