MIMEMultipart, MIMEText, MIMEBase y cargas útiles para enviar correos electrónicos con archivos adjuntos en Python

Sin mucho conocimiento previo de MIME, intenté aprender a escribir un script de Python para enviar un correo electrónico con un archivo adjunto. Después de hacer referencia cruzada a la documentación de Python, las preguntas de desbordamiento de pila y la búsqueda general en la web, me decidí por el siguiente código[1] y lo probé para que funcione.

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

Tengo una idea aproximada de cómo funciona este script ahora, y resolví el siguiente flujo de trabajo. Avíseme qué tan preciso es mi diagrama de flujo (?).

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

¿Cómo sé cuándo usar MIMEMultipart, MIMEText y MIMEBase? Esto parece una pregunta complicada, así que ¿tal vez solo me ofrezcas algunas reglas generales?

Leí que MIME tiene una estructura de árbol[2] , ¿eso significa que MIMEMultipart siempre está en la parte superior?En el primer bloque de código, MIMEMultipart codifica ['From'], ['To'] y ['Subject'], pero en la documentación de Python, MIMEText también se puede utilizar para codificar ['From'], ['To' ] y ['Asunto']. ¿Cómo decido cuál usar?¿Qué es exactamente una "carga útil"? ¿Es algún contenido para ser transportado? Si es así, ¿qué tipo de contenido incluye esto (noté que el texto del cuerpo y los archivos adjuntos se tratan como cargas útiles)? Pensé que esta sería una pregunta fácil, pero no pude encontrar una respuesta satisfactoria, confiable y simple.Es cierto que aunque MIME puede adjuntar formatos de archivo mucho más simples que solo algunos textos, al final, toda la codificación, la información del encabezado y las cargas útiles se convierten en cadenas para que puedan pasarse a .sendmail ()?

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta