Не могу отправить вложение на мою электронную почту с помощью smtplib - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь отправить файл csv на мой адрес электронной почты, используя библиотеку smtplib. Когда я запускаю скрипт ниже, он отправляет письмо без проблем. Однако, когда я открываю это электронное письмо, я вижу, что там нет вложений.

Я пробовал:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

attachment = "outputfile.csv"

msg = MIMEMultipart()
msg['Subject'] = "Email a csv file"
msg['Body'] = "find the attachment"
msg['From'] = "someemail@gmail.com"
msg['To'] = "anotheremail@gmail.com"

part = MIMEBase('application', "octet-stream")
part.set_payload(open(attachment, "rb").read())
encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment', filename=attachment)

msg.attach(part)
msg = f"Subject: {msg['Subject']}\n\n{msg['Body']}"

with smtplib.SMTP('smtp.gmail.com',587) as server:
    server.ehlo()
    server.starttls()
    server.ehlo()

    server.login('someemail@gmail.com','ivfpklyudzdlefhr')
    server.sendmail(
        'someemail@gmail.com',
        'anotheremail@gmail.com',
        msg
    )

Какие возможные изменения я должен привести к отправить файл csv на мою электронную почту?

1 Ответ

2 голосов
/ 02 мая 2020

Код нуждается в двух изменениях

  1. msg = f"Subject: {msg['Subject']}\n\n{msg['Body']}" перезаписывает объект сообщения msg строкой. Это не обязательно и может быть удалено.

  2. Чтобы отправить объект сообщения (в отличие от строки), используйте SMTP.send_message.

Этот код должен работать:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

attachment = "outputfile.csv"

msg = MIMEMultipart()
msg['Subject'] = "Email a csv file"
msg['Body'] = "find the attachment"
msg['From'] = "someemail@gmail.com"
msg['To'] = "anotheremail@gmail.com"

part = MIMEBase('application', "octet-stream")
part.set_payload(open(attachment, "rb").read())
encoders.encode_base64(part)

part.add_header('Content-Disposition', 'attachment', filename=attachment)

msg.attach(part)

with smtplib.SMTP('smtp.gmail.com',587) as server:
    server.ehlo()
    server.starttls()
    server.ehlo()

    server.login('someemail@gmail.com','ivfpklyudzdlefhr')
    server.send_message(msg)
...