python smtplib отправляет почту без получателя

Я использую python smtplib для отправки электронных писем. Они прибывают в пункт назначения, но поле «Кому» отсутствует. В Gmail поле «Кому» пустое, но в Thunderbird написано «нераскрытые получатели». Я сделал поиск в Google, но ничего не нашел.

Я не вижу никакой ошибки в коде, который объясняет это, но я следил за некоторыми фрагментами кода из другого вопроса о переполнении стека, поэтому, возможно, я что-то упустил.

Это код отправителя почты:

def connect_and_send(send_from, send_to, carbon_copy, msg):
    confp = ConfigParser()
    confp.read("config/mail.ini")
    server  = str(confp.get('mail', 'host'))
    port    = str(confp.get('mail', 'port'))
    user    = str(confp.get('mail', 'username'))
    password= str(confp.get('mail', 'password'))
    smtp = smtplib.SMTP_SSL()
    smtp.connect(server, port)
    smtp.login(
        user,
        password
    )
    send_to.append(carbon_copy)
    smtp.sendmail(send_from, send_to, msg.as_string())


def send_mail(send_from, send_to, carbon_copy, subject, text, signature, files=None):
    assert isinstance(send_to, list)
    if ARGS.debug:
        print "MAIL to:", send_to
        print "MAIL from:", send_from
        print "MAIL subject", subject
        print "with {0} files attached".format(len(files))
    msg = MIMEMultipart('alternative')
    msg["Subject"] = subject
    msg["From"] = send_from
    msg["Date"] = formatdate(localtime=True)
    msg["To"] = COMMASPACE.join(send_to)

    msg.attach(MIMEText(text+"\n"+signature))
    for f in files or []:
        part = MIMEBase('image', "png")
        part.set_payload(f[1].read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="{0}.png"'.format(f[0]))
        msg.attach(part)

    if ARGS.debug and not ARGS.force_send:
        print msg.as_string()
    else:
        connect_and_send(send_from, send_to, carbon_copy, msg.as_string())

person Borja Arias    schedule 23.07.2015    source источник


Ответы (1)


Вы можете попробовать yagmail (полное раскрытие: я разработчик).

Полный код будет таким:

import yagmail
yag = yagmail.SMTP(send_from, host = host, port = port)
if files is None:
    files = []
yag.send(send_to, subject, contents =  [text, signature] + files, bcc = carbon_copy)

Обратите внимание, что файлы уже будут аккуратно прикреплены! (учитывая, что это локальный путь к именам файлов)

Я бы также предложил использовать связку ключей yagmail, чтобы не хранить пароль локально.

Вы можете получить yagmail из pip:

pip install yagmail   # python 2
pip3 install yagmail  # python 3

Кроме того, поскольку похоже, что вы используете некоторые довольно специфические почтовые потребности, я уверен, что вы можете извлечь выгоду из yagmail, и это должно окупиться, чтобы прочитать документация GitHub. Не стесняйтесь поднимать вопросы / запросы.

person PascalVKooten    schedule 23.07.2015
comment
спасибо, однако это не решает мою проблему. Похоже, что-то с моим приложением, потому что, если я использую функцию из интерпретатора командной строки, она работает. - person Borja Arias; 06.08.2015