Specify a sender when sending mail with Python (smtplib)

Posted on

Question :

Specify a sender when sending mail with Python (smtplib)

I have a very simple piece of code (just for testing):

import smtplib
import time

server = 'smtp.myprovider.com'
recipients = ['johndoe@somedomain.com']
sender = 'me@mydomain.com'
message = 'Subject: [PGS]: ResultsnnBlaBlaBla'

session = smtplib.SMTP(server)


This works but the problem is that e-mail clients don’t display a sender.
I want to be able to add a sender name to the e-mail. Suggestions?

Asked By: TimothyP


Answer #1:

smtplib doesn’t automatically include a From: header, so you have to put one in yourself:

message = 'From: me@example.comnSubject: [PGS]: ResultsnnBlaBlaBla'

(In fact, smtplib doesn’t include any headers automatically, but just sends the text that you give it as a raw message)

Answered By: dF.

Answer #2:

You can utilize the email.message.Message class, and use it to generate mime headers, including from:, to: and subject. Send the as_string() result via 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('testn')
>>> m1.as_string()
'from: me@no.wherento: myself@some.wherensubject: testnntestn'
Answered By: gimel

Answer #3:

See this answer, it’s working for me.

example code:

#send html email
import smtplib
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())
Answered By: Wei Lu

Answer #4:

The “sender” you’re specifying in this case is the envelope sender that is passed onto the SMTP server.

What your MUA (Mail User Agent – i.e. outlook/Thunderbird etc.) shows you is the “From:” header.

Normally, if I’m using smtplib, I’d compile the headers separately:

headers = "From: %snTo: %snn" % (email_from, email_to)

The format of the From header is by convention normally "Name" <user@domain>

You should be including a “Message-Id” header and a “Reply-To” header as well in all communications. Especially since spam filters may pick up on the lack of these as a great probability that the mail is spam.

If you’ve got your mail body in the variable body, just compile the overall message with:

message = headers + body

Note the double newline at the end of the headers. It’s also worth noting that SMTP servers should separate headers with newlines only (i.e. LF – linfeed). However, I have seen a Windows SMTP server or two that uses rn (i.e. CRLF). If you’re on Windows, YMMV.

Answered By: Philip Reynolds

Answer #5:

I think you are trying to show some specific name instead of your emailID. You need to change only msg[‘From’] part in this code

fromName = "Name Which you want to show in reciever Inbox"
fromEmail = "abc@xyz.com"  # Sender's email Id
message['From'] = "{} <{}>".format(fromName,fromEmail)

After this usual in above described link.

Answered By: Atul6.Singh

Answer #6:

When just using smtplib to add a from name instaead of displaying your email address just use:

message = """From: whatever-namenSubject: subjectnn
body of the message!

Passing this message through .sendmail(TO, FROM, message) will work.

Answered By: 0_o

Leave a Reply

Your email address will not be published. Required fields are marked *