AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Dekodieren eines Mail-Betreffs
Thema durchsuchen
Ansicht
Themen-Optionen

Dekodieren eines Mail-Betreffs

Ein Thema von Bbommel · begonnen am 17. Mär 2021 · letzter Beitrag vom 1. Apr 2021
Antwort Antwort
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#1

Dekodieren eines Mail-Betreffs

  Alt 17. Mär 2021, 14:36
Hallo alle,

im Rahmen eines Projekts möchte ich Mails von einem Server abrufen und automatisch auswerten. Erste Versuche klappen soweit mit den Indys und konkret mit TidIMAP4 auch problemlos. Ich stolpere gerade nur über einen Klassiker, nämlich den kodierten Betreff einer Mail, sobald Umlaute oder andere Nicht-Ascii-Zeichen vorkommen. Also etwa:

'=?utf-8?Q?Re:_Frage_zur_Kapazit=C3=A4tsplanung?='

Der Betreff ist hier eigentlich "Re: Frage zur Kapazitätsplanung".

Nun habe ich verstanden, was ich im Wesentlichen tun muss, um das selbst auswerten zu können. Aber mich wundert, dass es da "nix fertiges" gibt, weil es ja doch ein Standardproblem ist, dass schon seit Jahrzehnten immer wieder auftaucht (wie gerade meine Google-Suche ergeben hat).

Ist da bei Delphi oder den Indys tatsächlich nichts fertiges dabei oder habe ich es nur übersehen?

Andere Komponenten/Bibliotheken würde ich extra dafür nicht installieren wollen, dann lieber selbermachen...
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dekodieren eines Mail-Betreffs

  Alt 17. Mär 2021, 17:54
Hach, Manno, alle machen nur noch das moderne Zeugs mit REST-APIs und was weiß ich und niemand kümmert sich mehr um die leicht in die Jahre gekommenen Mails.

Hab das also mal kurz gebastelt. Code tut für mich soweit wunderbar in Tests mit ein paar hundert Mails. Vorab aber die Einschränkung: der Code sollte gut mit Betreffs umgehen können, die entweder UTF-8 oder ISO-8859-1 kodiert sind. Der (für uns hier) "Sonderfall" einer anderen Kodierunf wie ISO-8859-4 oder was weiß ich, habe ich jetzt nicht beachtet. Falls man so etwas mit einem modernen Delphi auch in einem Ein- bis Dreizeiler hinbekommt, bin ich da noch für Anregungen dankbar, war mir aber jetzt erstmal zu unwichtig, um noch selbst danach zu suchen.

Hier also der Code:

Delphi-Quellcode:

uses
  System.NetEncoding, IdCoderQuotedPrintable, [...] ;

function DecodeMailHeader (aInStr: string): string;

(* Wir wollen ein Header-Feld - normalerweise ein Betreff oder Absender - einer Mail decodieren.
  Schema der Codierung, die auch mitten im Text mehrfach vorkommen kann:
  =?<Zeichensatz>?Codierung?Text?=
  Also etwa:
  =?utf-8?Q?Re:_Frage_zur_Kapazit=C3=A4tsplanung?=
  ergibt
  Re: Frage zur Kapazitätsplanung
  und war im Zeichensatz UTF-8 und quoted-printable codiert.
*)


var
  offsetIdx: integer;
  startIdx: integer;
  endIdx: integer;
  foundEncoding: boolean;
  encodedStr: string;
  encodedArray: TArray<string>;
  decodedStr: string;

begin
  offsetIdx:=0;
  repeat
    foundEncoding:=false;
    startIdx:=aInStr.IndexOf('=?',offsetIdx);
    if startIdx>=0 then begin
      endIdx:=aInStr.IndexOf('?=',offsetIdx);
      if endIdx>=0 then begin
        encodedStr:=aInStr.Substring(startIdx+2,endIdx-startIdx-2);
        encodedArray:=encodedStr.Split(['?']);
        if length(encodedArray)=3 then begin
          encodedArray[1]:=encodedArray[1].ToLower;
          if (encodedArray[1]='q') or (encodedArray[1]='b') then begin
            foundEncoding:=true;
            if encodedArray[1]='qthen begin
              // quoted-printable - dort zunächst die "_" entfernen, dann von den Indys umwandeln lassen
              decodedStr:=encodedArray[2].Replace('_',' ');
              decodedStr:=TIdDecoderQuotedPrintable.DecodeString(decodedStr);
              if encodedArray[0].ToLower='utf-8then
                decodedStr:=UTF8ToString(rawbyteString(decodedStr));
            end else
              // Base64-Encoding kann Delphi selbst...
              decodedStr:=TNetEncoding.Base64.Decode(encodedArray[2]);

            // austauschen des bisherigen Text gegen den decodierten
            // sollte ein Encoding mitten im Text enden, muss danach ein Leerzeichen kommen,
            // das wir mit entfernen müssen.
            if (endIdx<=aInStr.Length-3) and (aInStr.Chars[endIdx+2]=' ') then
              inc(endIdx);
            aInStr:=aInStr.Remove(startIdx,endIdx-startIdx+2).Insert(startIdx,decodedStr);
            offsetIdx:=startIdx+decodedStr.Length;
          end;
        end;
      end;
      if not foundEncoding then
        offsetIdx:=startIdx+2;
    end;
  until startIdx=-1;
  Result:=aInStr;
end;
Viel Spaß damit, falls jemand auf der Suche in einiger Zeit darüber stolpert.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
670 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Dekodieren eines Mail-Betreffs

  Alt 17. Mär 2021, 18:04
Hey, wenn du Geld dafür ausgeben kannst, besorg dir /N Software IPWorks. Ich verwende das seit Jahren um Emails einzulesen und zu dekodieren. In dem Fall ist es die MIME Komponente.
Und das ganze moderne Zeug ist da auch alles mit dabei
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.

Geändert von Sinspin (17. Mär 2021 um 18:08 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.933 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dekodieren eines Mail-Betreffs

  Alt 17. Mär 2021, 18:25
Hallo,

irgendwo in TNetEncoding oder so gibt's evtl. auch was in Delphi selber.
Da gibt's gewisse Convertierungsroutinen für manche Formate.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dekodieren eines Mail-Betreffs

  Alt 17. Mär 2021, 23:13
Hallo,

irgendwo in TNetEncoding oder so gibt's evtl. auch was in Delphi selber.
Da gibt's gewisse Convertierungsroutinen für manche Formate.
Ich glaube, TurboMagic meinte etwas in dieser Art
TURI.URLEncode(...) { uses System.Net.URLClient }
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.933 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dekodieren eines Mail-Betreffs

  Alt 18. Mär 2021, 09:21
Genau sowas meinte ich...
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dekodieren eines Mail-Betreffs

  Alt 18. Mär 2021, 09:24
Nein, System.NetEncoding enthält leider auch nichts, zumindest nichts was einen MIME-Header einer Mail komplett verarbeitet. NetEncoding kann URL, Base64 und HTML kodieren. Da URLs hier erwähnt wurden: das ist was anderes als die MIME-Kodierung eines Mail-Headers.

Die in NetEncoding vorhandene Base64-Klasse nutze ich in meiner obigen Lösung ja auch, insofern ist die Unit durchaus hilfreich, hat aber auch nichts komplett fertiges. Bin aber mit meiner obigen Lösung soweit auch zufrieden.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#8

AW: Dekodieren eines Mail-Betreffs

  Alt 18. Mär 2021, 09:40
Grummel. Wäre die sch...öne Indy-Dokumentation auch online erreichbar hätte ich es wahrscheinlich schneller gefunden. Denn natürlich gibt es was fertiges - hatte mich doch sehr gewundert, dass Indy (und Delphi selbst) alles dekodieren kann, nur die Header einer Mail nicht.

Es gibt bei den Indys die Unit IdCoderHeader. Dort gibt es dann die Funktion "DecodeHaeder". Macht genau das, was sie soll.
  Mit Zitat antworten Zitat
internet11

Registriert seit: 31. Mär 2021
Ort: Berlin
5 Beiträge
 
#9

AW: Dekodieren eines Mail-Betreffs

  Alt 1. Apr 2021, 14:00
Hallo zusammen,
ich würde Sinspin zustimmen. Nutze das auch und finde es sehr praktisch.
Kaja
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz