in meiner Python-Anwendung, die automatisiert eine E-Mail mit Datei-Anhängen versenden soll,
werden ausgewählte Dateien die nicht innerhalb eines Ordner liegen,
welcher wiederum innerhalb des Hauptverzeichnis liegt, nicht als Anhang versendet.
zur App:
Die Anwendung lässt den User Dateien auswählen, die als Anhänge einer E-Mail gesendet werden sollen,
und zusätzlich wird eine PDF-Datei umbenannt, abhängig von der Eingabe vom Textfeld, landet dann im
Verzeichnis "folder_for_pdf_file" und soll ebenfalls als Anhang versendet werden.
Das Problem:
ist, dass beim Versenden der E-Mail nur die umbenannte PDF-Datei aus "folder_for_pdf_file" erfolgreich
versendet wird, während die Dateien aus "folder_for_attached_files" nicht versendet werden.
Interessanterweise werden aber die ausgewählten Dateien erfolgreich mitversendet, wenn diese in
einem Ordner liegen der innerhalb des Hauptverzeichnis ist.Wenn ich aber Dateien auswähle, die z.B. in
einem Ordner auf dem Desktop sind, funktioniert es nicht.
-An der Dateigröße kann es nicht liegen, da ich minimalste ".txt" Dateien nehme.
-Und um Pfadprobleme unter Windows auszuschließen, habe ich die App soweit geändert, dass ich
Dateipfade mit os.path.normpath() normalisiert habe und Backslashes durch Slashes ersetzt.
-Außerdem habe ich Debug-Ausgaben in meinem Code hinzugefügt, um zu bestätigen, dass die Dateien
tatsächlich zur Liste der Anhänge hinzugefügt werden.
-Um Zugriffsprobleme auszuschließen, werden die ausgewählten Dateien in ein Verzeichnis kopiert,
das sich im gleichen Verzeichnis wie das Programm befindet.
PS: Ursprünglich sah meine "def select_files(self):" Funktion so aus:
Code: Alles auswählen
def select_files(self):
selected_files = filedialog.askopenfilenames()
self.list_for_attached_files.extend(filenames)
#random_pdf_file.pdf kopieren und umbenennen
new_filename = self.input_textfield_to_rename_pdf_file.get() + ".pdf"
shutil.copy('random_pdf_file.pdf', f'folder_for_pdf_file/{new_filename}')
self.list_for_attached_files.append(f'folder_for_pdf_file/{new_filename}')
Was aber auch nichts gebracht hat.
Meine Frage:
Hat jemand eine Idee, warum die Dateien aus "folder_for_attached_files" nicht in der empfangenen E-Mail erscheinen, obwohl sie anscheinend korrekt zur Anhangsliste hinzugefügt werden? Gibt es spezielle Einschränkungen oder bekannte Probleme bei der Verwendung von smtplib oder der MIME-Behandlung, die dieses Verhalten erklären könnten?
Hier der Code:
Code: Alles auswählen
import os
import shutil
import tkinter as tk
from tkinter import filedialog
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import smtplib
class EmailApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("E-Mail Sender")
self.list_for_attached_files = [] # Liste für die Datei-Anhänge
self.button_to_attach_files = tk.Button(self, text="Dateien auswählen",
command=self.select_files)
self.button_to_attach_files.pack()
self.input_textfield_to_rename_pdf_file = tk.Entry(self)
self.input_textfield_to_rename_pdf_file.pack()
self.send_button = tk.Button(self, text="E-Mail senden",
command=self.send_email)
self.send_button.pack()
#die ausgewählten Dateien werden in ein Verzeichnis kopiert,
#das sich im gleichen Verzeichnis wie das Programm befindet,
#um Zugriffsprobleme auszuschließen.
def select_files(self):
selected_files = filedialog.askopenfilenames()
for filename in selected_files:
basename = os.path.basename(filename)
destination_folder = os.path.join('folder_for_attached_files', basename)
shutil.copy(filename, destination_folder)
#Die PDF-Datei im Hauptverzeichnis, die als Anhang versendet werden soll, wird umbenannt, abhängig von
#der Eingabe vom Textfeld, bekommt die Endung ".pdf" und landet im Verzeichnis folder_for_pdf_file.
#Der Pfad zur Datei wird normalisiert, indem Backslashes durch Schrägstriche ersetzt
#werden. Die Datei wird dann in das angegebene Verzeichnis kopiert und der Pfad zur
#Datei wird einer Anhangliste hinzugefügt, die alle Anhänge enthält.
#Anschließend werden alle Dateien im Verzeichnis folder_for_attached_files durchlaufen
#und deren Pfade werden ebenfalls normalisiert und der Anhangsliste hinzugefügt.
#Dann wird die Email mit dieser Anhangsliste versendet.
def send_email(self):
renamed_pdf_file = self.input_textfield_to_rename_pdf_file.get() + ".pdf"
if renamed_pdf_file != ".pdf":
pdf_file_destination = os.path.join('folder_for_pdf_file', renamed_pdf_file)
normalized_pdf_file_path = os.path.normpath(pdf_file_destination).replace('\\', '/')
shutil.copy('random_pdf_file.pdf', normalized_pdf_file_path)
self.list_for_attached_files.append(normalized_pdf_file_path)
print("Anhänge vor dem Hinzufügen aus folder_for_attached_files:",
self.list_for_attached_files)
for attached_filenames in os.listdir('folder_for_attached_files'):
file_path = os.path.join('folder_for_attached_files', attached_filenames)
normalized_path = os.path.normpath(file_path).replace('\\', '/')
self.list_for_attached_files.append(normalized_path)
print("Hinzugefügt:", normalized_path)
print("Endgültige Anhangsliste:", self.list_for_attached_files)
msg = MIMEMultipart()
msg['From'] = "sender_user@mail.de"
msg['To'] = "receiver_user@gmail.com"
msg['Subject'] = "Test Email"
body = "Hier ist Ihre E-Mail mit Anhängen."
msg.attach(MIMEText(body, 'plain'))
for filename in self.list_for_attached_files:
try:
with open(filename, "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
f"attachment; filename= {os.path.basename(filename)}")
msg.attach(part)
except Exception as e:
print(f"Fehler beim Hinzufügen der Datei {filename}: {e}")
server = smtplib.SMTP('smtp.mail.de', 587)
server.starttls()
server.login("sender_user@mail.de", "ExamplePassword")
text = msg.as_string()
server.sendmail("sender_user@mail.de", "receiver_user@gmail.com", text)
server.quit()
#Lösche alle Dateien aus beiden Verzeichnissen
#"folder_for_attached_files" und "folder_for_pdf_file"
for folder in ['folder_for_attached_files', 'folder_for_pdf_file']:
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
if os.path.exists(file_path):
os.remove(file_path)
app = EmailApp()
app.mainloop()
Vielen Dank im Voraus!
Marlon