Laden...

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

Letzter Beitrag vor 9 Jahren 4 Posts 1.147 Views
[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

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

LG pdelvo

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...

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

Gruß trekki