Надежно форсируйте Return-Path с Python - PullRequest
0 голосов
/ 28 ноября 2010

Я младший Питон, так что имейте это в виду.В скрипте Python мне нужно установить адрес Return-Path, который отличается от адреса отправителя.(Я использую Gmail в качестве SMTP-сервера.)

Я провел большой поиск по этому вопросу и нашел множество «ответов», но не нашел решений.Я попробовал эту ссылку Настройка Return-Path с 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()

Чего мне не хватает в этой функции, чтобы иметь возможность надежно указать другой ответ на Return-Path?

1 Ответ

5 голосов
/ 28 ноября 2010

Путь к ответу и возвращению - два разных зверя.См. RFC .

. Вы можете установить Reply-to с помощью:

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

MTA устанавливает обратный путь к адресу, который получает отказов.Он контролируется администратором сервера, поэтому, если вы не работаете в Google, я не думаю, что это под вашим контролем.

В большинстве случаев после «Ответить»;если вам действительно нужно изменить путь возврата, вы должны использовать SMTP-сервер под вашим контролем и google, чтобы узнать, как это сделать для конкретного используемого MTA - у многих будет белый список пользователей и / или хостов, которые могут переопределить возвратпуть.

...