MIMEMultipart, MIMEText, MIMEBase и полезные нагрузки для отправки электронной почты с вложенными файлами в Python

Без особых предварительных знаний о MIME я пытался научиться писать скрипт на Python для отправки электронного письма с вложенным файлом. После перекрестных ссылок на документацию по Python, вопросы о переполнении стека и общий поиск в Интернете я остановился на следующем коде[1] и проверил это, чтобы работать.

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders

fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND TO"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"

body = "TEXT YOU WANT TO SEND"

msg.attach(MIMEText(body, 'plain'))

filename = "NAME OF THE FILE WITH ITS EXTENSION"
attachment = open("PATH OF THE FILE", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

У меня есть приблизительное представление о том, как работает этот скрипт, и я разработал следующий рабочий процесс. Пожалуйста, дайте мне знать, насколько точна моя блок-схема (?).

 as.string()  
 |
 +------------MIMEMultipart  
              |                                                |---content-type  
              |                                   +---header---+---content disposition  
              +----.attach()-----+----MIMEBase----|  
                                 |                +---payload (to be encoded in Base64)
                                 +----MIMEText

Как узнать, когда использовать MIMEMultipart, MIMEText и MIMEBase? Это кажется сложным вопросом, так что, может быть, просто предложите мне некоторые общие правила?

Я читал, что MIME имеет древовидную структуру[2] Означает ли это, что MIMEMultipart всегда на вершине?В первом блоке кода MIMEMultipart кодирует ['From'], ['To'] и ['Subject'], но в документации Python MIMEText также может использоваться для кодирования ['From'], ['To' ] и ['Тема']. Как мне выбрать один для использования?Что такое «полезная нагрузка»? Это какой-то контент для транспортировки? Если да, то к какому контенту это относится (я заметил, что основной текст и вложения рассматриваются как полезные данные)? Я думал, что это будет простой вопрос, но я просто не мог найти удовлетворительный, надежный и простой ответ.Верно ли, что, хотя MIME может прикреплять форматы файлов гораздо проще, чем просто некоторые тексты, в конце концов все кодирование, информация заголовка и полезные данные превращаются в строки, чтобы их можно было передавать в .sendmail ()?

[1]http://naelshiab.com/tutorial-send-email-python/
[2]http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial

Ответы на вопрос(1)

Сообщения электронной почты

«От», «До», «Тема» и т. Д.) И основной части (см.RFC 822, раздел 3.1).

Тело сообщения по умолчанию обрабатывается как простой текст ASCII. MIME (RFC 2045, RFC 2046, RFC 2047, RFC 2048, RFC 2049) определяет расширения, которые позволяют указывать различные типы содержимого электронной почты.

Одна очень полезная вещь, которую вы можете использовать с MIME, - это указать тип контента (например,text/html или жеapplication/octet-stream).

Еще одна полезная вещь - это то, что вы можете создать сообщение из нескольких частей (например, если вы хотите, чтобы HTML и изображение были внутри HTML). Это делается путем указанияmultipart Тип содержимого (RFC 2046, раздел 5.1).

Составные сообщения

Если сообщение имеетmultipart Content-Type, это означает, что он состоит из нескольких сообщений, и каждое из них определяет свой собственный Content-Type (который снова может быть составным или что-то еще). Составные сообщения в Python представленыMIMEMultipart учебный класс.

Итак, чтобы ответитьвопрос 3: КогдаMIMEMultipart используется, то да, это древовидная структура, но если толькоMIMEText используется, то это не дерево.

Вопрос 4 спрашивает, в каком классе устанавливать заголовки («Кому», «От» и т. д.), что делаетсяMessage класс, но всеMIME классы наследуются отMessageТаким образом, это может быть сделано для любого из них, но эти заголовки имеют смысл только в корневой части составного сообщения.

Другими словами, если сообщение состоит только из одной части MIME, укажите заголовки для этой части. Если он состоит из нескольких частей, то кореньMIMEMultipart - укажите заголовки в этой части.

вопрос 2 спрашивает«когда использовать MIMEMultipart, MIMEText и MIMEBase», -MIMEBase это просто базовый класс. КакСпецификация говорит:«Обычно вы не будете создавать экземпляры конкретноMIMEBase" - MIMEText для текста (например,text/plain или жеtext/html), если все сообщение в текстовом формате, или если его часть. -MIMEMultipart для того, чтобы сказать«У меня есть более чем одна часть», а затем перечисление частей - вы делаете это, если у вас есть вложения, вы также делаете это, чтобы предоставить альтернативные версии того же контента (например, текстовая версия плюс версия HTML)

Вопрос 5 "Что такое" полезная нагрузка "?" - это просто модное слово для содержания сообщения (или части сообщения)

Вопрос 6 Существует ограничение на использование только 7 бит в SMTP. Увидетьэтот ответ Больше подробностей.

Я не совсем понялаВопрос 1, но кажется, что график более или менее правильный. Кстати, я бы не использовалMIMEBase здесь, потому что естьMIMEApplication который кажется более подходящим для намеченной цели.

Ваш ответ на вопрос