Unfreiwillige mehrfache Ausführung einer Sub

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von razzzer530i.

    Unfreiwillige mehrfache Ausführung einer Sub

    Hallo Leute,

    habe gerade mal ganz fix was kleines geschrieben(Sorry wenn es nicht wirklich ordentlich geschrieben ist)

    Habe hier ein kleines Programm was eine Email an mehrere Empfänger sendet, die ich in einer Textdatei zeilenweise gespeichert habe.
    An sich funktioniert das Programm so wie ich es gerade benötige, nur passiert folgendes:

    Die TXT-Datei die die Empfänger enthält hat eine Zeile.
    Die Email wird an die Adresse die in der ersten Zeile steht gesendet. Perfekt

    Jetzt aber:

    Ich habe 2 Zeilen:
    email1@gmx.de
    email2@gmx.de

    Jetzt sende ich an beide email Adressen 2 mal die mail.

    enthält sie 3 Zeilen:
    email@gmx.de
    email2@gmx.de
    email3@gmx.de

    so sende ich die email 3 mal an jede email. Woran liegt das? Was übersehe ich? Hoffentlich kann mir jemand helfen.

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Imports System
    3. Imports System.IO
    4. Imports System.Collections
    5. Public Class Form1
    6. Public MAweiterleiten As String
    7. Public Nachricht As String
    8. Public Benutzer As String
    9. Public Textsend As String
    10. Public smail As String
    11. Public pathx As String
    12. Public AbsenderdN As String
    13. Public Betreff As String
    14. Public ackersendenan As String
    15. Public pwgeholt As String
    16. Public prgval As Integer
    17. Public Anhangpfad As String
    18. Public Emailantwort As New MailMessage
    19. Public empfaengerpfad As String
    20. Public nachrichtpfad As String
    21. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    22. Benutzer = "Sender@gmx.de" 'Benutzername erfassen
    23. Me.Text = "Mails senden" 'In Windowframe Benutzername anzeigen
    24. smail = Benutzer 'PW des Benutzers finden
    25. pathx = "Dateipfad"
    26. Textsend = Nachricht
    27. Dim Pat As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "C:\Users\Desktop\NT.txt")
    28. prgval = CStr(System.IO.File.ReadAllLines(Pat).Count)
    29. ProgressBar1.Maximum = prgval
    30. ProgressBar1.Value = 0
    31. End Sub
    32. Public Sub Mailsenden()
    33. Dim SmtP As New SmtpClient("client.client.com")
    34. Emailantwort.From = New MailAddress(Benutzer)
    35. Emailantwort.To.Add(ackersendenan) 'Empfänger angeben
    36. Emailantwort.Subject = TextBox1.Text 'Betreff
    37. Emailantwort.Body = (Nachricht)
    38. Emailantwort.IsBodyHtml = True
    39. SmtP.Port = Port 'SMTP Port setzen
    40. SmtP.EnableSsl = False 'SSL Verschlüsselung
    41. SmtP.Credentials = New System.Net.NetworkCredential(Benutzer, "pw") 'Logins
    42. SmtP.Send(Emailantwort)
    43. MsgBox("Gesendet an:" & ackersendenan)
    44. Exit Sub
    45. End Sub
    46. Public Sub empfaengereinlesen()
    47. Dim pfad As String = empfaengerpfad
    48. Try
    49. For Each line In IO.File.ReadLines(pfad)
    50. ackersendenan = line
    51. Debug.Print(line)
    52. ProgressBar1.Value = ProgressBar1.Value + 1
    53. Mailsenden()
    54. Next
    55. Catch ex As Exception
    56. MsgBox("Bitte Empfänger auswählen")
    57. End Try
    58. Exit Sub
    59. End Sub
    60. Public Shadows Function Right(ByVal sText As String, ByVal nLen As Integer) As String 'Right-Function aus VBA nachbauen
    61. If nLen > sText.Length Then nLen = sText.Length
    62. Return (sText.Substring(sText.Length - nLen))
    63. End Function
    64. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    65. Form2.Show()
    66. Try
    67. Form2.RichTextBox1.Text = My.Computer.FileSystem.ReadAllText(empfaengerpfad, System.Text.Encoding.Default)
    68. Catch
    69. MsgBox("Keine Empfängerliste ausgewählt")
    70. End Try
    71. End Sub
    72. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    73. empfaengereinlesen()
    74. End Sub
    75. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    76. OpenFileDialog1.ShowDialog()
    77. Anhangpfad = OpenFileDialog1.FileName
    78. Try
    79. Emailantwort.Attachments.Add((New System.Net.Mail.Attachment(Anhangpfad)))
    80. Catch
    81. Label1.Text = "(Keinen Anhang gewählt)"
    82. End Try
    83. End Sub
    84. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    85. OpenFileDialog2.ShowDialog()
    86. Try
    87. empfaengerpfad = OpenFileDialog2.FileName
    88. Catch
    89. MsgBox("Keine Empfängerdatei ausgewählt")
    90. End Try
    91. End Sub
    92. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    93. OpenFileDialog3.ShowDialog()
    94. Try
    95. nachrichtpfad = OpenFileDialog3.FileName
    96. Nachricht = My.Computer.FileSystem.ReadAllText(nachrichtpfad, System.Text.Encoding.Default)
    97. Catch
    98. MsgBox("Keine Nachricht ausgewählt")
    99. End Try
    100. End Sub
    101. Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
    102. End Sub
    103. End Class

    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    Hast Du Option Strict On?
    prgval = CStr(System.IO.File.ReadAllLines(Pat).Count)
    prgval ist vom Typ Integer, du weist aber einen String zu. Warum die Konvertierung zu String, wenn .Count bereits ein Integer ist?
    Und warum verwendest Du fast nur globale Variablen? prgval wird nur in den zwei Zeilen benötigt.
    Eventuell solltest Du Dir auch das durchlesen:
    Visual Studio - Empfohlene Einstellungen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ehrlich gesagt habe ich die Variablen vorher in einem anderen Programm verwendet wo ich sie global brauchte und war gerade zu faul alles neu zu schreiben.
    option strict war aus. Jetzt ist es an.
    ich verwende aber prgval doch nur für die Anzahl der Zeilen in der Datei welche ich für die Progressbar verwende.

    Hat das überhaupt was mit meinem Problem zutun?
    Könnte ich auch verändert ist wirklich sinnfrei.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Hat das überhaupt was mit meinem Problem zutun?

    Bedingt.
    Du hast da 'nen ziemlichen Spaghetticode. Wenn der Code schöner ist, ist es auch einfacher, ihn zu verstehen. Vielleicht findest Du dann sogar selbst heraus, was das Problem ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Völlig wahr...
    Naja ich steige komplett durch und selbst wenn ich Schritt für Schritt mit dem Debugger durchgehe dann macht er die Steps so wie er soll, auch alle Variablen haben den Wert den sie haben sollen.

    Er macht diesen Sendelauf in meinem Beispiel jetzt 3 mal für jede Mail 1 mail, sendet aber für jede mal 3 mal und da verstehe ich einfach nicht woher das kommt.

    war auf die Schnelle geschrieben und wichtig jetzt sitze ich hier und habe den Salat :x
    Vielleicht ne Idee oder einen Tipp?

    Ich meine ich sende ja for each line also für Jede Zeile eine Mail raus mit dem Empfänger der in der Zeile steht.
    ??Mein Hirn stirbt langsam ab
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i Setze in die Prozedur einen Haltepunkt und steppe das Programm zeilenweise durch, verstehe, was Dein Programm tatsächlich tut.
    Kläre auf, woher die multiplen Aufrufe kommen.
    Lerne, Dein Programm zu debuggen, zu entrümpeln und von Fehlern zu befreien.
    Gugst Du hier.
    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!
    Ich habe das gesamte Programm mehrmals Zeilenweise ausgeführt und verfolgt. mir Inhalte der Variablen ausgeben lassen. Und dennoch finde ich nicht heraus wieso mehrfach gesendet wird...

    Habe vielleicht eine Idee. Kann es sein, dass

    VB.NET-Quellcode

    1. Dim pfad As String = empfaengerpfad
    2. Try
    3. For Each line In IO.File.ReadLines(pfad)
    4. ackersendenan = line
    5. Debug.Print(line)
    6. 'ProgressBar1.Value = ProgressBar1.Value + 1
    7. Mailsenden()
    8. Next
    9. Catch ex As Exception
    10. MsgBox("Bitte Empfänger auswählen")
    11. End Try
    12. Exit Sub

    Zwar meine Variable ackersendenan füllt aber gleichzeit pro Zeile die Mail sendet?
    Also:

    Sende Mail an Zeile 1
    Sende Mail an Zeile 1, Sende mail an Zeile 2
    Sende Mail an Zeile 1, Sende Mail an Zeile 2, Sende Mail an Zeile 3

    Verstehe ich das vielleicht richtig? Der Debugger gibt nichts falsches aus.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    razzzer530i schrieb:

    mir Inhalte der Variablen ausgeben lassen
    Offensichtlich nicht. ;(


    Das sollte eigentlich genügen. ;)
    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!
    Lächerlich. Habe keine Entschuldigung dafür wie ich das übersehen konnte.

    Aber jetzt geht es so wie ich das will mit :

    VB.NET-Quellcode

    1. Dim SmtP As New SmtpClient("mail.mail.com")
    2. Emailantwort.From = New MailAddress(Benutzer)
    3. Emailantwort.To.Clear()
    4. Emailantwort.To.Add(ackersendenan)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~