Как прикрепить несколько файлов к письму?

Я использую следующие модули для отправки электронных писем с помощью python:

import tkinter as tk
from tkinter import filedialog
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import email, smtplib, ssl

Я хочу отправить несколько вложений, но они по какой-то причине не прикрепляются? Программа не выдает ошибок.

Это часть программы, которая принимает кортеж путей к файлам для прикрепления к электронному письму. Почему это не работает и как я могу заставить это работать?

for file in filelist:
    with open(file, "rb") as attachment:
        attachment_part = MIMEBase("application", "octet-stream")
        attachment_part.set_payload(attachment.read())
        encoders.encode_base64(attachment_part)
        attachment_part.add_header(
            "Content-Disposition",
            f"attachment; filename = {filename}",
        )
        message.attach(attachment_part)

    # Create Server Connection
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
        server.login(config.email_sender, config.email_password)
        server.sendmail(
            sender_email, reciever_email, message.as_string()
        )

Рад сообщить подробности...

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ 2:

for file in filelist:
            attachment_part = MIMEBase("application", "octet-stream")
            attachment_part.set_payload(open(file, "rb").read())
            encoders.encode_base64(attachment_part)
            attachment_part.add_header("Content-Disposition", "attachment; filename='%s'" % os.path.basename(file))
            message.attach(attachment_part)

# Create Server Connection
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
            server.login(config.email_sender, config.email_password)
            server.sendmail(
                sender_email, reciever_email, message.as_string()
            )

person Kevin Apetrei    schedule 21.08.2020    source источник
comment
Отвечает ли это на ваш вопрос? Несколько вложений Gmail Python   -  person Seyi Daniel    schedule 21.08.2020
comment
Нет. Файлы не прикрепляет, ошибок тоже не выдает.   -  person Kevin Apetrei    schedule 22.08.2020


Ответы (2)


Моя функция в моей основной функции, которая выбирала файлы и помещала пути в список, не была глобализирована.

Однако по какой-то причине он не выдавал мне никаких ошибок.

person Kevin Apetrei    schedule 21.08.2020

РЕДАКТИРОВАТЬ: проблема в конечном итоге была вызвана кодом, не показанным в вопросе, из-за которого filelist был пустым. Но код, изначально показанный в вопросе, тоже был неправильным. Оригинальный ответ сохранен по этой причине.


В вашем коде у вас есть это:

for file in filelist:
    with open(file, "rb") as attachment:
        ...
        message.attach(attachment_part)

    # Create Server Connection
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
        ...

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

Вместо этого вам нужно вывести отправку почты из цикла по списку файлов:

for file in filelist:
    with open(file, "rb") as attachment:
        ...
        message.attach(attachment_part)

# Create Server Connection
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
   ...
person Steffen Ullrich    schedule 21.08.2020
comment
Я не понимаю, что вы предлагаете. Вы представляете почти тот же код? - person Kevin Apetrei; 21.08.2020
comment
@KevinApetrei: извините, я думал, что было очевидно, что вам нужно исправить, основываясь на объяснении. Но я добавил это явно к ответу сейчас. - person Steffen Ullrich; 22.08.2020
comment
Я изменил код на этот: for file in filelist: attachment_part = MIMEBase("application", "octet-stream") attachment_part.set_payload(open(file, "rb").read()) encoders.encode_base64(attachment_part) attachment_part.add_header("Content-Disposition", "attachment; filename='%s'" % os.path.basename(file)) message.attach(attachment_part) Но он по-прежнему ничего не делает. Без ошибок и без вложений... - person Kevin Apetrei; 22.08.2020
comment
@KevinApetrei: на основании вашего комментария невозможно сказать, как выглядит ваш код в настоящее время, потому что конец строки и отступ актуальны для Python, но не сохраняются в вашем комментарии. Но поскольку вы, похоже, не изменили отступ для части отправки почты и, таким образом, похоже, не решили проблему, на которую я указал. - person Steffen Ullrich; 22.08.2020
comment
@KevinApetrei: повторюсь: Но поскольку вы, похоже, не изменили отступ для части отправки почты и, таким образом, похоже, не решили проблему, на которую я указал. . Кроме того, форматирование в вопросе теперь кажется полностью испорченным. - person Steffen Ullrich; 22.08.2020
comment
Форматирование перепуталось в моей программе, выглядит нормально. for и with находятся на одном уровне отступа. - person Kevin Apetrei; 22.08.2020
comment
Давайте продолжим обсуждение в чате. - person Steffen Ullrich; 22.08.2020
comment
если у кого-то такая же проблема: stackoverflow.com/a/64947133/6007952 - person tnusraddinov; 21.11.2020