可靠地使用Python强制返回路径

0 投票
1 回答
1983 浏览
提问于 2025-04-16 07:42

我还是个Python初学者,所以请多包涵。在我的Python脚本中,我需要设置一个与发件人地址不同的回信地址。(我使用Gmail作为SMTP服务器。)

我搜索了很多关于这个问题的资料,找到了不少“答案”,但没有一个能解决我的问题。我试过这个链接 使用Python的sendmail设置MIME消息的Return-Path,但对我来说完全没用。我可以更改收件人看到的“收件人”地址,但当他们点击“回复”时,回复的地址又变回发件人的邮箱了。

这是我正在尝试编写的函数。它的功能还不错,只是我需要强制设置一个不同的回信地址。

#!/usr/bin/python
import smtplib
import os

from email.MIMEMultipart import MIMEMultipart  
from email.MIMEBase import MIMEBase  
from email.MIMEText import MIMEText  
from email.Utils import COMMASPACE, formatdate  
from email import Encoders  
import sap_mailserverdata as sf 

def send_mail(sent_to, subject, body_text, sent_from_addr='', sent_from_name='', files=[], cc=[], bcc=[]):  
    """Send emails with or without attachments."""  
    assert type(sent_to)==list    
    assert type(files)==list  
    assert type(cc)==list  
    assert type(bcc)==list  

    message = MIMEMultipart()
    message['From'] = sent_from_addr
    message['To'] = COMMASPACE.join(sent_to)
    message['Date'] = formatdate(localtime=True)
    message['Subject'] = subject
    message['Cc'] = COMMASPACE.join(cc)
    message.preamble = 'You need a MIME enabled mail reader to see this message.\n'

    message.attach(MIMEText(body_text, 'html'))

    for f in files:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(open(f, 'rb').read())
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
        message.attach(part)

    addresses = []
    for x in sent_to:
        addresses.append(x)
    for x in cc:
        addresses.append(x)
    for x in bcc:
        addresses.append(x)

    mail_server = smtplib.SMTP(sf.server, sf.server_port)
    mail_server.ehlo()
    mail_server.set_debuglevel(1)
    mail_server.starttls()
    mail_server.login(sf.username, sf.password)
    mail_server.sendmail(sent_from_addr, addresses, message.as_string())
    mail_server.quit()

我在这个函数中缺少什么,才能可靠地指定一个不同的回复地址呢?

1 个回答

6

回复地址和返回路径是两个不同的概念。可以参考一下这个RFC文档。

你可以通过以下方式设置回复地址:

msg['reply-to'] = 'smith@acme.com'

返回路径是由邮件传输代理(MTA)设置的,指的是接收退信的地址。这个设置是由服务器管理员控制的,所以除非你在谷歌工作,否则你可能无法控制这个。

大多数情况下,我们关注的是“回复地址”;如果你真的需要更改返回路径,你必须使用一个你自己控制的SMTP服务器,并且需要查找如何在你使用的特定MTA上做到这一点——很多MTA会有一个白名单,列出可以覆盖返回路径的用户和/或主机。

撰写回答