Отправка электронной почты через электронную библиотеку Python вызывает ошибку "ожидаемая строка или байтовый объект",

Я пытаюсь отправить файл csv в виде вложения с помощью простой функции в python 3.6.

from email.message import Message
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def email():


    msg = MIMEMultipart()
    msg['Subject'] = 'test'
    msg['From'] = '[email protected]'
    msg['To'] = '[email protected]'
    msg.preamble = 'preamble'

    with open("test.csv") as fp:
        record = MIMEText(fp.read())
        msg.attach(record)

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.login("[email protected]", "password")
    server.sendmail("[email protected]", "[email protected]", msg)
    server.quit()

Вызов email() вызывает ошибку expected string or bytes-like object. Переопределение server.sendmail("[email protected]", "[email protected]", msg) как server.sendmail("[email protected]", "[email protected]", msg.as_string()) вызывает отправку электронного письма, но отправляет файл csv в тело письма, а не как вложение. может ли кто-нибудь дать мне несколько указателей на то, как отправить файл csv в виде вложения?

Ответ 1

1) Вы должны использовать msg.as_string(), если вы вызываете smtplib.SMTP.sendmail(). Альтернативно, если у вас есть Python 3.2 или новее, вы можете использовать server.send_message(msg).

2) Вы должны добавить тело к своему сообщению. По дизайну никто никогда не видит преамбулу.

3) Вы должны использовать content-disposition: attachment, чтобы указать, какие части являются вложениями и которые являются встроенными.

Попробуйте следующее:

def email():


    msg = MIMEMultipart()
    msg['Subject'] = 'test'
    msg['From'] = 'XXX'
    msg['To'] = 'XXX'
    msg.preamble = 'preamble'

    body = MIMEText("This is the body of the message")
    msg.attach(body)

    with open("test.csv") as fp:
        record = MIMEText(fp.read())
        record['Content-Disposition'] = 'attachment; filename="test.csv"'
        msg.attach(record)

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.login("XXX", "XXX")
    server.sendmail("XXX", "XXX", msg.as_string())
    server.quit()