Отправка письма с приложением - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь написать функцию, которая отправляет письмо с вложенным файлом. На данный момент он отправляет письмо, но без вложений. Кто-нибудь может прокомментировать?

    msg = MIMEMultipart()

    msg['From'] = my email

    msg['To'] = client email address

    msg['Subject'] = subject

    body = content

    msg.attach(MIMEText(body, 'plain'))
    ##### Load the address of the file which should be attached*********************************     
    filename = filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("Text 
    files","*.txt"),("all files","*.*")))     

    Myfile = open(filename)

    attachment = MIMEText(Myfile.read())
    attachment.add_header('Content-Disposition', 'attachment', filename=filename)           


    msg.attach(attachment)
    mail = smtplib.SMTP('smtp.gmail.com', 587)
    msg = f'Subject: {subject}\n\n{content}'
    mail.ehlo()
    mail.starttls()
    mail.login('My email address', 'password')
    mail.sendmail('client email', My email address, msg)
    mail.close()

Спасибо всем заранее

1 Ответ

0 голосов
/ 03 февраля 2020

Во-первых, как уже упоминалось в моем комментарии, вы перезаписываете msg здесь:

msg = f'Subject: {subject}\n\n{content}'

На этом этапе MIMEMultipart объект msg, используемый для указания, уничтожается, и вы вышлю только эту новую строку. Не удивительно, почему нет вложения: эта строка явно не имеет вложения.

Теперь вам действительно следует использовать новый API модуля email, как показано в документации . Но поскольку вы уже используете устаревший API (например, класс MIMEMultipart), вам необходимо преобразовать msg в строку, как показано здесь :

# This is copied straight from the last link

msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = me
msg['To'] = you

...

part1 = MIMEText(text, 'plain')  # example attachment

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)

mail.sendmail(
    me, you,
    msg.as_string()  # CONVERT TO STRING
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...