Рубрики
Без рубрики

Как отправить электронное письмо с Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: 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 количество раз, если оно не удалось.

Обертывание

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

Дополнительное чтение