Benutzer mit den meisten Antworten
Datei nach versenden als Anhang einer EMail verschieben.

Frage
-
Hallo,
ich habe ein Probem mit dem Verschieben einer Datei, nachdem ich selbige an eine EMail als Anhang gepackt habe.
Ich benutze eine Schleife
For Each Files In My.Computer.FileSystem.GetFiles(***)
um alle Dateien in einem Ordner als EMail zu versenden. Das klappt auch soweit aber dann möchte ich die Datei nach dem senden in einen anderen Ordner verschieben. Allerdings sagt mir das Programm beim ausführen, dass die Datei von einem anderen Prozess benutzt wird und ich die Datei nicht verschieben kann. Anderswo habe ich dann erfahren, dass ich ein Smtpclient.Dispose() ausführen soll. Reicht aber auch nicht. Auch eine längere Wartezeit reicht nicht, daher meine Frage wie ich die Datei wieder freigebe?
Hoffentlich kann mir jemand einen Tipp geben
MfG
- Bearbeitet Robert BreitenhoferModerator Freitag, 10. Dezember 2010 11:44 Formatierung
Antworten
-
Hallo frustriert,
das liegt nicht an dem smtpclient, das liegt an dem email object. Am besten ist es für solche Dinge Using..End Using zu verwenden, was bei Objekten, die die Disposable Schnittstelle implementiert haben dazu führt, dass diese Objekte beim verlassen des Using blocks disposed werden. Ich habe Deinen Code mal ein wenig umgeschrieben:
'Visual Basic 2010 - .net 4.0 - x86 Imports System.Net.Mail Imports System.IO Public Class Form1 'Dim eMail As New MailMessage("xxx@xxx.de", "xxx@xxx.de") 'Sender & Empfänger 'Dim client As New SmtpClient Dim anmeldung As New Net.NetworkCredential Dim anhang As String Dim Start As String Dim Ziel As String Dim uhrzeit As TimeSpan Dim pfad As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click pfad = "c:" uhrzeit = Now.TimeOfDay anmeldung.UserName = "x@xxx.de" anmeldung.Password = "xxx" Try For Each Files In My.Computer.FileSystem.GetFiles(pfad & "\Start\") Using eMail As New MailMessage("xxx@xxx.de", "xxx@xxx.de") anhang = My.Computer.FileSystem.GetName(Files) With eMail .Subject = "Betreff" .IsBodyHtml = False .BodyEncoding = System.Text.Encoding.Default .Body = "Datei: " & anhang & " // " & uhrzeit.ToString .Priority = MailPriority.Normal .Attachments.Add(New Attachment(pfad & "\Start\" & anhang)) End With Using client As New SmtpClient("post.strato.de") client.Credentials = anmeldung client.Send(eMail) End Using End Using Start = pfad & "\Start\" & anhang Ziel = pfad & "\Ziel\" & anhang Try My.Computer.FileSystem.MoveFile(Start, Ziel) Catch ex As Exception Label1.Text = ex.ToString() End Try Next Catch ex As Exception Label1.Text = ex.ToString() End Try End Sub End Class
Hannes
If you have got questions about this, just ask.
In a perfect world,
users would never enter data in the wrong form,
files they choose to open would always exist
and code would never have bugs.
C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/- Als Antwort vorgeschlagen Björn Möller Mittwoch, 8. Dezember 2010 10:01
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 10. Dezember 2010 11:44
Alle Antworten
-
Hallo frustriert,
aus deinem Text Smtpclient.Dispose() geht hervor, dass du via SMTP mailst.
Weiterhin schreibst du, dass du alle Dateien aus einem Ordner verschicken möchtest. Je nachdem wie groß diese Anlagen sind und wie schnell deine Datenübertragung ist, kann das richtig lange dauern. Ich hatte das in einem meiner Programme und habe zu diesem Zweck sogar den Timeout für den Mailversand einstellbar machen müssen.Ohne genaueren Code wird dir hier aber kaum jemand helfen können, denn wir können ja nicht raten was du anstellst.
Grundsätzlich würde ich aber vorschlagen die Schleife so zu gestalten, dass nicht das komplette Paket verschickz und dann die Datei verschoben wird sondern1. Mailen
2. Verschieben
3. Kontrollieren ob die verschobene Datei am Zielort ist, erst dannweiter ...
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express -
Hallo Giftzwockel,
ich hatte ja eigentlich gehofft, dass es nur ein kleines Stichwort wäre, welches mir fehlt. Na gut dann halt mal alles.
Das Programm wird zur Zeit nur durch einen Buttonklick ausgelöst, soll aber später in Intervalen anstarten, aber das ist noch nicht mein Problem.
Herrausgefunden habe ich schon, dass .Dispose() erst seit .net 4.0 unterstüzt wird was mich lange aufgehalten hat, weil ich Visual Studio 2008 nutzte. Nun habe ich mir Visual Studio 2010 professional (testversion) drauf. Dennoch mag er einfach die Dateien nicht verschieben. Auch eine längere Wartezeit reicht nicht.
Noch die Fehlermeldung hier:
System.ObjectDisposedException: Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: "System.Net.Mail.SmtpClient".
bei System.Net.Mail.SmtpClient.Send(MailMessage message)
bei WindowsApplication1.Form1.Button1_Click(Object sender, EventArgs e) in c:\...\Form1.vb:Zeile 37.Imports System.Net.Mail Imports System.IO Public Class Form1 Dim eMail As New MailMessage("xxx@xxx.de", "xxx@xxx.de") 'Sender & Empfänger Dim client As New SmtpClient Dim anmeldung As New Net.NetworkCredential Dim anhang As String Dim Start As String Dim Ziel As String Dim uhrzeit As TimeSpan Dim pfad As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click pfad = "c:" uhrzeit = Now.TimeOfDay Try For Each Files In My.Computer.FileSystem.GetFiles(pfad & "\Start\") anhang = My.Computer.FileSystem.GetName(Files) anmeldung.UserName = "x@xxx.de" anmeldung.Password = "xxx" With eMail .Subject = "Betreff" .IsBodyHtml = False .BodyEncoding = System.Text.Encoding.Default .Body = "Datei: " & anhang & " // " & uhrzeit.ToString .Priority = MailPriority.Normal .Attachments.Add(New Attachment(pfad & "\Start\" & anhang)) End With client.Host = "post.strato.de" client.Credentials = anmeldung client.Send(eMail) client.Dispose() Threading.Thread.Sleep(2000) Start = pfad & "\Start\" & anhang Ziel = pfad & "\Ziel\" & anhang Try My.Computer.FileSystem.MoveFile(Start, Ziel) Catch ex As Exception Label1.Text = ex.ToString() End Try Next Catch ex As Exception Label1.Text = ex.ToString() End Try End Sub
Gruss
-
Hallo frustriert,
das liegt nicht an dem smtpclient, das liegt an dem email object. Am besten ist es für solche Dinge Using..End Using zu verwenden, was bei Objekten, die die Disposable Schnittstelle implementiert haben dazu führt, dass diese Objekte beim verlassen des Using blocks disposed werden. Ich habe Deinen Code mal ein wenig umgeschrieben:
'Visual Basic 2010 - .net 4.0 - x86 Imports System.Net.Mail Imports System.IO Public Class Form1 'Dim eMail As New MailMessage("xxx@xxx.de", "xxx@xxx.de") 'Sender & Empfänger 'Dim client As New SmtpClient Dim anmeldung As New Net.NetworkCredential Dim anhang As String Dim Start As String Dim Ziel As String Dim uhrzeit As TimeSpan Dim pfad As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click pfad = "c:" uhrzeit = Now.TimeOfDay anmeldung.UserName = "x@xxx.de" anmeldung.Password = "xxx" Try For Each Files In My.Computer.FileSystem.GetFiles(pfad & "\Start\") Using eMail As New MailMessage("xxx@xxx.de", "xxx@xxx.de") anhang = My.Computer.FileSystem.GetName(Files) With eMail .Subject = "Betreff" .IsBodyHtml = False .BodyEncoding = System.Text.Encoding.Default .Body = "Datei: " & anhang & " // " & uhrzeit.ToString .Priority = MailPriority.Normal .Attachments.Add(New Attachment(pfad & "\Start\" & anhang)) End With Using client As New SmtpClient("post.strato.de") client.Credentials = anmeldung client.Send(eMail) End Using End Using Start = pfad & "\Start\" & anhang Ziel = pfad & "\Ziel\" & anhang Try My.Computer.FileSystem.MoveFile(Start, Ziel) Catch ex As Exception Label1.Text = ex.ToString() End Try Next Catch ex As Exception Label1.Text = ex.ToString() End Try End Sub End Class
Hannes
If you have got questions about this, just ask.
In a perfect world,
users would never enter data in the wrong form,
files they choose to open would always exist
and code would never have bugs.
C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/- Als Antwort vorgeschlagen Björn Möller Mittwoch, 8. Dezember 2010 10:01
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 10. Dezember 2010 11:44