Serien EMails versenden

  • VB.NET

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

    Serien EMails versenden

    Hallo,

    ich versende Sammel-EMails. Abgesprochen mit dem EMail-Provider.
    Im Beispiel (Quellencode unten) funktioniert es im Normalfall ohne Probleme.
    Nun passiert es aber, dass bei der Übergabe der EMail-Adressen eine Adresse
    übergeben wird, die im smtp.Send(eMailmessage) nicht akzeptiert wird und
    dann der Fehler im Catch ex As Exception aufgefangen wird.
    Eigentlich der richtige Weg. Nur ist es leider so, dass nicht die
    falsche EMail-Adresse angezeigt wird und der ganze Sendevorgang nicht durchgeführt wird.
    Optimal wäre es, wenn die fehlerhafte EMail-Adresse angezeigt wird um diese zu speichern
    und der Sendevorgang dann einfach mit der nächsten EMail-Adresse durchgeführt wird.
    Dazu habe ich leider keine Idee.
    kann mir dazu jemand etwas sagen oder muss ich die EMail's einzeln ohne .Bcc versenden?

    Gruß George

    VB.NET-Quellcode

    1. Imports System.Net.Mail
    2. '------
    3. ...
    4. ...
    5. Private Sub EMailSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EMailsSenden.Click
    6. Dim eMailmessage As New MailMessage
    7. Dim Ausgangsserver As String = '...... wird aus einer DB gelesen
    8. Dim Port As Integer = '...... wird aus einer DB gelesen
    9. Dim EMailAdresse As String = '...... wird aus einer DB gelesen
    10. Dim AngezeigterName As String = '...... wird aus einer DB gelesen
    11. smtp.EnableSsl = '...... wird aus einer DB gelesen
    12. Dim Kennwort As String = '...... wird aus einer DB gelesen
    13. Dim smtp As New System.Net.Mail.SmtpClient(Ausgangsserver, Port)
    14. smtp.Credentials = New System.Net.NetworkCredential(EMailAdresse, Kennwort)
    15. eMailmessage.Subject = TextBetreff.Text
    16. eMailmessage.From = New System.Net.Mail.MailAddress(EMailAdresse, AngezeigterName)
    17. eMailmessage.Bcc.Add(TextAnBcc.Text) 'hier sind einige hunderte eMail-Adressen zusammengefaßt
    18. Try
    19. smtp.Send(eMailmessage)
    20. ' Daten wurden gesendet...
    21. TextAnBcc.Text = ""
    22. Catch ex As Exception
    23. ' Fehler! Daten wurden NICHT gesendet
    24. End Try
    25. smtp = Nothing
    26. End sub


    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Thunderbolt“ ()

    Hallo @George und willkommen im Forum!

    Bitte verwende Codetags um Code einzufügen. (Bitte editiere den thread)

    Ich würde den String in TextAnBcc.Text splitten (wirst ja ein Trennzeichen haben (";"?)) und die Mailadressen in einer Scheleife hinzufügen.
    In dieser kannst du z.b. mittels RegEx Ausdruck schön Adresse für Adresse prüfen ob die Adresse eine gültige Mailadresse ist.
    Ist sie das nicht wir sie auf in eine Variable (List(Of String)) geschrieben um sie später auf eine "Blacklist" setzen zu können, ist diese allerdings gültig wir sie hinzugefügt.

    Vergiss wenn möglich Try/Catch.

    Aber was ich am Code komisch finde: Geht das senden überhaupt - es wird nirgens ein Empfänger angegeben. Nur BCC aber kein .To??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    der String TextAnBcc.text wurde zusammengabaut und jede Adresse ist mit einem Komma
    getrennt. Um die EMail mit einem BCC -Anweisung zu senden ist das so richtig.
    Es geht hier um Serien-EMails in einem Rutsch mit BCC-Adressen (Komma getrennt).
    Das funktioniert auch so. Try/Catch weglassen bedeutet, dass bei einem Fehler ein Programmabbruch
    stattfindet. Zu deiner letzten Frage ob das mit BCC so geht. Jo, geht.
    Leider ist aber damit mein Problem nicht beseitigt. Ich möchte ja nicht jedesmal
    eine EMail nach der anderen eizeln vesenden.
    VG George

    George schrieb:

    Es geht hier um Serien-EMails in einem Rutsch mit BCC-Adressen (Komma getrennt).

    Soweit ist mir das klar.

    George schrieb:

    Das funktioniert auch so. Try/Catch weglassen bedeutet, dass bei einem Fehler ein Programmabbruch
    stattfindet. Zu deiner letzten Frage ob das mit BCC so geht. Jo, geht.
    Leider ist aber damit mein Problem nicht beseitigt.

    Hast du meinen Vorschlag auch korrekt gelesen und versucht umzusetzen?? Ne oder? Wo ist dann der angepasste Code?
    Bevor(!!!) due den String für das BCC zusammensetzt prüft du einfach die Mailadressen. Das sind diese alle korrekt und es KANN KEIN FEHLER mehr geworfen werden wodurch das Try/Catch im Grunde überflüssig wird.
    Du bist also Save.

    PS: und deinen Eingangspost möchtest du nicht bearbeiten!!

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    natürlich habe ich Regex , Pettern erstellt usw. durchgeführt.
    Danach erst den String zuu BCC senden freigegeben.
    Es sind aber z.T. zigTausende E-Mails die verschickt werden.
    Wenn aber eine EMail-Adresse so lautet 'info@onli.de`aber
    lauten sollte info@t-online.de wird das beim senden nicht akzeptiert
    und schon ist eine Fehlermeldung vorhanden. Eine verherige Kontrolle ob
    überhaupt die EMail-Adresse vorliegt würde das ganze in der Aufwedung sprengen.
    Deshalb war meine Frage ob es eine Auffanfroutine beim smtp.Send(eMailmessage) gibt.

    George

    George schrieb:

    Wenn aber eine EMail-Adresse so lautet 'info@onli.de`aber
    lauten sollte info@t-online.de wird das beim senden nicht akzeptiert
    und schon ist eine Fehlermeldung vorhanden.

    Wie jetzt? Und woher soll der SMTP Client das beim versenden wissen?
    Ich hatte auch schon diverse male solch einen code zum automatisierten versenden von rundmails im Einsatz und weis das dies nicht der Fal ist. Es kommen dann lediglich Zustellfehler zurück aber das senden klappt trotzdem.

    Zeig mal den code den du jetzt hast (habe ich oben aber eh schon geschrieben) und wir sehen uns das mal an ob es wirklich daran liegen könnte, was ich wie gesagt nicht glaubem kann/will.
    Vorallem auch die genaue(!!!) Fehlermeldung und ein auszug aus dem Stacktrace wäre auch wichtig.

    Und ein letztes mal: Editiere bitte deinen Eingangspost. (Ignorierst du meine Anmerkungen?)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Da du ja gemerkt hast, dass ich ziemlich neu hier bin,
    ist es nicht einfach alles hier im Forum sofort zu verstehen.
    Werde es aber versuchen.
    Fangen wir damit zunächst mal an.
    "Editiere bitte deine Eingangspost" ??
    Was ist damit gemeint?

    Den Code hatte ich in meiner ersten Frage bereits gegeben.
    An der Prozendur fehlt lediglich unten End Sub.
    Mehr ist da nicht.
    TextBetreff.Text = wird global in diese Prozedur übergeben.

    Ich möchte es gerne wiederholen. Diese Prozedur funktioniert,
    wenn alles in Ordnung ist ohne Probleme.

    Bisher hatte ich den String 'TextBetreff.Text' auf unerlaubten Text
    kontrolliert und vor dem senden u.U. geändert. Das natürlich
    im String 'TextBetreff.Text' vor dem senden.

    Nachdem meiner Meinung, wenn alles OK war blieben zum senden
    noch ca. 2500 - 3000 EMails. Die habe ich natürlich nicht einzeln
    kontrolliert. Alles weggeschickt und den Fehlerhinweis bekommen.
    Die genaue Fehlerausgabe kann ich i.M. nicht sagen. Teste es demnächst.
    War aber kein aussagender Hinweis.
    Natürlich habe ich z.T. einen bestimmtes Kontingent genommen.
    Z.B. die ersten 200 EMails verschickt. Wenn das möglich war
    dann auch mal das nächste Kontingent. Wenn ein Fehler dann vorhanden war,
    bin nach der binären Suchmethode vorgegengen (in obere Hälfte od. untere
    Hälfte gesucht) usw. bis ich die ProblemEmail gefunden hatte.
    Das ist nur zum Test möglich und kann natürlich nicht in dieser Form
    alle schlechten od. falsch eingegeben EMail-Adresse durchsuchen.
    Die Email-Adressen bekomme ich vom Kunden zur weiteren Versendung.

    So das war ein kleiner Überblick über das was ich mache....

    Gruß George
    Hallo Georg

    George schrieb:

    Da du ja gemerkt hast, dass ich ziemlich neu hier bin,
    ist es nicht einfach alles hier im Forum sofort zu verstehen.
    Werde es aber versuchen.
    Fangen wir damit zunächst mal an.
    "Editiere bitte deine Eingangspost" ??
    Was ist damit gemeint?

    OK, wenn du das sagst dann bin ich natürlich gerne behilflich.
    Du hast bei deinem Eingangspost einen Button unten rechts "Bearbeiten". Dort klicken und der Editor öffnet sich wieder. Nun packst du den Code anstatt als Text innerhalb eines Code-Tags indem do in der Menüleiste des Editors auf den Button "VB.Net" klickst. Wenn du dir andere Beiträge ansiehst wird dich nämlich sicherlich auffallen das Code immer schön Formatiert ist und es hier auch Syntaxhighligting gibt was den Code viel besser lesbar für andere macht.

    George schrieb:

    Den Code hatte ich in meiner ersten Frage bereits gegeben.
    An der Prozendur fehlt lediglich unten End Sub.
    Mehr ist da nicht.

    Das meine ich auch nicht. Du sagstest das du es bereits versucht hast mit der prüfung der Mails mittels RegEx und anschliessendem zusammenfügen. Den Code möchte ich sehen!!

    George schrieb:

    Ich möchte es gerne wiederholen. Diese Prozedur funktioniert,
    wenn alles in Ordnung ist ohne Probleme.

    Nein, nicht wirklich. Wenn du hier ein Try/Catch benötigst und die Mail nicht an alle Empfänger geht das funktioniert sie nicht, sonst würdest du hier ja auch keinen Thread aufmachen oder?
    Siehe auch hier: TryCatch ist ein heißes Eisen

    Wie gesagt, ich kann mir nicht vorstellen das eine Mail an skdjfhsjaks@djkfdksdjd.at nicht rausgehen würde, mit Outlook kann ich sie ja auch versenden oder?
    Also hast du wo anders ein Problem. z.b. sowas wie eine Mailadresse welche einfach ungültig ist weil z.b. sjdhflg.at oder skdjf@jdfjdksat
    Da würde es tatsächlich zu einer Exception kommen. Und genau diese gilt es zu Filtern. Und da habe ich dir Hinweise gegeben wie.

    Was anderes ist es nun wenn du meinst das du mit den Hinweisen nicht viel anfängst weil dein wissensstand dies noch nicht zulässt, dann würde ich genau darauf eingehen, aber bis jetzt sehe ich keinen Hinweis in diese Richtung, ich sehe eher eine leichte Beratungsresistenz da du an der Meinung das dein Code so bleiben muss weil er ja funktioniert festhältst. Was er ja nicht tut wie man sieht, sonst gebe es diese Unterhaltung nicht.

    Verstehe mich nicht falsch, klar könnte ich dir hier jetzt einfach einen fertigen Code herklatschen und du bist Happy weil es vieleicht plötzlich funzt. Aber gelernt hast du dann sicher nichts. Und um das geht es ja auch oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    Kompletten Code senden ist nicht möglich.
    Zu komplex, zu groß.
    Deshalb habbe ich ein kleines Beispiel zusammen gesellt.
    Darin kann man sehen wie der gesammelte EMail-String zusammen gestellt wird.
    Schau dir das mal an.

    VB.NET-Quellcode

    1. ...
    2. ...
    3. Dim xyPattern As String = "^([\w-]+\.)*?[\w-]+@[\w-]+\.([\w-]+\.)*?[\w]+$"
    4. For i = 0 To AdressenAnzahl - 1
    5. If Not System.Text.RegularExpressions.Regex.IsMatch(EAdressen(i).ToString.Trim, xyPattern Then
    6. ' Syntax ist falsch
    7. ' hier wäre die Auffangroutine, wenn fehlerhafte EMail-Adressen gefunden wurden
    8. Else
    9. eMailString = eMailString & EAdressen(i).ToString & ","
    10. End If
    11. Next i
    12. ...
    13. ...
    14. ' das letzt Komma wird nur noch gelöscht
    15. ' der hier genannte String 'eMailString' ist der BCC-String


    Code-Tags eingefügt. ~Thunderbolt

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