在Python的电子邮件/smtplib中设置不同的回复消息

49

我正在使用Python的email和smtplib库发送电子邮件。我通过Gmail SMTP服务器并使用我的Gmail凭据来完成这项工作。这一切都很好,但我希望指定一个与“发件人”地址不同的回复地址,以便回复会发送到另一个地址(非Gmail)。

我尝试创建一个如下的回复地址参数:

   msg = MIMEMultipart()

   msg['From'] = "email@gmail.com"
   msg['To'] = to
   msg['Subject'] = subject
   msg['Reply-to'] = "email2@example.com"

但这并不起作用。在Python文档中找不到任何关于这个的信息。


“From”地址也不是Gmail(与“回复至”匹配)。这是问题吗?当你说“这不起作用”时会发生什么? - MattH
嗨,我把发件人改回了 Gmail 地址,但仍然无法工作。所以不认为这是问题的根源,但还是谢谢。 - eli
8
msg['Reply-To'] 对我很有效。 - Jonathon Reinhart
5个回答

56

以下是我的见解。我认为应该明确设置"回复至(Reply-To)"头部。可能的原因是它比其他头部如"主题(Subject)"、"收件人(To)"和"发件人(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 = 'you@gmail.com'
>>> FROM_ADDRESS = 'email@domain.example'
>>> REPLY_TO_ADDRESS = 'email2@domain2.example'
>>> 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())
{}

1
看起来add_header的行为与__setitem__()非常相似,因此原始方法(拼写/大小写正确)也应该有效,请参阅文档:https://docs.python.org/release/2.6.6/library/email.message.html#email.message.Message.add_header - Nico Albers

24

我也有同样的问题,解决方法就是将header设置为小写:

msg['reply-to'] = "email2@example.com"

它在Python 3.6.5中对我有效。值得注意的是,您可以在其中放置多个电子邮件地址,当人们回复时,他们将回复所有这些地址。 - Brōtsyorfuzthrāx
转念一想,Python 3.6.5中被接受的答案适用于更多情况。 - Brōtsyorfuzthrāx
它实际上在Python 3.6.9上运行,谢谢伙计。 - Franco Gil

3

针对2021年的Python 3,我建议使用以下方法构建消息:

from email.message import EmailMessage
from email.utils import formataddr

msg = EmailMessage()
msg['Subject'] = "Message Subject"
msg['From'] = formataddr(("Sender's Name", "email@gmail.com"))
msg['Reply-To'] = formataddr(("Name of Reply2", "email2@domain2.example"))
msg['To'] = formataddr(("John Smith", "john.smith@gmail.com"))
msg.set_content("""\
<html>
  <head></head>
  <body>
    <p>A simple test email</p>
  </body>
</html>
""", subtype='html')

那么,为了发送信息,我使用以下代码连接我的邮件服务器(该服务器在587端口上使用StartTLS):

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@domain.example', password)
    server.send_message(msg)

2
正如Jonathon Reinhart所指出的,"To"需要大写:
msg['Reply-To'] = "email2@example.com"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接