Python error: /email/_policybase.py line 369 in _fold list object has no attribute encode

Error al enviar un email

Antes de explicar la solución debo situar el contexto.
Trabajando sobre este post Enviar emails con python
Se presentó el siguiente error en este trozo de código:

Código con error:

def get_cc_recipients() -> List[str]: return [ "to-email-1@gmail.com", "to-email-2@yahoo.es", ] ... def send_email() -> None: ... mime_obj = MIMEMultipart("mixed") subject = "This is an email subject from Python (example 1)" mime_obj["Subject"] = subject mime_obj["To"] = get_cc_recipients() plain_text = "This is a plain text example" mime_plain = MIMEText(plain_text, "plain") html = get_html_template() mime_html = MIMEText(html, "html") ... smtp_obj.sendmail( #si esto se deja en blanco también se envía. No da error pero llega a SPAM. #No es necesario que coincida con el email de la cuenta de gmail "anyaccount@somedomain.local", get_cc_recipients()+get_bcc_recipients(), mime_obj.as_string() ) smtp_obj.close() ...

Si nos fijamos con detenimiento, la función get_cc_recipients devuelve una lista de cadenas y eso está bien.
El problema es que el objeto mime MIMEMultipart tiene una clave To que es donde se configura las cuentas de email de destino.
Esta clave no admite una lista de ningún tipo. Por lo tanto, cuando lo intenta codificar usando el método encode (que si lo tiene un str) lanza la excepción.

La excepción:

Traceback (most recent call last): File "some/path-to/email/main.py" ... /email/_policybase.py", line 369, in _fold parts.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen)) AttributeError: 'list' object has no attribute 'encode'

La solución

# hay que cambiar la línea 12 a: mime_obj["To"] = ", ".join(get_cc_recipients())

Autor: Eduardo A. F.
Publicado: 10-04-2021 20:32