MIMEMultipart, MIMEText, MIMEBase e cargas úteis para enviar email com anexo de arquivo em Python

Sem muito conhecimento prévio do MIME, tentei aprender a escrever um script Python para enviar um email com um anexo de arquivo. Após fazer a referência cruzada da documentação do Python, das perguntas do Stack Overflow e da pesquisa geral na web, resolvi o seguinte código[1] e testado para estar funcionando.

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()

Tenho uma ideia aproximada de como esse script funciona agora e trabalhei no seguinte fluxo de trabalho. Informe-me como o meu fluxograma (?) É preciso.

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

Como sei quando usar MIMEMultipart, MIMEText e MIMEBase? Esta parece ser uma pergunta complicada, então talvez apenas ofereça algumas regras gerais para mim?

Eu li que o MIME tem uma estrutura de árvore[2] , isso significa que MIMEMultipart está sempre no topo?No primeiro bloco de código, o MIMEMultipart codifica ['From'], ['To'] e ['Subject'], mas na documentação do Python, o MIMEText também pode ser usado para codificar ['From'], ['To' ] e ['Assunto']. Como eu decido usar?O que exatamente é uma "carga útil"? Algum conteúdo deve ser transportado? Em caso afirmativo, que tipo de conteúdo isso inclui (notei que o texto do corpo e o anexo são tratados como cargas úteis)? Achei que seria uma pergunta fácil, mas simplesmente não consegui encontrar uma resposta satisfatória, confiável e simples.É verdade que, embora o MIME possa anexar formatos de arquivo muito mais simples do que apenas alguns textos, no final, todas as codificações, informações de cabeçalho e cargas úteis são transformadas em strings para que possam ser passadas para .sendmail ()?

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

questionAnswers(1)

yourAnswerToTheQuestion