Python E-Mail Skript: Anhänge von Ordnern außerhalb, werden nicht versendet?

Fragen zu Tkinter.
Antworten
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Hallo zusammen,

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
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marlon_germany: Als erstes würde ich da die GUI vom E-Mail versenden trennen. Die Methode sollte nichts von der GUI wissen müssen und könnte dann auch in einer Funktion stehen.

`list_for_attached_files` sollte kein Attribut sein, das wird ja nur lokal in einer Methode verwendet. Der Kommentar ``# Liste für die Datei-Anhänge`` ist auch ziemlich überflüssig. Grunddatentypen sollten auch nicht in Namen vorkommen. Ausserdem sollte man mit `file` in Namen vorsichtig sein: da erwartet der Leser ein Dateiobjekt, also etwas was `read()` oder `write()` und `close()` als Methoden hat. Keine Datei*namen* oder Pfade.

Apropos Pfade: `pathlib` ersetzt `os`/`os.path`. Und so überhaupt nicht sollte man mit irgendwelchen Zeichenkettenoperationen auf Pfaden operieren. Und schon gar kein ersetzen von systemabhängigen Pfadtrennern per `str.replace()` machen. 😱

Die Kommentare vor den Methoden sollten wohl eher Docstrings sein, oder zumindest *in* der Funktion stehen.

Eine `send_email()`-Funktion oder Methode sollte E-Mails versenden. Die vorliegende Methode macht *deutlich* mehr.

Wenn Du eine Funktion hast welche die Dateien verarbeitet und versendet und so weiter, die `pathlib` verwendet und Pfade nicht als Zeichenkette manipuliert, dann kannst Du die Frage noch mal ohne den GUI-Code stellen, denn der hat damit ja gar nichts zu tun.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

@__blackjack__

Vielen Dank schonmal für deine Antwort und die Hinweise und Verbesserungsvorschläge.
Ich habe nun die Art mit der Liste "self.list_for_attached_files = []" zu arbeiten komplett aus dem Code entfernt.
Den ganzen Variablen hatte ich die Namen gegeben, weil ich dachte es erleichtert dem Leser
schneller zu verstehen, worum es geht. Da hab ich wohl das Gegenteil bewirkt.

Die "send_email" Funktion sieht nun wie folgt aus:

Code: Alles auswählen

def send_email():
    """SMTP-Details"""
    smtp_server = 'smtp.mail.de'
    smtp_port = 587
    smtp_user = "sender_user@mail.de"
    smtp_password = "ExamplePassword"

    """E-Mail-Details"""
    from_email = "sender_user@mail.de"
    to_email = "receiver_user@gmail.com"
    subject = "Test Email"
    body = "Hier ist Ihre E-Mail mit Anhängen."

    """Erstellen der Nachricht"""
    msg = MIMEMultipart()
    msg['From'] = from_email
    msg['To'] = to_email
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    """Anhänge hinzufügen"""
    for folder in [Path('folder_for_attached_files'), Path('folder_for_pdf_file')]:
        for file_path in folder.glob('*'):
            with open(file_path, "rb") as file:
                part = MIMEBase('application', 'octet-stream')
                part.set_payload(file.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', 
                            f'attachment; filename={file_path.name}')
            msg.attach(part)

    """E-Mail senden"""
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(smtp_user, smtp_password)
        server.send_message(msg)
        
    """Inhalte der Ordner nach dem Versenden löschen"""
    for folder in [Path('folder_for_attached_files'), Path('folder_for_pdf_file')]:
        for file in folder.glob('*'):
            file.unlink()
aber beim Versenden der Email wird immer noch nur die Pdf-Datei versendet, ohne die ausgewählten angehängten Dateien...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, Variablennamen erleichtern das Lesen, wenn sie korrekt sind. Also statt list_for_attached_files einfach attached_filepathes.
Du erstellst ständig literale Strings, die Du dann gar nicht verwendest, z.B. "Erstellen der Nachricht". Ich habe ja die Vermutung, Du willst da gar keine Strings haben, sondern Kommentare.
Besser wären aber mehrere Funktionen, die mit ihrem Namen den Kommentar ersetzen.

Einige der Daten am Anfang sollten entweder Parameter oder Konstanten sein, weil die email-Addresse findet man so nie mehr wieder.
Mehrmals die selben Verzeichnisse durchzugehen, ist schlecht, man sollte einfach die Dateinamen sich beim ersten mal merken.

Code: Alles auswählen

SMTP_SERVER = 'smtp.mail.de'
SMTP_PORT = 587
SMTP_USER = "sender_user@mail.de"
SMTP_PASSWORD = "ExamplePassword"

FROM_EMAIL = SMTP_USER
TO_EMAIL = "receiver_user@gmail.com"
SUBJECT = "Test Email"
BODY = "Hier ist Ihre E-Mail mit Anhängen."


def generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes):
    msg = MIMEMultipart()
    msg['From'] = from_email
    msg['To'] = to_email
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))
    for file_path in chain(attached_filepathes, attached_pdfpathes):
        with file_path.open("rb") as file:
            part = MIMEApplication(
                file.read(),
            )
        part['Content-Disposition'] = f'attachment; filename={file_path.name}'
        msg.attach(part)

def remove_files(file_pathes):
    for file_path in file_pathes:
        file_path.unlink()

def send_email(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes):
    message = generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes)

    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(smtp_user, smtp_password)
        server.send_message(msg)

    remove_files(attached_filepathes)
    remove_files(attached_pdfpathes)


def some_function():
    attached_filepathes = list(Path('folder_for_attached_files').glob('*'))
    attached_pdfpathes = list(Path('folder_for_pdf_file').glob('*'))
    send_email(FROM_EMAIL, TO_EMAIL, SUBJECT, BODY, attached_filepathes, attached_pdfpathes)
Die Frage wäre jetzt, ob in attached_filepathes auch die erwarteten Dateien auftauchen, oder eben nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kleiner Verbesserungsvorschlag: `Path`-Objekte haben eine praktische, coole `read_bytes()`-Methode. 😎

Und da fehlt ein ``return`` in der Funktion, sehe ich gerade.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ups.

Code: Alles auswählen

def generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes):
    message = MIMEMultipart()
    message['From'] = from_email
    message['To'] = to_email
    message['Subject'] = subject
    message.attach(MIMEText(body, 'plain'))
    for file_path in chain(attached_filepathes, attached_pdfpathes):
        part = MIMEApplication(
            file_path.read_bytes(),
        )
        part.add_header('Content-Disposition', 'attachment', filename=file_path.name)
        message.attach(part)
    return message
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Ja genau, ich wollte mit den sogenannten literalen Strings eigentlich Kommentare machen.
Literale Strings / Docstrings sind "neue" Begriffe für mich.
Ich dachte es wäre eine andere normale Art Kommentare zu machen.

Nachdem ich in deinem Code Groß und Kleinschreibung bei den Variablen ändern musste,
damit die App läuft und das "return" bzgl. dem Tipp von "__blackjack__" hinzugefügt habe,
lässt sich die App öffnen. Aber beim Versenden, wird immer nur noch die Pdf-Datei versendet, ohne die angehängten Dateien.

Ich habe Prints eingaut, um zu schauen welche Dateien angehängt/versendet wurden.

Hier die Print-Meldungen:

Code: Alles auswählen

Pfadname Dokument3.txt
angehängte Dateipfade sind: [WindowsPath('folder_for_attached_files/Dokument3.txt'), WindowsPath('folder_for_attached_files/Dokument4.txt')]
Pfadname Dokument4.txt
angehängte Dateipfade sind: [WindowsPath('folder_for_attached_files/Dokument3.txt'), WindowsPath('folder_for_attached_files/Dokument4.txt')]
Pfadname jetzt.pdf
angehängte Dateipfade sind: [WindowsPath('folder_for_attached_files/Dokument3.txt'), WindowsPath('folder_for_attached_files/Dokument4.txt')]
E-Mail wurde gesendet. [WindowsPath('folder_for_attached_files/Dokument3.txt'), WindowsPath('folder_for_attached_files/Dokument4.txt')]
Sehr verwunderlich!?

Der aktuelle Code sieht so aus:

Code: Alles auswählen

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
from pathlib import Path
import smtplib
from itertools import chain
from email.mime.application import MIMEApplication


smtp_server = 'smtp.mail.de'
smtp_port = 587
smtp_user = "sender_user@mail.de"
smtp_password = "ExamplePassword"

from_email = smtp_user
to_email = "receiver_user@gmail.com"
subject = "Test Email"
body = "Hier ist Ihre E-Mail mit Anhängen."

def generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes):
    msg = MIMEMultipart()
    msg['From'] = from_email
    msg['To'] = to_email
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))
    for file_path in chain(attached_filepathes, attached_pdfpathes):
        part = MIMEApplication(
            file_path.read_bytes(),
        )
        part.add_header('Content-Disposition', 'attachment', filename=file_path.name)
        msg.attach(part)
        
        print("Pfadname", file_path.name)
        print("angehängte Dateipfade sind:", attached_filepathes)
        
    return msg

def remove_files(file_pathes):
    for file_path in file_pathes:
        file_path.unlink()

def send_email(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes):
    msg = generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes)

    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(smtp_user, smtp_password)
        server.send_message(msg)
        
    print("E-Mail wurde gesendet.", attached_filepathes)

    remove_files(attached_filepathes)
    remove_files(attached_pdfpathes)


def some_function():
    attached_filepathes = list(Path('folder_for_attached_files').glob('*'))
    attached_pdfpathes = list(Path('folder_for_pdf_file').glob('*'))
    msg = generate_email_message(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes)
    send_email(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes)
    return msg


class EmailApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("E-Mail Sender")

        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.rename_pdf_file_and_send_email)
        self.send_button.pack()

    def select_files(self):
        selected_files = filedialog.askopenfilenames()
        for file_path in selected_files:
            shutil.copy(file_path, Path('folder_for_attached_files') / Path(file_path).name)

    def rename_pdf_file_and_send_email(self):
        pdf_filename = self.input_textfield_to_rename_pdf_file.get() + ".pdf"
        if pdf_filename != ".pdf":
            shutil.copy('random_pdf_file.pdf', Path('folder_for_pdf_file') / pdf_filename)
        
        attached_filepathes = list(Path('folder_for_attached_files').glob('*'))
        attached_pdfpathes = list(Path('folder_for_pdf_file').glob('*'))
        send_email(from_email, to_email, subject, body, attached_filepathes, attached_pdfpathes)

app = EmailApp()
app.mainloop()
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast die groß-klein-Schreibung an der falschen Stelle angepasst:

Code: Alles auswählen

    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
        server.starttls()
        server.login(SMTP_USER, SMTP_PASSWORD)
        server.send_message(msg)
Was sagt denn ein print(msg)?
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Sirius3 hat geschrieben: Montag 13. November 2023, 16:52 Du hast die groß-klein-Schreibung an der falschen Stelle angepasst:

Code: Alles auswählen

    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
        server.starttls()
        server.login(SMTP_USER, SMTP_PASSWORD)
        server.send_message(msg)
Was sagt denn ein print(msg)?
ich habe zwei Prints für msg eingebaut.
Einmal am Ende von "generate_email_message" als:

print("Funktion (generate_email_message) über (msg)", msg)

und einmal am Ende von "send_email" als:

"print("Funktion (send_email) über (msg)", msg)"

Die Meldung für msg ist:

Code: Alles auswählen

Funktion (generate_email_message) über (msg) Content-Type: multipart/mixed; boundary="===============0138118059593841111=="
MIME-Version: 1.0
From: sender_user@mail.de
To: receiver_user@gmail.com
Subject: Test Email

--===============0138118059593841111==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

SGllciBpc3QgSWhyZSBFLU1haWwgbWl0IEFuaMOkbmdlbi4=

--===============0138118059593841111==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Dokument3.txt"


--===============0138118059593841111==--

Funktion (generate_email_message) über (msg) Content-Type: multipart/mixed; boundary="===============0138118059593841111=="
MIME-Version: 1.0
From: sender_user@mail.de
To: receiver_user@gmail.com
Subject: Test Email

--===============0138118059593841111==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

SGllciBpc3QgSWhyZSBFLU1haWwgbWl0IEFuaMOkbmdlbi4=

--===============0138118059593841111==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Dokument3.txt"


--===============0138118059593841111==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test123.pdf"

JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURl
Y29kZT4+CnN0cmVhbQp4nCXKMQqDQBBG4X5O8dcWk5ldd3cWJIWg/cKAF4gJWAjaeP2EyOPrnrDi
ogMCYQmGVBOHkmC9smXFudLSYb+PX+eHRqeU2VBK5GoV/sJjVmiAvwdRCX/x6RtNTo0avi/uFUAK
ZW5kc3RyZWFtCmVuZG9iagoKMyAwIG9iago5OQplbmRvYmoKCjUgMCBvYmoKPDwvTGVuZ3RoIDYg
MCBSL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgxIDc5ODA+PgpzdHJlYW0KeJzlN3twG+Wdv29X
suWn5NgyDorQJxYncW1JfuSNjRXbku3YieUXSAnEWktrS2BLOkl2CJRDveGRUZpLSq/0gMzQY64d
SplhjbmeaXPEncLddWgPendMry05fHN05mZKJjkK3A0l8f2+b1eOEwLMde6/W/n79vd+f+vdbHpO
gXLIgQjeyKycqiEGAQB+CkA2ROaztGPIeivCKwDCP06lpmef/Os7PwAwvARQ/NL0zNGp7w73fQ+g
PAYgmmKKHP2g5adfAjCn0MaOGBL2XT5ajPiziN8Sm83emyffrUAc7YNlJhmR24U+gvjbiJfOyvem
agy70L/5PxCnCXlW+e/TP46iqAmgLJNKZrJROLYKYPsy46fSSmrwycnXED+N/k8hjeCPXeUIFjFc
EOH/9WU8AVboM3aAGVJ8v+oSn4eN8ATA6nsMu7JfHlz9+P8yCpN2+3P4DrwEJ+CXcJfO8EMA4jCH
lPXXj+DnSGVXAA7Cc5D/DLPPwxLyNbkwnGSZXPcKwDdhEf7uKi8BmIX7MZa/gl+SFvgJjkoS3icm
+Aq8hlbfR9r+65kSKnGb4uDUOuqv4SnhOOwT3kXkCcYRPIIFXoXT5DBazmKeJ9Yybv+U0UfhAdxH
IQbzCPPL2PHJr6Bk9XeY1QOwD/4E9sLMOo0z5GmxFPs3Bk9jTX/EaZ4Cs7hPvFv4viBc+joiX4Np
XDLB3IUT4t7PqND/+hLHoYI0iPVQcj2usA3Mlz8WWlc/EG+BUhhfvVigrQ6s/k6ULycME4ZNxg7D
65/no+hrhlnUhtXfXL7/ctR4wPgd7BY+Sby9hw6GguNjoyPDgaED+wcH9vX39fp9Pd1de72dt3W0
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
2Og2GPeYV82C2TxhftAsmqEThFwtMZIlcmphbLSxcWCpeHVkQDUFDqnkmFo/ynbv8EG16JgK4wcP
BRcI+dPQwydOQJd9QG0dDaphe2hAjSLgZUAOAYt9oRa6QplMtpFfpLER4TncoXGuEYmHMxoV1vjQ
mCEZfERluBJpZAIaTnBvZDwkMD2C2oczwDbGbNSUmHZGN8eVtY0DdYf/B3aU77UKZW5kc3RyZWFt
CmVuZG9iagoKNiAwIG9iago0NDQ4CmVuZG9iagoKNyAwIG9iago8PC9UeXBlL0ZvbnREZXNjcmlw
dG9yL0ZvbnROYW1lL0JBQUFBQStMaWJlcmF0aW9uU2VyaWYKL0ZsYWdzIDYKL0ZvbnRCQm94Wy01
NDMgLTMwMyAxMjc4IDk4Ml0vSXRhbGljQW5nbGUgMAovQXNjZW50IDg5MQovRGVzY2VudCAtMjE2
Ci9DYXBIZWlnaHQgOTgxCi9TdGVtViA4MAovRm9udEZpbGUyIDUgMCBSCj4+CmVuZG9iagoKOCAw
IG9iago8PC9MZW5ndGggMjM1L0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nF1QQWrDMBC8
6xV7TA9BslPSixGElIAPSUvdPkCW1q6glsRaPvj3leS0hR4kZtiZYXb5uX1unY38lbzuMMJgnSGc
/UIaocfROlbVYKyOd1Z+PanAePJ26xxxat3gm4bxtzSbI62wOxnf4wPjL2SQrBth93HuEu+WEL5w
QhdBMCnB4JByrirc1IS8uPatSWMb132y/Ane14BQF15tVbQ3OAelkZQbkTVCSGguF8nQmX+zw+bo
B/2pKCmrpBTieJQJ1wU/nTI+bPixZNzVOS2v+9MS9EKUGpablGq5lHX4e7bgQ3aV9w3kB3IlCmVu
ZHN0cmVhbQplbmRvYmoKCjkgMCBvYmoKPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvQmFz
ZUZvbnQvQkFBQUFBK0xpYmVyYXRpb25TZXJpZgovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDMKL1dp
ZHRoc1swIDMzMyA0NDMgMjc3IF0KL0ZvbnREZXNjcmlwdG9yIDcgMCBSCi9Ub1VuaWNvZGUgOCAw
IFIKPj4KZW5kb2JqCgoxMCAwIG9iago8PC9GMSA5IDAgUgo+PgplbmRvYmoKCjExIDAgb2JqCjw8
L0ZvbnQgMTAgMCBSCi9Qcm9jU2V0Wy9QREYvVGV4dF0KPj4KZW5kb2JqCgoxIDAgb2JqCjw8L1R5
cGUvUGFnZS9QYXJlbnQgNCAwIFIvUmVzb3VyY2VzIDExIDAgUi9NZWRpYUJveFswIDAgNTk1LjMw
MzkzNzAwNzg3NCA4NDEuODg5NzYzNzc5NTI4XS9Db250ZW50cyAyIDAgUj4+CmVuZG9iagoKNCAw
IG9iago8PC9UeXBlL1BhZ2VzCi9SZXNvdXJjZXMgMTEgMCBSCi9NZWRpYUJveFsgMCAwIDU5NS4z
MDM5MzcwMDc4NzQgODQxLjg4OTc2Mzc3OTUyOCBdCi9LaWRzWyAxIDAgUiBdCi9Db3VudCAxPj4K
ZW5kb2JqCgoxMiAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgNCAwIFIKL1BhZ2VNb2RlL1Vz
ZU91dGxpbmVzCi9PcGVuQWN0aW9uWzEgMCBSIC9YWVogbnVsbCBudWxsIDBdCi9MYW5nKGRlLURF
KQo+PgplbmRvYmoKCjEzIDAgb2JqCjw8L0NyZWF0b3I8RkVGRjAwNTcwMDcyMDA2OTAwNzQwMDY1
MDA3Mj4KL1Byb2R1Y2VyPEZFRkYwMDRDMDA2OTAwNjIwMDcyMDA2NTAwNEYwMDY2MDA2NjAwNjkw
MDYzMDA2NTAwMjAwMDM3MDAyRTAwMzU+Ci9DcmVhdGlvbkRhdGUoRDoyMDIzMTEwODA4MjczNisw
MScwMCcpPj4KZW5kb2JqCgp4cmVmCjAgMTQKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDA1NTE2
IDAwMDAwIG4gCjAwMDAwMDAwMTkgMDAwMDAgbiAKMDAwMDAwMDE4OSAwMDAwMCBuIAowMDAwMDA1
NjQwIDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwNDc0MCAwMDAwMCBuIAowMDAw
MDA0NzYxIDAwMDAwIG4gCjAwMDAwMDQ5NTYgMDAwMDAgbiAKMDAwMDAwNTI2MCAwMDAwMCBuIAow
MDAwMDA1NDI5IDAwMDAwIG4gCjAwMDAwMDU0NjEgMDAwMDAgbiAKMDAwMDAwNTc2NSAwMDAwMCBu
IAowMDAwMDA1ODg0IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6ZSAxNC9Sb290IDEyIDAgUgovSW5m
byAxMyAwIFIKL0lEIFsgPDEyQTk3RTM4MTQyOTk2RjAxQUIxNTcxRkZDRUM3RDJBPgo8MTJBOTdF
MzgxNDI5OTZGMDFBQjE1NzFGRkNFQzdEMkE+IF0KL0RvY0NoZWNrc3VtIC8xOTc0MjYzRDYyRUQ3
RTA2RUE1MDg3N0RCODlFOTZBMgo+PgpzdGFydHhyZWYKNjA1OQolJUVPRgo=

--===============0138118059593841111==--

Funktion (send_email) über (msg) Content-Type: multipart/mixed; boundary="===============0138118059593841111=="
MIME-Version: 1.0
From: sender_user@mail.de
To: receiver_user@gmail.com
Subject: Test Email

--===============0138118059593841111==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

SGllciBpc3QgSWhyZSBFLU1haWwgbWl0IEFuaMOkbmdlbi4=

--===============0138118059593841111==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Dokument3.txt"


--===============0138118059593841111==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test123.pdf"

JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURl
Y29kZT4+CnN0cmVhbQp4nCXKMQqDQBBG4X5O8dcWk5ldd3cWJIWg/cKAF4gJWAjaeP2EyOPrnrDi
ogMCYQmGVBOHkmC9smXFudLSYb+PX+eHRqeU2VBK5GoV/sJjVmiAvwdRCX/x6RtNTo0avi/uFUAK
ZW5kc3RyZWFtCmVuZG9iagoKMyAwIG9iago5OQplbmRvYmoKCjUgMCBvYmoKPDwvTGVuZ3RoIDYg
MCBSL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgxIDc5ODA+PgpzdHJlYW0KeJzlN3twG+Wdv29X
suWn5NgyDorQJxYncW1JfuSNjRXbku3YieUXSAnEWktrS2BLOkl2CJRDveGRUZpLSq/0gMzQY64d
SplhjbmeaXPEncLddWgPendMry05fHN05mZKJjkK3A0l8f2+b1eOEwLMde6/W/n79vd+f+vdbHpO
gXLIgQjeyKycqiEGAQB+CkA2ROaztGPIeivCKwDCP06lpmef/Os7PwAwvARQ/NL0zNGp7w73fQ+g
PAYgmmKKHP2g5adfAjCn0MaOGBL2XT5ajPiziN8Sm83emyffrUAc7YNlJhmR24U+gvjbiJfOyvem
agy70L/5PxCnCXlW+e/TP46iqAmgLJNKZrJROLYKYPsy46fSSmrwycnXED+N/k8hjeCPXeUIFjFc
EOH/9WU8AVboM3aAGVJ8v+oSn4eN8ATA6nsMu7JfHlz9+P8yCpN2+3P4DrwEJ+CXcJfO8EMA4jCH
lPXXj+DnSGVXAA7Cc5D/DLPPwxLyNbkwnGSZXPcKwDdhEf7uKi8BmIX7MZa/gl+SFvgJjkoS3icm
+Aq8hlbfR9r+65kSKnGb4uDUOuqv4SnhOOwT3kXkCcYRPIIFXoXT5DBazmKeJ9Yybv+U0UfhAdxH
IQbzCPPL2PHJr6Bk9XeY1QOwD/4E9sLMOo0z5GmxFPs3Bk9jTX/EaZ4Cs7hPvFv4viBc+joiX4Np
XDLB3IUT4t7PqND/+hLHoYI0iPVQcj2usA3Mlz8WWlc/EG+BUhhfvVigrQ6s/k6ULycME4ZNxg7D
65/no+hrhlnUhtXfXL7/ctR4wPgd7BY+Sby9hw6GguNjoyPDgaED+wcH9vX39fp9Pd1de72dt3W0
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
2Og2GPeYV82C2TxhftAsmqEThFwtMZIlcmphbLSxcWCpeHVkQDUFDqnkmFo/ynbv8EG16JgK4wcP
BRcI+dPQwydOQJd9QG0dDaphe2hAjSLgZUAOAYt9oRa6QplMtpFfpLER4TncoXGuEYmHMxoV1vjQ
mCEZfERluBJpZAIaTnBvZDwkMD2C2oczwDbGbNSUmHZGN8eVtY0DdYf/B3aU77UKZW5kc3RyZWFt
CmVuZG9iagoKNiAwIG9iago0NDQ4CmVuZG9iagoKNyAwIG9iago8PC9UeXBlL0ZvbnREZXNjcmlw
dG9yL0ZvbnROYW1lL0JBQUFBQStMaWJlcmF0aW9uU2VyaWYKL0ZsYWdzIDYKL0ZvbnRCQm94Wy01
NDMgLTMwMyAxMjc4IDk4Ml0vSXRhbGljQW5nbGUgMAovQXNjZW50IDg5MQovRGVzY2VudCAtMjE2
Ci9DYXBIZWlnaHQgOTgxCi9TdGVtViA4MAovRm9udEZpbGUyIDUgMCBSCj4+CmVuZG9iagoKOCAw
IG9iago8PC9MZW5ndGggMjM1L0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nF1QQWrDMBC8
6xV7TA9BslPSixGElIAPSUvdPkCW1q6glsRaPvj3leS0hR4kZtiZYXb5uX1unY38lbzuMMJgnSGc
/UIaocfROlbVYKyOd1Z+PanAePJ26xxxat3gm4bxtzSbI62wOxnf4wPjL2SQrBth93HuEu+WEL5w
QhdBMCnB4JByrirc1IS8uPatSWMb132y/Ane14BQF15tVbQ3OAelkZQbkTVCSGguF8nQmX+zw+bo
B/2pKCmrpBTieJQJ1wU/nTI+bPixZNzVOS2v+9MS9EKUGpablGq5lHX4e7bgQ3aV9w3kB3IlCmVu
ZHN0cmVhbQplbmRvYmoKCjkgMCBvYmoKPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvQmFz
ZUZvbnQvQkFBQUFBK0xpYmVyYXRpb25TZXJpZgovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDMKL1dp
ZHRoc1swIDMzMyA0NDMgMjc3IF0KL0ZvbnREZXNjcmlwdG9yIDcgMCBSCi9Ub1VuaWNvZGUgOCAw
IFIKPj4KZW5kb2JqCgoxMCAwIG9iago8PC9GMSA5IDAgUgo+PgplbmRvYmoKCjExIDAgb2JqCjw8
L0ZvbnQgMTAgMCBSCi9Qcm9jU2V0Wy9QREYvVGV4dF0KPj4KZW5kb2JqCgoxIDAgb2JqCjw8L1R5
cGUvUGFnZS9QYXJlbnQgNCAwIFIvUmVzb3VyY2VzIDExIDAgUi9NZWRpYUJveFswIDAgNTk1LjMw
MzkzNzAwNzg3NCA4NDEuODg5NzYzNzc5NTI4XS9Db250ZW50cyAyIDAgUj4+CmVuZG9iagoKNCAw
IG9iago8PC9UeXBlL1BhZ2VzCi9SZXNvdXJjZXMgMTEgMCBSCi9NZWRpYUJveFsgMCAwIDU5NS4z
MDM5MzcwMDc4NzQgODQxLjg4OTc2Mzc3OTUyOCBdCi9LaWRzWyAxIDAgUiBdCi9Db3VudCAxPj4K
ZW5kb2JqCgoxMiAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgNCAwIFIKL1BhZ2VNb2RlL1Vz
ZU91dGxpbmVzCi9PcGVuQWN0aW9uWzEgMCBSIC9YWVogbnVsbCBudWxsIDBdCi9MYW5nKGRlLURF
KQo+PgplbmRvYmoKCjEzIDAgb2JqCjw8L0NyZWF0b3I8RkVGRjAwNTcwMDcyMDA2OTAwNzQwMDY1
MDA3Mj4KL1Byb2R1Y2VyPEZFRkYwMDRDMDA2OTAwNjIwMDcyMDA2NTAwNEYwMDY2MDA2NjAwNjkw
MDYzMDA2NTAwMjAwMDM3MDAyRTAwMzU+Ci9DcmVhdGlvbkRhdGUoRDoyMDIzMTEwODA4MjczNisw
MScwMCcpPj4KZW5kb2JqCgp4cmVmCjAgMTQKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDA1NTE2
IDAwMDAwIG4gCjAwMDAwMDAwMTkgMDAwMDAgbiAKMDAwMDAwMDE4OSAwMDAwMCBuIAowMDAwMDA1
NjQwIDAwMDAwIG4gCjAwMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwNDc0MCAwMDAwMCBuIAowMDAw
MDA0NzYxIDAwMDAwIG4gCjAwMDAwMDQ5NTYgMDAwMDAgbiAKMDAwMDAwNTI2MCAwMDAwMCBuIAow
MDAwMDA1NDI5IDAwMDAwIG4gCjAwMDAwMDU0NjEgMDAwMDAgbiAKMDAwMDAwNTc2NSAwMDAwMCBu
IAowMDAwMDA1ODg0IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6ZSAxNC9Sb290IDEyIDAgUgovSW5m
byAxMyAwIFIKL0lEIFsgPDEyQTk3RTM4MTQyOTk2RjAxQUIxNTcxRkZDRUM3RDJBPgo8MTJBOTdF
MzgxNDI5OTZGMDFBQjE1NzFGRkNFQzdEMkE+IF0KL0RvY0NoZWNrc3VtIC8xOTc0MjYzRDYyRUQ3
RTA2RUE1MDg3N0RCODlFOTZBMgo+PgpzdGFydHhyZWYKNjA1OQolJUVPRgo=

--===============0138118059593841111==--
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Daran siehst Du doch, dass die Dateien, die Du anhängst leer sind.
Warum das so ist, sieht man nicht am Code.
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Ich bin's nochmal!!!

Ich bin gerade am PC von jemand anderem, und was soll ich sagen...aber es funktioniert hier alles problemlos!
Selbst wenn die angehängten Dateien in vom Projektordner unabhängigen Ordnern liegen, funktioniert es.

Verstehen tue ich das trotzdem nicht. Dafür habe ich den Code von folgendem Beitrag genommen:

viewtopic.php?p=424631#p424631

Wenn ich übermorgen wieder zu Hause bin, werde ich gleich testen, ob es mit dem genannten Code immer noch nicht geht, oder es wirklich an meinem Rechner liegt...
Getestet hatte ich es eigentlich oft genug...aber wer weiß. Sehr seltsam...

Vielen herzlichen Dank Euch beiden bis hier schonmal !

Ich werde mich dann sofort melden...
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

marlon_germany hat geschrieben: Montag 13. November 2023, 16:39 Nachdem ich in deinem Code Groß und Kleinschreibung bei den Variablen ändern musste,
damit die App läuft
Die Sachen wurden extra KOMPLETT GROSS geschrieben, weil sie eben nicht variabel sind, sondern als Konstanten unverändert bleiben sollen. :wink:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

So, ich habe es nun von zu Hause aus getestet und es funktioniert :)

Es lag daran, dass die Dateien, die ich von meinem Desktop versenden wollte, wirklich leer waren. :roll:

Ich hatte nämlich neuerdings für Testvesuche Textdateien auf dem Desktop erstellt und vergessen dort irgendetwas hereinzuschreiben,
sodass die App sich geweigert hat, Dateien mit leeren Inhalten zu versenden.

Dateien die mindestens 1 Zeichen enthalten, funktionieren.

In der Vergangenheit, hatten die ".txt" Dateien auf dem Desktop zwar mindestens ein paar Zeichen als Inhalt,
aber zu dem Zeitpunkt war die App noch nicht Fehlerfrei, sodass ich mir eingebildet habe, es liegt daran,
dass nur Dateien die innerhalb des App-Ordners liegen versendet werden können.

Denn neuerdings hatten die Test Textdateien innerhalb des App-Ordners immer mind. 1 Zeichen als Inhalt,
im Vergleich zu den leeren Textdateien auf dem Desktop.


Vielen Dank Euch allen, für's weiterhelfen und den Hinweisen, was ab nun besser gemacht werden kann :wink:
Antworten