Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[gelöst] Beim Versenden von Mail-Attachments bleibt Datei geöffnet
Trekki1990
myCSharp.de - Member

Avatar #avatar-2705.jpg


Dabei seit:
Beiträge: 543
Herkunft: Sachsen-Anhalt, Dessau

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Trekki1990 am .
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1407

beantworten | zitieren | melden

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

LG pdelvo
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Trekki1990
myCSharp.de - Member

Avatar #avatar-2705.jpg


Dabei seit:
Beiträge: 543
Herkunft: Sachsen-Anhalt, Dessau

Themenstarter:

beantworten | zitieren | melden

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

Gruß trekki
private Nachricht | Beiträge des Benutzers