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.

    @mrMo Jou.
    Ich hab das ganze nicht getestet, aber ich würde in jedem Falle beide Objekte disposen, dann ist nach dem Senden gesichert der Ausgangszustand hergestellt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim smtpServer As SmtpClient
    3. Dim mail As MailMessage
    4. ' ...
    5. Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    6. smtpServer = New SmtpClient()
    7. mail = New MailMessage()
    8. '...
    9. smtpServer.SendAsync(mail, "")
    10. End Sub
    11. Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    12. 'Mail gesendet
    13. smtpServer.Dispose()
    14. mail.Dispose()
    15. If e.Error Is Nothing Then
    16. 'Hier die Dateien löschen
    17. End If
    18. End Sub
    19. 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!
    Das klappt bei mir nicht. Wenn ich:

    Public Class Form1
    Dim smtpServer As SmtpClient
    Dim mail As MailMessage

    dieses usw. ins Public Class Form1 packe, kommt immer ein grüner kringel unter smtpServer und mail. Wenn ich es unter:

    Private Sub SendCompletedCallback
    schreibe, kommt auch eine Fehlermeldung, aber nur wenn ich es ohne New schreibe.
    Und alleine nur: smtpServer.Dispose()
    mail.Dispose() geht auch nicht.
    Ich weiß nicht was ich verkehrt mache. Oder liegt das vielleicht an den Imports?

    Bin am überlegen , ob ich mail.Dispose() unten drunter beim button schreibe ohne SendCompletedCallback und danach mit Therading.Thread.Sleep(1500) das Programm stoppe und zum schluß dann den lösch Vorgang schreibe. Das funktioniert.

    Aber ich bin eig. so nah dran mit SendCompletedCallback weiß nur net was ich falsch mache. Wisst ihr was noch fehlt oder was Verkehrt an mein code ist ?

    vbfrage446 schrieb:

    kommt immer ein grüner kringel unter smtpServer und mail.
    HOver mal die Maus drüber, was steht da?
    Probier mal

    VB.NET-Quellcode

    1. Dim smtpServer As SmtpClient = Nothing
    2. Dim mail As MailMessage = Nothing

    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!
    Die grün gestrichelte Linie kommt wohl daher, das die Variablen noch nicht instanziiert sind. Haste mal das Programm gestartet und ausprobiert, trotz der grünen Linie?
    "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
    Ja. Habe das Programm mit dem code gestartet:
    Private Shared Sub SendCompletedCallback...
    Dim smtpServer As SmtpClient = Nothing
    Dim mail As MailMessage = Nothing
    If e.Error Is Nothing Then
    smtpServer. Dispose()
    mail.Dispose()

    Dann kommt Fehlermeldung bei smtpServer.Dispose() und mail.Dispose():
    Der Objektverweis wurde nicht auf eine Objekt Instanz festgelegt
    Dazu nur kurz der Einwurf, bevor mrMo und RfG mit den wichtigen Sachen weitermachen. .Dispose() kann nur auf existierende Objekte angewandt werden. Wenn smtpServer und mail noch Nothing sind, dann kommt eine Fehlermeldung. weil man mit einem "Nichts" nicht viel machen kann.
    Daher schreib statt

    VB.NET-Quellcode

    1. If e.Error Is Nothing Then
    2. smtpServer. Dispose()
    3. mail.Dispose()

    mal zwei zusätzliche Abfragen rein:

    VB.NET-Quellcode

    1. If e.Error Is Nothing Then
    2. If Not smtpServer Is Nothing Then smtpServer.Dispose()
    3. If Not mail Is Nothing Then mail.Dispose()


    btw: grüne Unterwellen sind Warnungen/Hinweise => das Programm läuft auch dann, wenn die Warnungen nicht behoben wurden.
    Trotzdem müssen smtpServer und mail außerhab einer Sub bekannt gegeben werden. Variablen sind quasi immer nur dort bekannt, wo sie bekannt gegeben werden. Steht also Dim smtpServer in der Sub xyz, dann ist smtpServer auch nur in jener Sub sichtbar und bekannt, andere Bereiche können mit dem Wort smtpServer dann nix anfangen => Dim smtpServer As SmtpClient = Nothing und
    Dim mail As MailMessage = Nothing gehören fast ganz oben hin, quasi gleich in die ersten Zeilen nach Public Class Form1, damit die beiden im ganzen Bereich von Form1 bekannt sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    vbfrage446 schrieb:

    VB.NET-Quellcode

    1. Private Shared Sub SendCompletedCallback...
    2. Dim smtpServer As SmtpClient = Nothing
    3. Dim mail As MailMessage = Nothing

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim smtpServer As SmtpClient
    2. Dim mail As MailMessage
    3. ' ...
    4. Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    Bist Du eventuell beratungsresistent?
    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!
    @VaporiZed die Prüfung auf Nothing an dieser Stelle macht keinen Sinn. Sollte mail oder smtp nothing sein kommt der code gar nicht an diese stelle sondern raucht vorher ab

    @vbfrage446 jetzt mal ohne spaß, wenn es dir mangels Wissen nicht möglich ist, den hier geposteten Code sauber, an der richtigem Stelle in deinen Code einzufügen, dann vertage bitte dein Projekt und erlerne zunächst die Basics.

    Das Schema von @RodFromGermany ist so korrekt. Jetzt liegt es an dir dieses in deinen Code zu bekommen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim smtpServer As SmtpClient
    3. Dim mail As MailMessage
    4. ' ...
    5. Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    6. smtpServer = New SmtpClient()
    7. mail = New MailMessage()
    8. '...
    9. smtpServer.SendAsync(mail, "")
    10. End Sub
    11. Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    12. 'Mail gesendet
    13. smtpServer.Dispose()
    14. mail.Dispose()
    15. If e.Error Is Nothing Then
    16. 'Hier die Dateien löschen
    17. End If
    18. End Sub
    19. 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
    @mrMo: Das mag sein, aber dann frag ich mich, wie der TE in seinem Post zu seiner Exception kommt. Oder besser gefragt: An welcher Stelle. Die Ex taucht dann wohl sehr wahrscheinlich nicht erst im Code aus demselbigen Post auf.
    OK, ich geb's zu, ich hatte mir die anderen Posts nicht vollständig durchgelesen, es brannte mir nur kurz unter den Fingern, beim Thema Variablen-Sichtbarkeit den Erklärbär zu spielen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Genau so habe ich es gemacht:

    Public Class Form1
    Dim smtpServer As SmtpClient
    Dim mail As MailMessage
    ' ...

    Private Sub cmd_senden_Click(sender As Object, e As EventArgs) Handles cmd_senden.Click
    smtpServer = New SmtpClient()
    mail = New MailMessage()
    '...
    smtpServer.SendAsync(mail, "")
    End Sub
    Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    'Mail gesendet
    smtpServer.Dispose()
    mail.Dispose()
    If e.Error Is Nothing Then
    'Hier die Dateien löschen
    End If
    End Sub
    End Cla

    Dann kommt ein in blau unterstricheltes smtpServer und mail. Mit der Fehler Meldung:
    Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.
    Mach mal nen Screenshot von deinem Code und lade ihn hier hoch. Welche .Net Framework Version nutzt du?
    "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
    Mach das Shared weg, so das dort nur noch das steht.

    Private Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)


    P.S. Hab ichs mir doch gedacht: Wäre schön gewesen, wenn du vorher deinen echten Code gepostet hättest. Weil da steht das shared nicht drin.
    "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

    vbfrage446 schrieb:

    Hätte ich es geschrieben wie es stand hätte ich die Lösung schon eher. Danke


    Diese Erkenntnis bitte beim nächsten mal beachten. Wie sollen wir dir helfen, wenn du irgend einen gekürzten Code verbreitest der nicht dem aktuellen Stand deines "echten" Codes entspricht.
    "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