E-Mail anhänge aus einem Ordner senden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 54 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Habs mal bei mir zusammen kopiert. Ist nicht getestet oder optimiert, kommen zumindest keine Syntax Fehler.
    Ob die Mail raus geht und so musst du aber selbst testen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.Net
    4. Imports System.Net.Mail
    5. Imports System.Net.Mime
    6. Imports System.Threading
    7. Imports System.ComponentModel
    8. Public Class Form1
    9. Dim smtpServer As New SmtpClient()
    10. Dim mail As New MailMessage()
    11. Dim attachment As Attachment
    12. Dim mailSent As Boolean = False
    13. Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    14. smtpServer.Credentials = New Net.NetworkCredential(TB_Email.Text, TB_Passwort.Text)
    15. 'using gmail
    16. smtpServer.Port = 587
    17. smtpServer.Host = "smtp.gmail.com"
    18. smtpServer.EnableSsl = True
    19. mail = New MailMessage()
    20. AddHandler smtpServer.SendCompleted, AddressOf SendCompletedCallback
    21. Dim sPath As String = TB_Speicherpfad.Text
    22. If sPath.EndsWith("\") And sPath.Length > 3 Then
    23. sPath = sPath.Substring(0, sPath.Length - 1)
    24. End If
    25. If System.IO.Directory.Exists(sPath) Then
    26. Dim sFiles() As String = System.IO.Directory.GetFiles(sPath, "*.*")
    27. With mail
    28. .From = New MailAddress(TB_Email.Text)
    29. .To.Add(TB_Email.Text)
    30. .Subject = " test"
    31. .Body = "Test"
    32. Dim sFile As String
    33. For Each sFile In sFiles
    34. .Attachments.Add(New Attachment(sFile))
    35. Next
    36. End With
    37. End If
    38. smtpServer.SendAsync(mail, "")
    39. End Sub
    40. Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    41. 'Mail gesendet
    42. If e.Error Is Nothing Then
    43. 'Hier die Dateien löschen
    44. mailSent = True
    45. End If
    46. End Sub
    47. End Class

    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Sobald es ums löschen geht, kommt immer diese Fehlermeldung:
    In System.IO.IOException ist eine Ausnahme von Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.
    Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
    Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.
    Es liegt glaub ich nicht ans senden, sondern um irgendwas anderes. Woran könnte es liegen?
    @vbfrage446 @mrMo SmtpClient ist ein IDisposable, dessen Instanz solltest Du beim Senden erstellen und beim Beenden des Sendens disposen. Using geht wegen Async nicht.
    Dann lassen sich auch die Dateien löschen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe den lösch code genau wie du es geschrieben hast unter :

    If e.Error Is Nothing Then
    Dim DeleteFiles As String()
    Dim FileName AS String
    If System.IO.Directory.Exists("C:\Users\System1\Test\") Then
    DeleteFiles = IO.Directory.GetFiles("C:\Users\System1\Test\", "*.txt")
    For i As Integer = 0 To UBound(DeleteFiles)
    FileName = System.IO.Path.GetFileName(Delete Files(i))
    IO.File.Delete("C:\Users\System1\Test\" & FileName)
    Next
    End If

    Den gleichen Pfad wie die mail
    Schau dir den Post von @RodFromGermany an. Das ist die fehlende Info damit dein Code läuft. Dispose ist das Zauberwort.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    smtpServer.Dispose() evtl. mal ausprobieren:

    VB.NET-Quellcode

    1. If e.Error Is Nothing Then
    2. smtpServer.Dispose()
    3. Dim DeleteFiles As String()
    4. Dim FileName AS String
    5. If System.IO.Directory.Exists("C:\Users\System1\Test\") Then
    6. DeleteFiles = IO.Directory.GetFiles("C:\Users\System1\Test\", "*.txt")
    7. For i As Integer = 0 To UBound(DeleteFiles)
    8. FileName = System.IO.Path.GetFileName(Delete Files(i))
    9. IO.File.Delete("C:\Users\System1\Test\" & FileName)
    10. Next
    11. End If
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Versuch es doch mal so wie ich es oben vorgeschlagen habe.

    P.s. "Klappt nicht" ist sehr allgemein gehalten. Bitte zeige etwas mehr eigeninitiative und engagement hier beim erarbeiten einer Lösung. Immerhin nehmen sich hier Menschen extra Zeit für dich.


    Edit: @vbfrage446 mach mal das hier, bei mir läuft es dann durch:

    VB.NET-Quellcode

    1. If e.Error Is Nothing Then
    2. mail.Dispose()​ ' DAS DÜRFTE KLAPPEN
    3. Dim DeleteFiles As String()
    4. Dim FileName AS String
    5. If System.IO.Directory.Exists("C:\Users\System1\Test\") Then
    6. DeleteFiles = IO.Directory.GetFiles("C:\Users\System1\Test\", "*.txt")
    7. For i As Integer = 0 To UBound(DeleteFiles)
    8. FileName = System.IO.Path.GetFileName(Delete Files(i))
    9. IO.File.Delete("C:\Users\System1\Test\" & FileName)
    10. Next
    11. End If

    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    Ich habe rum probiert und leider klappt das nicht so wie ich mir das vorstelle

    SmtpClient ist ein IDisposable, dessen Instanz solltest Du beim Senden erstellen und beim Beenden des Sendens disposen.
    Das verstehe ich auch nicht richtig ganz.
    Habe es versucht mit smtpServer.Dispose(). Aber leider will mein Programm nicht so wie ich es mir vorstelle
    Hab meinem post oben nachträglich Code hinzugefügt.
    mail.Dispose() wäre korrekt.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Poste mal den kompletten Code. Weil bei mir tut das ohne Probleme mit mail.Dispose(). Mail geht raus mit Anhang und die Dateien werden gelöscht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hier der komplette code.
    mail.Dispose nimmer er nicht da mail nicht (irgendwie) vorhanden ist:

    Public Class Form1
    Private Shared mailSent As Boolean = False
    Private Shared Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    If e.Error Is Nothing Then
    MsgBox("gesendet!", MsgBoxStyle.Information)
    Mail.Dispose()
    Dim DelelteFiles As String()
    Dim FileName As String
    If System.IO.Directory.Exists(TB_Speicherpfad.Text) Then
    DelelteFiles = IO.Directory.GetFiles(TB_Speicherpfad.Text, "*.*")
    For i As Integer = 0 To UBound(DelelteFiles)
    FileName = System.IO.Path.GetFileName(DelelteFiles(i))
    IO.File.Delete(TB_Speicherpfad.Text & FileName)
    Next
    MsgBox("gelöscht!", MsgBoxStyle.Information)
    End If
    End If
    mailSent = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim smtpServer As New SmtpClient()
    Dim mail As New MailMessage()
    Dim attachment As Attachment = Nothing
    smtpServer.Credentials = New Net.NetworkCredential(TB_Email.Text, TB_Passwort.Text)
    'using gmail
    smtpServer.Port = 587
    smtpServer.Host = "smtp.gmail.com"
    smtpServer.EnableSsl = True
    mail = New MailMessage()
    AddHandler smtpServer.SendCompleted, AddressOf SendCompletedCallback
    Dim Datei As Object = TB_Speicherpfad.Text
    Dim sPath As String = Datei
    If sPath.EndsWith("\") And sPath.Length > 3 Then
    sPath = sPath.Substring(0, sPath.Length - 1)
    End If
    If System.IO.Directory.Exists(sPath) Then
    Dim sFiles() As String = System.IO.Directory.GetFiles(sPath, "*.*")
    With mail
    .From = New MailAddress(TB_Email.Text)
    .To.Add(TB_Email.Text)
    .Subject = System.Environment.MachineName + " " + "User"
    .Body = "In dieser Mail befinden sich evt. Anlagen."
    Dim sFile As String
    For Each sFile In sFiles
    .Attachments.Add(New Attachment(sFile))
    Next
    End With
    End If
    smtpServer.SendAsync(mail, "")
    Du kannst auf "mail" nicht zugreifen in der Methode "SendCompletedCallback", da du "mail" innerhalb einer Methode deklariert hast. "mail" musst du außerhalb einer Methode deklarieren. Dann geht auch der Zugriff und das Dispose() in der Methode "SendCompletedCallback".

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim mail As MailMessage '<----------- Außerhalb dekalriert
    3. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    4. Dim smtpServer As New SmtpClient()
    5. Dim mail As New MailMessage() '<-------------- Das kann weg
    6. Dim attachment As Attachment = Nothing
    7. smtpServer.Credentials = New Net.NetworkCredential(TB_Email.Text, TB_Passwort.Text)
    8. 'using gmail
    9. smtpServer.Port = 587
    10. smtpServer.Host = "smtp.gmail.com"
    11. smtpServer.EnableSsl = True
    12. mail = New MailMessage '<----------- Innerhalb instanziiert
    13. .......


    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo Jou.
    @vbfrage446 Der Gesamtablauf wäre dann so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim smtpServer As SmtpClient
    3. ' ...
    4. Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    5. smtpServer = New SmtpClient()
    6. '...
    7. smtpServer.SendAsync(mail, "")
    8. End Sub
    9. Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    10. 'Mail gesendet
    11. smtpServer.Dispose()
    12. If e.Error Is Nothing Then
    13. 'Hier die Dateien löschen
    14. End If
    15. End Sub
    16. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!