Especifique un remitente al enviar correo con Python (smtplib)

Tengo un código muy simple (solo para pruebas):

import smtplib import time server = 'smtp.myprovider.com' recipients = ['johndoe@somedomain.com'] sender = 'me@mydomain.com' message = 'Subject: [PGS]: Results\n\nBlaBlaBla' session = smtplib.SMTP(server) session.sendmail(sender,recipients,message); 

Esto funciona, pero el problema es que los clientes de correo electrónico no muestran un remitente. Quiero poder agregar un nombre de remitente al correo electrónico. Sugerencias?

smtplib no incluye automáticamente un encabezado From: por lo que debe colocar uno en sí mismo:

 message = 'From: me@example.com\nSubject: [PGS]: Results\n\nBlaBlaBla' 

(De hecho, smtplib no incluye ningún encabezado automáticamente, sino que simplemente envía el texto que le smtplib como un mensaje sin procesar)

Ver esta respuesta, está funcionando para mí.

código de ejemplo:

 #send html email from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr msg = MIMEMultipart('alternative') msg['From'] = formataddr((str(Header('MyWebsite', 'utf-8')), 'from@mywebsite.com')) msg['To'] = 'to@email.com' html = "email contents" # Record the MIME types of text/html. msg.attach(MIMEText(html, 'html')) # Send the message via local SMTP server. s = smtplib.SMTP('localhost') # sendmail function takes 3 arguments: sender's address, recipient's address # and message to send - here it is sent as one string. s.sendmail('from@mywebsite.com', 'to@email.com', msg.as_string()) s.quit() 

Puede utilizar la clase email.message.Message y usarla para generar encabezados mime, que incluyen from: to: y subject . Enviar el resultado as_string() través de SMTP.

 >>> from email import message >>> m1=message.Message() >>> m1.add_header('from','me@no.where') >>> m1.add_header('to','myself@some.where') >>> m1.add_header('subject','test') >>> m1.set_payload('test\n') >>> m1.as_string() 'from: me@no.where\nto: myself@some.where\nsubject: test\n\ntest\n' >>> 

El “remitente” que está especificando en este caso es el remitente del sobre que se pasa al servidor SMTP.

Lo que su MUA (agente de usuario de correo, es decir, Outlook / Thunderbird, etc.) le muestra es el encabezado “De:”.

Normalmente, si estoy usando smtplib, comstackría los encabezados por separado:

 headers = "From: %s\nTo: %s\n\n" % (email_from, email_to) 

El formato del encabezado Desde es, por convención, normalmente "Name"

Debe incluir un encabezado “Id. Del mensaje” y un encabezado “Responder a” también en todas las comunicaciones. Especialmente porque los filtros de spam pueden detectar la falta de estos como una gran probabilidad de que el correo sea spam.

Si tiene su cuerpo de correo en el cuerpo de la variable, simplemente compile el mensaje general con:

 message = headers + body 

Tenga en cuenta la nueva línea doble al final de los encabezados. También vale la pena señalar que los servidores SMTP deben separar los encabezados solo con nuevas líneas (es decir, LF – linfeed). Sin embargo, he visto un servidor SMTP de Windows o dos que usa \ r \ n (es decir, CRLF). Si estás en Windows, YMMV.

Cuando solo use smtplib para agregar un nombre, en lugar de mostrar su dirección de correo electrónico, use:

 message = """From: whatever-name\nSubject: subject\n\n body of the message! """.encode() 

Pasar este mensaje a través de .sendmail (TO, FROM, message) funcionará.