Datum aus Email

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

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Datum aus Email

    Hallo

    Ich habe ein Problem mit der Formatierung von Datum / Uhrzeit welche aus der mail gelesen werden. Habe nun etliche Formatierungen durchgespielt, bei einigen Mails bekommt ich immer diesen Fehler: "Ungültige konvertierung... siehe Bild. "
    Ich möchte einfach nur das Datum angezeigt bekommen.

    VB.NET-Quellcode

    1. Private Sub ShowPreview()
    2. Me.BeginInvoke(Sub() Lbl_Countmails.Text = "Anzahl der Emails: " & CountEmails)
    3. ListofEmails.Reverse()
    4. For Each Mail In ListofEmails
    5. Dim Maildate As DateTime = CDate(Mail.sGetdate)
    6. Me.BeginInvoke(Sub() DGV_Mails.Rows.Add(Mail.sSender, Mail.sSubject, Maildate))
    7. Next
    8. End Sub
    Bilder
    • Fehlerdattime-1.jpg

      47,49 kB, 489×169, 89 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Poste mal den Original-String.
    Du kannst mit DateTime.TryParse() genau angeben, welche Werte wo stehen:
    docs.microsoft.com/de-de/dotne…ime.tryparse?view=net-6.0
    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!
    Hallo
    Genau mit dem "TryParse" habe ich gearbeitet bevor ich den im obrigen Code verwendenten teil benutz habe.

    So ist der Code zum abrufen der mails.

    VB.NET-Quellcode

    1. Private Sub GetEmails()
    2. Try
    3. Dim pop As New Pop3Client
    4. pop.Connect("pop.mail.yahoo.com", CInt("995"), True)
    5. pop.Authenticate("xxxxxxxxx", "xxxxxxxxx")
    6. CountEmails = pop.GetMessageCount
    7. For mail As Integer = 1 To CountEmails
    8. ListofEmails.Add(New EMail With {
    9. .sSubject = pop.GetMessage(mail).ToMailMessage.Subject,
    10. .sSender = pop.GetMessage(mail).ToMailMessage.From.ToString,
    11. .sText = pop.GetMessage(mail).ToMailMessage.Body,
    12. .sGetdate = pop.GetMessage(mail).Headers.Date})
    13. Next
    14. ShowPreview()
    15. Catch ex As Exception
    16. MessageBox.Show(ex.Message)
    17. End Try
    18. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie

    RodFromGermany schrieb:

    Poste mal den Original-String.
    Kopiere das Stück String, das das gesuchte Datum enthält, also genau das, was Dich interessiert, in Deinen Antwort-Post, also so etwa:
    "Sa 09.07.2022 11:27"
    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!
    Also das schaut so aus: Sat,9 Jul 2022 09:19:07+0000 (GMT)

    Mir würde es reichen: ​09.07.2022
    Bilder
    • Fehlerdattime-2.jpg

      106,44 kB, 700×251, 86 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Moin,

    das Format wird spezifiziert in RFC 5322, Abschnitt 3.3. Danach ergibt sich ein Format-String ddd',' d MMM yyyy HH':'mm':'ss zzzz, z. B. für die Verwendung mit der DateTime.TryParseExact-Methode. Es gibt allerdings noch die (veraltete) Möglichkeit, Zeitzonen namentlich anzugeben. Das auch noch einzupflegen, ist dann noch etwas zusätzliche Fleißarbeit.

    Alternative: Wenn du ein Email-Datum verarbeiten möchtest, sind andere Email-Dinge auch nicht weit weg. Möglicherweise lohnt es sich, eine Library einzubinden, z. B. MimeKit. Dessen DateUtils.TryParse-Methode bietet genau das an. Wenn du das aber sowieso schon benutzt, kannst du darüber auch die Nachrichten an sich verarbeiten, und die MimeMessage.Date-Eigenschaft verwenden.
    Mit freundlichen Grüßen,
    Thunderbolt
    @Thunderbolt
    ​ DateTime.TryParseExact-Methode
    Genau damit hatte ich es versucht, bin aber leider nicht ans Ziel gekommen, weswegen ich diesen Threat hier eröffnet habe. ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Also mit der Angabe aus Post#1 und Post#6 komm ich zum Ergebnis.

    VB.NET-Quellcode

    1. Dim DateValue As Date
    2. Date.TryParseExact("Sat,9 Jul 2022 09:19:07 +0000", "ddd,d MMM yyyy HH:mm:ss zzzz", New CultureInfo("en-US"), Globalization.DateTimeStyles.None, DateValue)
    3. Dim ShortDateText = DateValue.ToShortDateString
    Bilder
    • Date.png

      13,14 kB, 1.122×101, 81 mal angesehen
    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.
    @VaporiZed
    So ähnlich hatte ich das auch mal ging nicht.
    Jetzt bekomme ich nur ... siehe Bild
    Wo habe ich denn den Denkfehler?
    Bilder
    • FehlerMail-1.jpg

      353,39 kB, 1.191×572, 72 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    In Post#1 steht nix von (GMT)
    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.
    @Amelie Mach Dir ein kleines separates Testprogrann, in dem Du genau dieses Parsen untersuchst.
    Das kannst Du für jedes einzelne Problem machen, immer in derselben Projektmappe.
    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!
    Eine unsaubere, aber funktionierende Methode wäre, ein Leerzeichen vor dem +0000 einzufügen und das (GMT) einfach vorher rauszulöschen:

    VB.NET-Quellcode

    1. Date.TryParseExact("Sat,9 Jul 2022 09:19:07+0000 (GMT)".Replace("+0000 (GMT)", " +0000"), "ddd,d MMM yyyy HH:mm:ss zzzz", New CultureInfo("en-US"), Globalization.DateTimeStyles.None, DateValue)

    Da stellt sich mir aber die Frage, wie Du überhaupt zu diesem komischen DateTimeString in Deinen Datensätzen kommst. Da scheint ja wohl bei pop.GetMessage(mail).Headers.Date Murks zu passieren.

    ##########

    Und zu Deinem Post#3-Code: Der sieht mir unperformant aus, mehrfach pop.GetMessage aufzurufen. Und einen Schleifenindex mail zu nennen, ist ein Selbstknieschuss.

    VB.NET-Quellcode

    1. For MailIndex = 1 To CountEmails
    2. Dim CurrentMail = pop.GetMessage(MailIndex)
    3. ListofEmails.Add(New EMail With {
    4. .sSubject = CurrentMail.ToMailMessage.Subject,
    5. .sSender = CurrentMail.ToMailMessage.From.ToString,
    6. .sText = CurrentMail.ToMailMessage.Body,
    7. .sGetdate = CurrentMail.Headers.Date})
    8. Next
    9. Next

    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.

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

    @VaporiZed
    Ich hab ein kleines Beispiel für den Umgang mit der "pop3.dll" etwas umgebaut um diesen Code zu erstellen.
    Bisher konnte ich zwar emails senden OHNE zusätzliche dll aber emails empfangen geht wohl nicht ohne.
    Daher kommt das: pop.GetMessage(mail).Headers.Date

    Ich habe keine Ahnung was da in der "pop3.dll" passiert. ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Is ja auch erstmal wurscht, Hauptsache Du kommst zum gewünschten Ziel.
    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.
    @RodFromGermany & @VaporiZed &&&
    Das ist ein kleines Testobjekt. Es besteht nur aus wenigen Zeilen um emails abzurufen, sonst nix. ;)

    Habe nun alles mögliche durchgespielt, leider ohne den nötigen Erfolg.
    Ein Problem mit dem Repalce z.B. ist, das nicht alle mails dieses "GTM" im Datum haben. Siehe Bildangabe.

    Was ich nicht verstehe.
    Das mit dem fest eingetragenem Datum klappt. Ersetze ich ​"Sat,9 Jul 2022 09:19:07 +0000" durch ​Mail.sGetdate steht in:
    "ShortDateText" nur 01.01.0001 obwohl da ein Datum drinsteckt.

    VB.NET-Quellcode

    1. Dim DateValue As Date
    2. Date.TryParseExact("Sat,9 Jul 2022 09:19:07 +0000", "ddd,d MMM yyyy HH:mm:ss zzzz", New CultureInfo("en-US"), Globalization.DateTimeStyles.None, DateValue)
    3. Dim ShortDateText = DateValue.ToShortDateString


    Mit anderem Versuch bekomme ich den Fehler: Ungültige Konvertierung....

    VB.NET-Quellcode

    1. Dim ShortDateText As DateTime = CDate(Mail.sGetdate)
    2. ShortDateText = CDate(DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss"))


    Wieder bin ich an einem Punkt, wo so vieles völlig unlogisch ist. Man sollte meinen, das es eine bestimmte Regel für emails gibt aber scheinbar macht hier jeder etwas anders???
    Mal mit " +1000 " oder " +0000 GTM " oder oder oder.....
    Bilder
    • FehlerMail-2.jpg

      515,64 kB, 1.560×771, 58 mal angesehen
    • FehlerMail-2a.jpg

      173,1 kB, 730×357, 51 mal angesehen
    • FehlerMail-2b.jpg

      47,29 kB, 489×169, 57 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    um emails abzurufen, sonst nix
    Kleines testprojekt:
    Dein Datum fest einprogrammiert,
    eine TextBox, um den Formatstring zu editieren,
    einen Button für den TryParse-Befehl und ein Label zur Azsgabe des Ergebnisses.
    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!

    Amelie schrieb:

    Das mit dem fest eingetragenem Datum klappt. Ersetze ich ​"Sat,9 Jul 2022 09:19:07 +0000" durch ​Mail.sGetdate steht in:
    "ShortDateText" nur 01.01.0001 obwohl da ein Datum drinsteckt.

    Date.TryParseExact gibt ein Boolean zurück, das TRUE ist, wenn die Konvertierung erfolgreich war.
    Du fragst dieses Ergebnis nicht ab und gehst blind davon aus, dass erfolgreich konvertiert wurde.
    Wenn die Konvertierung schief geht, wird FALSE zurück gegeben und DateValue erhält den Wert DateTime.MinValue.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Aber das ist doch schon insofern wieder Datenmurks, weil in Post#16 Daten mit Datumswerten inkl (GMT) steht und welche ohne.
    Und Du versuchst laut der Fehlermeldung einen String, der mit ( endet, in ein Datum zu verwandeln. An der Stelle machst Du also selbst was im Code falsch. Was genau?

    Folgende Codezeile von Dir klappt problemlos bei mir:

    VB.NET-Quellcode

    1. ShortDateText = CDate(DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss"))

    Auch wenn ich nicht weiß, was Du damit erreichen willst. Als Funktionstest ist es aber ok.

    Deine Screenshots sind tw. sinnlos. FehlerMail-2 zeigt deshalb wohl nix an, weil in dem Schleifendurchlauf ShortDateText noch nicht befüllt wurde. Und bei 2a ist ein Leerzeichen zwischen der Zeit und +0000, was bei dem Replace nicht erwartet wird. Da wär es erstmal sinnvoll rauszubekommen, warum da dauernd was anderes in den Strings drinsteckt. Dazu musst Du wohl die Doku zur DLL anschauen.
    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.

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

    Danke für Eure Hilfe.

    @VaporiZed
    ​mit Datumswerten inkl (GMT) steht und welche ohne
    Wenn ich wüste warum das so ist.... Schrieb ich ja, das da wohl jeder seine eigene Suppe kocht..

    @petaod
    ​Date.TryParseExact gibt ein Boolean zurück, das TRUE
    Wenn ich wüste warum das auf False läuft wäre ich bestimmt schon weiter. Ein Datum ist ja im ​Mail.sGetdate drin, das sehe ich ja qwenn ich im Einzelschritt druchlaufen lasse.


    Ich bin noch lange lange nicht soweit, das ich durch eine dll eines andren Programmierers durchsteige.
    Ich lass das einfach so oder schneide einfach den Datumsstring ab, dann ist es auch ok. ;(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: