none
Datei nach versenden als Anhang einer EMail verschieben. RRS feed

  • 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

    Dienstag, 7. Dezember 2010 14:14

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/
    Mittwoch, 8. Dezember 2010 08:51

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 sondern

    1. Mailen
    2. Verschieben
    3. Kontrollieren ob die verschobene Datei am Zielort ist, erst dann

    weiter ...


    Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express
    Dienstag, 7. Dezember 2010 16:18
  • 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
    
    Mittwoch, 8. Dezember 2010 08:14
  • 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/
    Mittwoch, 8. Dezember 2010 08:51
  • Damit funktionierts, super danke.

     

    Lässt sich das Programm auch leicht als Dienst verwirklichen?

    Mittwoch, 8. Dezember 2010 09:09