E-mailversand mit Progressbar

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    E-mailversand mit Progressbar

    Hallo! Mit folgendem Code versende ich eine E-mail mit Anhang) :

    VB.NET-Quellcode

    1. Using M As New MailMessage()
    2. With M
    3. .From = New MailAddress(tbAbsender.Text)
    4. .Subject = tbBetreff.Text
    5. .To.Add(tbEmpfaengerAdresse.Text)
    6. .Body = tbnachricht.Text
    7. ' Alle ausgewählten Anhänge mitschicken
    8. For Each Fi As FileInfo In liAnhaenge.Items
    9. .Attachments.Add(New Attachment(Fi.FullName))
    10. Next
    11. End With
    12. Dim MailServer As New SmtpClient(Host)
    13. With MailServer
    14. .Credentials = New NetworkCredential(UserName, Pw)
    15. .Send(M)
    16. End With


    Funktioniert tadellos - nur ist der Anhang etwas größer dauert natürlich der Versand dementsprechend - da wäre es nicht schlecht eine Progressbar einzubauen damit der Anwender sieht das sich was tut.

    Nun leider habe ich null Ahnung wie ich das bewerkstellige! Ich bitte inständig um eure Hilfe
    @vierkant:: Täusche einfach Geschäftigkeit vor. Nimm eine Progressbar und gib ihr den Style = Marquee.
    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!
    Ja ok! Also dann brauch noch einen Timer vermute ich, der jeden Tick der Progressbar einen

    VB.NET-Quellcode

    1. Progressbar1.value +1
    gibt. Und wie sage ich der Progressbar wann Schluss ist bzw. wann die Mail erfolgreich draußen ist?


    Vergiss es! Hab es schon verstanden!!! Sorry Danke für die Hilfe

    vierkant schrieb:

    vermute ich
    Nein.
    Probier es bitte erst mal aus, sieh, was passiert, dann schreib Deine Meinung.
    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!
    Gefällt mir gut! Nur jetzt hab ich ein anderes Problem:

    die Progressbar hab ich auf visible=false gesetzt, bevor der mailversand beginnt wird sie auf true gesetzt. Nur Leider tut er das nicht. Hier mal mein ganzer "E-mail senden" Code:

    VB.NET-Quellcode

    1. Private Sub bnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnSenden.Click
    2. tbEmpfaengerAdresse.BackColor = Color.White
    3. tbAbsender.BackColor = Color.White
    4. If My.Settings.host = Nothing Then
    5. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    6. Form3.Show()
    7. Form3.TabControl1.SelectedTab = Form3.TabPage7
    8. End If
    9. Else
    10. If My.Settings.mailbenutzer = Nothing Then
    11. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    12. Form3.Show()
    13. Form3.TabControl1.SelectedTab = Form3.TabPage7
    14. End If
    15. Else
    16. If My.Settings.mailpass = Nothing Then
    17. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    18. Form3.Show()
    19. Form3.TabControl1.SelectedTab = Form3.TabPage7
    20. End If
    21. Else
    22. If tbAbsender.Text = Nothing Then
    23. MsgBox("Sie müssen eine Absenderadresse eingeben")
    24. tbAbsender.BackColor = Color.Red
    25. Else
    26. If tbEmpfaengerAdresse.Text = Nothing Then
    27. MsgBox("Sie haben keine Empfänger angegeben")
    28. tbEmpfaengerAdresse.BackColor = Color.Red
    29. Else
    30. Try
    31. ProgressBar1.Visible = True
    32. bnSenden.Enabled = False
    33. bnSenden.Text = "es wird gesendet"
    34. Using M As New MailMessage()
    35. With M
    36. .From = New MailAddress(tbAbsender.Text)
    37. .Subject = tbBetreff.Text
    38. .To.Add(tbEmpfaengerAdresse.Text)
    39. .Body = tbnachricht.Text
    40. ' Alle ausgewählten Anhänge mitschicken
    41. For Each Fi As FileInfo In liAnhaenge.Items
    42. .Attachments.Add(New Attachment(Fi.FullName))
    43. Next
    44. End With
    45. Dim MailServer As New SmtpClient(Host)
    46. Try
    47. With MailServer
    48. .Credentials = New NetworkCredential(UserName, Pw)
    49. .Send(M)
    50. End With
    51. Me.Close()
    52. MsgBox("Mail wurde verschickt")
    53. Catch Ex As SystemException
    54. MsgBox("Error: " & Ex.Message)
    55. End Try
    56. End Using
    57. Catch Ex As SystemException
    58. MsgBox("Error: " & Ex.Message)
    59. End Try
    60. End If
    61. End If
    62. End If
    63. End If
    64. End If
    65. End Sub



    Der gerammte Code arbeitet wie er soll mit Ausnahme folgender Passage:

    VB.NET-Quellcode

    1. ProgressBar1.Visible = True
    2. bnSenden.Enabled = False
    3. bnSenden.Text = "es wird gesendet"

    Von dieser Passage wird lediglich bnSenden.Enabled = False erledigt.
    gebe ich auf der selben Passage zum Beispiel

    VB.NET-Quellcode

    1. msgbox("Test")
    ein, macht auch die msgbox auf!

    Was läuft den da schief, verstehe ich gar nicht

    vierkant schrieb:

    Nur Leider tut er das nicht.
    Machst Du

    VB.NET-Quellcode

    1. Me.ProgressBar1.Update()
    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!

    vierkant schrieb:

    Nur leider mein Problem löst es nicht
    Das hier:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Me.ProgressBar1.Update()
    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!
    Dann pack das Versenden in einen separaten Thread / BackgroundWorker.
    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!

    vierkant schrieb:

    Um Gottes Willen
    Der Herr hilft Dir dabei nicht, das musst Du allein tun.
    Fang mit einem BackgroundWorker aus dem Designer an.
    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!
    So hab nun einen Backgroundworker auf meine Form gezogen.

    Dem Button "senden" auf der Form hab ich folgendes angeschafft:

    VB.NET-Quellcode

    1. BackgroundWorker1.RunWorkerAsync()


    ok anschließend mit doppelklick auf Backgroundworker1 und folgenden Code eingetippt:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Try
    3. Using M As New MailMessage()
    4. With M
    5. .From = New MailAddress(tbAbsender.Text)
    6. .Subject = tbBetreff.Text
    7. .To.Add(tbEmpfaengerAdresse.Text)
    8. .Body = tbnachricht.Text
    9. ' Alle ausgewählten Anhänge mitschicken
    10. For Each Fi As FileInfo In liAnhaenge.Items
    11. .Attachments.Add(New Attachment(Fi.FullName))
    12. Next
    13. End With
    14. Dim MailServer As New SmtpClient(Host)
    15. Try
    16. With MailServer
    17. .Credentials = New NetworkCredential(UserName, Pw)
    18. .Send(M)
    19. End With
    20. Me.Close()
    21. MsgBox("Mail wurde verschickt")
    22. Catch Ex As SystemException
    23. MsgBox("Error: " & Ex.Message)
    24. End Try
    25. End Using
    26. Catch Ex As SystemException
    27. MsgBox("Error: " & Ex.Message)
    28. End Try
    29. End Sub


    Führe ich das ganze aus kommt folgende Meldung:


    Hääää? Hier mal ein Code von meiner Form - vielleicht hat es damit was zu tun?

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Xml.Serialization
    5. Public Class Form12
    6. Private Host As String = My.Settings.host
    7. Private UserName As String = My.Settings.mailbenutzer
    8. Private Pw As String = My.Settings.mailpass
    Aloa,

    du versuchst vom Background Worker aus auf ein Element der Form zuzugreifen (ne Listbox?!) usw...
    Das ist erstmal so nicht erlaubt und deshalb schmeißt er die Fehlermeldung.
    Schau mal bisl nach dem Zauberwort Invoke und überlege ob es wirklich nötig ist, auf die GUI zuzugreifen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    vierkant schrieb:

    Hääää?
    Du sollst Emils versenden im BGW, nicht aber Controls verändern.

    VB.NET-Quellcode

    1. Me.Invoke(Sub() TextBox1.Text = "Bla")
    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!
    Ok hab das mal so geändert:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Try
    3. Using M As New MailMessage()
    4. With M
    5. .From = New MailAddress(tbAbsender.Text)
    6. Me.Invoke(Sub() .Subject = tbBetreff.Text)
    7. Me.Invoke(Sub() .To.Add(tbEmpfaengerAdresse.Text))
    8. Me.Invoke(Sub() .Body = tbnachricht.Text)
    9. ' Alle ausgewählten Anhänge mitschicken
    10. For Each Fi As FileInfo In liAnhaenge.Items
    11. Me.Invoke(Sub() .Attachments.Add(New Attachment(Fi.FullName)))
    12. Next
    13. End With
    14. Dim MailServer As New SmtpClient(Host)
    15. With MailServer
    16. Me.Invoke(Sub() .Credentials = New NetworkCredential(UserName, Pw))
    17. Me.Invoke(Sub() .Send(M))
    18. End With
    19. Me.Invoke(Sub() Me.Close())
    20. MsgBox("Mail wurde verschickt")
    21. End Using
    22. Catch Ex As SystemException
    23. MsgBox("Error: " & Ex.Message)
    24. End Try
    25. End Sub


    der mail Versand funktioniert jetzt wieder. die Progressbar wird angezeigt aber es friert wieder alles im Zeitraum des Versendens ein und somit Arbeitet auch die Processbar leider nicht (marquee)
    Wenn du Invoke verwendest solltest du auch besser wissen was es macht :)

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Me.Invoke(Sub()
    3. 'z.B Auf sämtliche Controls zugreifen ...
    4. End Sub)
    5. End Sub

    Du musst es nicht in jeder Zeile neu benutzen.
    msdn.microsoft.com/de-de/libra…ws.forms.form.invoke.aspx
    ok danke, gut zu wissen - dachte mir schon das , das sehr umständlich ist! Aber die Procressbar läuft noch immer nicht!

    Während dem die mail gesendet wird friert das gesamte Programm ein - sobald die mail drausen ist läuft wieder alles - daher wird auch die Progressbar nicht laufen.

    Ich hab mal den Code meiner gesamten Form hier - vielleicht seit ihr so nett und schaut ihn durch, eventuell findet ja jemand den Grund warum das Programm einfriert.

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. Imports System.Net
    3. Imports System.IO
    4. Public Class Form12
    5. Private Host As String = My.Settings.host
    6. Private UserName As String = My.Settings.mailbenutzer
    7. Private Pw As String = My.Settings.mailpass
    8. Private Sub bnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bnSenden.Click
    9. tbEmpfaengerAdresse.BackColor = Color.White
    10. tbAbsender.BackColor = Color.White
    11. If My.Settings.host = Nothing Then
    12. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    13. Form3.Show()
    14. Form3.TabControl1.SelectedTab = Form3.TabPage7
    15. End If
    16. Else
    17. If My.Settings.mailbenutzer = Nothing Then
    18. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    19. Form3.Show()
    20. Form3.TabControl1.SelectedTab = Form3.TabPage7
    21. End If
    22. Else
    23. If My.Settings.mailpass = Nothing Then
    24. If MsgBox("Sie müssen vorher die mail Einstellungen konfigurieren, wollen sie das jetzt tun?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
    25. Form3.Show()
    26. Form3.TabControl1.SelectedTab = Form3.TabPage7
    27. End If
    28. Else
    29. If tbAbsender.Text = Nothing Then
    30. MsgBox("Sie müssen eine Absenderadresse eingeben")
    31. tbAbsender.BackColor = Color.Red
    32. Else
    33. If tbEmpfaengerAdresse.Text = Nothing Then
    34. MsgBox("Sie haben keine Empfänger angegeben")
    35. tbEmpfaengerAdresse.BackColor = Color.Red
    36. Else
    37. bnSenden.Text = " sende..."
    38. ProgressBar1.Visible = True
    39. bnSenden.Enabled = False
    40. BackgroundWorker1.RunWorkerAsync()
    41. End If
    42. End If
    43. End If
    44. End If
    45. End If
    46. End Sub
    47. Private Sub bnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    48. For n As Short = 0 To liAnhaenge.SelectedItems.Count - 1
    49. liAnhaenge.Items.RemoveAt(liAnhaenge.SelectedIndices(0))
    50. Next
    51. End Sub
    52. Private Sub Form12_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    53. Dim bFileExists As Boolean
    54. If Not bFileExists = File.Exists(Path.GetDirectoryName(Application.ExecutablePath) & "\Daten\Überprüfungen\Überprüfungen.xml") Then Button1.Visible = True
    55. End Sub
    56. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    57. End Sub
    58. Private Sub liAnhaenge_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles liAnhaenge.SelectedIndexChanged
    59. End Sub
    60. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs)
    61. End Sub
    62. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    63. End Sub
    64. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    65. liAnhaenge.Items.Add(New FileInfo(Path.GetDirectoryName(Application.ExecutablePath) & "\Daten\Überprüfungen\Überprüfungen.xml"))
    66. ListBox1.Items.Add("Überprüfungen.xml")
    67. Button1.Enabled = False
    68. End Sub
    69. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    70. Me.Invoke(Sub()
    71. Try
    72. Using M As New MailMessage()
    73. With M
    74. .From = New MailAddress(tbAbsender.Text)
    75. .Subject = tbBetreff.Text
    76. .To.Add(tbEmpfaengerAdresse.Text)
    77. .Body = tbnachricht.Text
    78. ' Alle ausgewählten Anhänge mitschicken
    79. For Each Fi As FileInfo In liAnhaenge.Items
    80. .Attachments.Add(New Attachment(Fi.FullName))
    81. Next
    82. End With
    83. Dim MailServer As New SmtpClient(Host)
    84. With MailServer
    85. .Credentials = New NetworkCredential(UserName, Pw)
    86. .Send(M)
    87. End With
    88. Me.Close()
    89. MsgBox("Mail wurde verschickt")
    90. End Using
    91. Catch Ex As SystemException
    92. MsgBox("Error: " & Ex.Message)
    93. End Try
    94. End Sub)
    95. End Sub
    96. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vierkant“ ()