Laden...

[gelöst] Beim Versenden von Mail-Attachments bleibt Datei geöffnet

Erstellt von Trekki1990 vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.128 Views
Trekki1990 Themenstarter:in
503 Beiträge seit 2008
vor 9 Jahren
[gelöst] Beim Versenden von Mail-Attachments bleibt Datei geöffnet

Hallo ich grüße euch,

ich habe das Gefühl, dass ich auf dem Schlauch stehe.
Kurzer Überblick: Ich habe eine Funktion die eine Mail mit Anhang über SMTP verschickt. Diese Datei ist temporär, das heißt ich erzeuge diese Datei und die Funktion holt sich diese Datei, hängt sie an die Mail, schickt die Mail weg und soll anschließend die Datei(en) wieder löschen. Genau hier wird eine Fehlermeldung geworfen, dass die Datei von einem anderen Prozess verwendet wird.

Hier mal mein Code:

private void sendmail_smtp(string recipient)
        {
            DirectoryInfo di = new DirectoryInfo(Application.StartupPath + @"\settings\temp\");
            int files = di.GetFiles().Length - 1;
            FileInfo[] filenames = di.GetFiles();

            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient(File.ReadAllText(Application.StartupPath + @"\settings\mail\server.txt"));
            mail.IsBodyHtml = true;
            mail.From = new MailAddress(File.ReadAllText(Application.StartupPath + @"\settings\mail\sender.txt"));
            mail.To.Add(recipient);
            mail.Subject = File.ReadAllText(Application.StartupPath + @"\settings\mail\subject.txt");
            mail.Body = File.ReadAllText(Application.StartupPath + @"\settings\mail\body.txt");

            System.Net.Mail.Attachment attachment;

            foreach (FileInfo f in filenames)
            {
                attachment = new System.Net.Mail.Attachment(Application.StartupPath + @"\settings\temp\" + f.Name);
                mail.Attachments.Add(attachment);
            }

            SmtpServer.Port = 25;
            //SmtpServer.Credentials = new System.Net.NetworkCredential("mail", "password");
            //SmtpServer.EnableSsl = true;

            try { SmtpServer.Send(mail); }
            catch (Exception ex) { fehlermeldung("Fehler beim Senden der Mail.\nMögliche Ursachen: Firewall, Virenclient, Server nicht erreichbar.\n\nDetails: ", "Mail", ex.Message); }
            finally { SmtpServer.Dispose(); }
        }

Ich bin dann mal die Befehle Schritt für Schritt durchgegangen.
Die Datei befindet sich im Zugriff sobald folgender Befehl der Funktion ausgeführt wird:

foreach (FileInfo f in filenames)
            {
                attachment = new System.Net.Mail.Attachment(Application.StartupPath + @"\settings\temp\" + f.Name);
                mail.Attachments.Add(attachment);
            }

Ich hatte dann später noch

SmtpServer.Dispose();

ausgeführt, aber der Handle bleibt geöffnet. Übersehe ich da etwas?? Normal lese ich doch eigentlich nur und habe die Datei nicht zum Schreiben geöffnet.

Ich hoffe ich konnte mein Problem weitestgehend genau beschreiben.
Über die Suchfunktion habe ich zumindest nichts gefunden, was mich weiter bringen könnte.

Danke schon mal.

Gruß trekki

1.346 Beiträge seit 2008
vor 9 Jahren

Du musst die MailMessage danach auch disposen, damit die Datei freigegeben wird.

LG pdelvo

502 Beiträge seit 2004
vor 9 Jahren

Hi,

letztendlich werden durch deinen Code Instanzen der Klasse System.Net.Mail.Attachment erzeugt. Diese müssen wieder via Dispose aufgeräumt werden, damit die Handles freigeben werden. Wenn ich mich recht entsinne genügt es dafür aber auch die eigentlich MailMessage via Dispose freizugeben.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

Trekki1990 Themenstarter:in
503 Beiträge seit 2008
vor 9 Jahren

Ach so ein Mist... da sieht man den Wald vor lauter Bäumen nicht. Ich danke euch beiden! Hat funktioniert.

Gruß trekki