Setting different reply-to message in Python email/smtplib
Solution 1
Here's my take on it. I believe that the "Reply-To" header should be set explicitly. The likely reason is that it's less commonly used than headers such as "Subject", "To", and "From".
python
Python 2.6.6 (r266:84292, May 10 2011, 11:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> MAIL_SERVER = 'smtp.domain.example'
>>> TO_ADDRESS = '[email protected]'
>>> FROM_ADDRESS = '[email protected]'
>>> REPLY_TO_ADDRESS = '[email protected]'
>>> import smtplib
>>> import email.mime.multipart
>>> msg = email.mime.multipart.MIMEMultipart()
>>> msg['to'] = TO_ADDRESS
>>> msg['from'] = FROM_ADDRESS
>>> msg['subject'] = 'testing reply-to header'
>>> msg.add_header('reply-to', REPLY_TO_ADDRESS)
>>> server = smtplib.SMTP(MAIL_SERVER)
>>> server.sendmail(msg['from'], [msg['to']], msg.as_string())
{}
Solution 2
I had the same question and all I had to do to make it work was to set the header in lowercase like so:
msg['reply-to'] = "[email protected]"
Solution 3
For Python3 in 2021 I would recommend the following to construct the message:
from email.message import EmailMessage
from email.utils import formataddr
msg = EmailMessage()
msg['Subject'] = "Message Subject"
msg['From'] = formataddr(("Sender's Name", "[email protected]"))
msg['Reply-To'] = formataddr(("Name of Reply2", "[email protected]"))
msg['To'] = formataddr(("John Smith", "[email protected]"))
msg.set_content("""\
<html>
<head></head>
<body>
<p>A simple test email</p>
</body>
</html>
""", subtype='html')
Then to send the message I use the following for my mail server which uses StartTLS on port 587:
from smtplib import SMTP
from ssl import create_default_context as context
with SMTP('smtp.domain.example', 587) as server:
server.starttls(context=context())
server.login('[email protected]', password)
server.send_message(msg)
Solution 4
As Jonathon Reinhart pointed out, the "To" needs to be upper case:
msg['Reply-To'] = "[email protected]"

eli
Updated on May 05, 2021Comments
-
eli about 2 years
I am using Python email and smtplib to send an email from Python. I am doing this via the Gmail SMTP server using my Gmail credentials. This works fine, however I would like to specify a
Reply-to
email address different from thefrom
address, so that replies go to a separate address (non-Gmail.)I have tried creating a
reply to
parameter like this:msg = MIMEMultipart() msg['From'] = "[email protected]" msg['To'] = to msg['Subject'] = subject msg['Reply-to'] = "[email protected]"
But this doesn't work. Can't find any info on this in the Python docs.
Thanks.
-
Nico Albers almost 5 yearsit seems that add_header behaves pretty the same like __setitem__(), therefore the original approach (with proper spelling/upper/lowercase) should also work, compare the docs: docs.python.org/release/2.6.6/library/…
-
Brōtsyorfuzthrāx almost 5 yearsIt worked for me in Python 3.6.5. It's worth noting that you can put multiple emails in this, and when people reply they'll reply to all of them.
-
Brōtsyorfuzthrāx almost 5 yearsOn second thought, the accepted answer works in more situations than this does in Python 3.6.5.
-
Franco Gil over 3 yearsIt is actually working on python 3.6.9, thanks mate.