Hallo, Gast |
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.
|
Foren-Statistiken |
» Mitglieder: 1
» Neuestes Mitglied: Joopi
» Foren-Themen: 457
» Foren-Beiträge: 634
Komplettstatistiken
|
Benutzer Online |
Momentan sind 8 Benutzer online » 0 Mitglieder » 4 Gäste AhrefsBot, DotBot, Google, bot
|
|
|
eMail analysieren und zerlegen |
Geschrieben von: Joopi - 07-01-2024, 10:30 - Forum: Programmieren
- Antworten (1)
|
|
Jeder von uns bekommt wahrscheinlich jeden Tag Mails. Die einen bekommen mehr, die anderen bekommen weniger.
Die wenigsten User machen sich heutzutage darüber Gedanken, wie eine Mail entsteht bzw. aus welchen Bestandteilen diese zusammen gesetzt ist.
In einer anderen Sache habe ich mich genau damit beschäftigt, was eine Mail ausmacht und was sie alles enthalten kann sowie wie diese in unserem Mailclient bzw. online beim Mailanbieter für uns zu lesen ist.
Meine Aufzeichnungen sind nicht abschließend, sondern spiegeln mein Wissen wider und zeigen das, was ich bislang erreicht habe.
Generell kann man sagen, dass eine Mail 2 Hauptbestandteile (Mailheader und Mailbody) mit 3 Sektionen hat:
- Mailheader
- Mailbody mit Mailtext Plain/HTML
- Mailbody mit Anlagen
Der Mailheader beinhaltet alle technsichen Informationen, die die einzelnen Stellen, die die Mail ausliefern bzw. weiterleiten mitgegeben haben.
Die Mailtext kann in zwei Formaten vorliegen (entweder oder / beides zusammen):
- Plaintext (also Klartext)
- HTML-Text (HTML-Rohdaten)
Sobald eine Mail Plaintext und HTML-Text enthält, bekommt sie das Attribut: multipart (dazu später mehr)
Eine Mail kann im Klartext oder kodiert ausgeliefert werden. Wird sie kodiert ausgeliefert, so ist dies die base64-Kodierung.
Wichtig bei der Darstellung des Mailtextes ist es zu wissen, mit welchem Zeichensatz (charset) die Mail verfasst wurde. Generell nutzen die westlichen Ländern mittlerweile den Zeichensatz utf-8, aber besonders aus dem kyrillisch-sprachigen Raum kommen oftmals andere Zeichensätze mit. Das liegt oftmals daran, die der Mailclient es Mailverfassers eingerichtet ist.
Mailtexte im Klartext haben folgenden Eintrag: Content-Transfer-Encoding: quoted-printable
Mailtexte können aber auch eine Kodierung haben: Content-Transfer-Encoding: base64
Damit sind die Mailtexte als Rohdaten der Mail nicht lesbar und müssen dekodiert werden.
Alle Anlagen werden für gewöhnlich base64-kodiert: Content-Transfer-Encoding: base64
Die derzeit für mich wichtigsten Zeichensätze sind neben utf-8 die folgenden:
- iso-8859-1
- iso-8859-2
- iso-8859-15
- windows-1250
- windows-1251
- us-ascii
- koi8-r
Es ist wirklich nicht einfach für den Hobbyprogrammierer, eine Mail zu analysieren und die Mailtext lesbar ohne Sonderzeichen zu machen und die Anlage abzuspeichern.
Je nach dem, welcher Zeichensatz genutzt wird, gibt es immer wieder andere Vorgehensweisen, um die Mail analysieren zu können.
In den folgenden Antworten auf diesen Eröffnungsthread möchte ich meine Erkenntnisse dokumentieren, da sie mittlerweile ein PHP-Skript umfassen, dass aus dem Ruder läuft.
Die in dem primären Beispiel verwendete Mail ist eine Phantasiemail mit Phantasiedaten soweit es die Identität der beteiligten Personen angeht.
Die Mail wird eine Multipart-Mail sein, mit dem Zeichensatz utf-8, mit Plain- und HTML-Text sowie mit Anlagen.
MIME 1.0
Show Content
Spoiler
Die Zeile "MIME-Version: 1.0" in einem Mailheader gibt an, dass die E-Mail gemäß dem MIME-Standard (Multipurpose Internet Mail Extensions) verfasst ist und welcher Version dieses Standards entspricht.
Die Bedeutung dieses Eintrags ist:
MIME-Version: Dieses Feld gibt die Version des MIME-Standards an, der für die Formatierung und den Austausch von Multimedia-Inhalten über das Internet verwendet wird.
1.0: Die Zahl "1.0" ist die Versionsnummer des MIME-Standards, die in diesem Fall angibt, dass die E-Mail nach den Spezifikationen von MIME-Version 1.0 formatiert ist.
MIME wird verwendet, um unterschiedliche Arten von Inhalten in E-Mails zu unterstützen, darunter Text, HTML, Bilder, Audiodateien und andere multimediale Inhalte. Durch die Angabe der MIME-Version in der E-Mail-Headerzeile wird sichergestellt, dass der E-Mail-Client den MIME-Standard korrekt interpretieren kann, um die verschiedenen Arten von Inhalten ordnungsgemäß darzustellen.
multipart/mixed
Show Content
Spoiler
Die Zeile "Content-Type: multipart/mixed;" in einem Mailheader gibt an, dass die E-Mail mehrere Teile (Parts) enthält, von denen mindestens einer ein binärer Anhang (zum Beispiel eine Datei) sein kann. Das "multipart/mixed"-MIME-Typ wird verwendet, um verschiedene Inhaltsarten in einer E-Mail zu kombinieren, wobei jeder Teil unterschiedliche Inhaltsmerkmale haben kann.
Die Bedeutung der Teile in einer "multipart/mixed"-E-Mail könnte sein:
Textteile: Zum Beispiel der eigentliche Text der E-Mail im Klartextformat (text/plain).
Anhang: Zum Beispiel Bilddateien, Dokumente oder andere Binärdateien (application/octet-stream oder der spezifische Typ der Datei).
Die E-Mail-Clients interpretieren diese Teile entsprechend ihrem MIME-Typ und stellen den Inhalt entsprechend dar. Dies ermöglicht es, sowohl Text als auch Anhänge in einer einzigen E-Mail zu versenden.
multipart/alternative
Show Content
Spoiler
Die Zeile "Content-Type: multipart/alternative;" in einem Mailheader gibt an, dass die E-Mail mehrere alternative Versionen des Inhalts enthält. Jede alternative Version ist in einem separaten Teil (Teil) der E-Mail enthalten, und der E-Mail-Client kann die am besten geeignete Version für die Anzeige auswählen.
Die "multipart/alternative"-Struktur wird häufig für Textformatierungen verwendet, um sicherzustellen, dass der Empfänger die E-Mail in dem von seinem E-Mail-Client am besten unterstützten Format sieht. Die verschiedenen Versionen können unterschiedliche MIME-Typen für den Text enthalten, z. B.:
text/plain: Klartextversion der E-Mail.
text/html: HTML-Version der E-Mail mit möglicherweise formatiertem Text und Bildern.
Die Idee hinter "multipart/alternative" ist, dass der E-Mail-Client die am besten geeignete Version für die Anzeige auswählt. Wenn der Empfänger einen E-Mail-Client verwendet, der HTML unterstützt, kann er die HTML-Version sehen. Andernfalls wird die einfache Textversion angezeigt. Dies ermöglicht eine flexiblere Anpassung an verschiedene E-Mail-Clients und Präferenzen der Benutzer.
attachments
Show Content
Spoiler
Die Zeile "Content-Disposition: attachment;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Attachment) der E-Mail als Anhang behandelt werden soll. Das bedeutet, dass der Teil nicht inline im Text angezeigt wird, sondern als Dateianhang heruntergeladen oder geöffnet werden kann.
Die Bedeutung von "Content-Disposition: attachment;" liegt darin, dass der Empfänger der E-Mail den Anhang separat speichern oder öffnen kann, anstatt dass der Inhalt direkt im E-Mail-Text angezeigt wird. Dies ist typisch für Dateianhänge wie Dokumente, Bilder oder andere Dateitypen, die nicht im direkten Fließtext der E-Mail angezeigt werden sollen.
Zusätzlich zur Information darüber, dass es sich um einen Anhang handelt, kann "Content-Disposition" auch weitere Attribute enthalten, wie z. B. der Dateiname des Anhangs.
image/jpeg
Show Content
Spoiler
Die Zeile "Content-Type: image/jpeg;" in einem Mailheader gibt an, dass der damit verknüpfte Teil (Content) der E-Mail ein JPEG-Bild ist. Der MIME-Typ "image/jpeg" gibt an, dass es sich um eine JPEG-Bilddatei handelt.
Content-Type: Dieser Header gibt den Medientyp des Inhalts an, und "image/jpeg" spezifiziert den Typ des Bildinhalts als JPEG.
JPEG (Joint Photographic Experts Group) ist ein weit verbreitetes Dateiformat für komprimierte Bilddateien, das bei der Speicherung von Fotos und anderen Grafiken verwendet wird. Der MIME-Typ hilft dem E-Mail-Client, den Inhalt korrekt zu interpretieren und entsprechend anzuzeigen.
Diese Information ist wichtig, damit der E-Mail-Client weiß, wie er den Inhalt verarbeiten und darstellen soll.
|
|
|
HTML-Tags decodieren |
Geschrieben von: Joopi - 07-01-2024, 09:31 - Forum: Programmieren
- Keine Antworten
|
|
In der letzten Zeit kommt es immer häufiger vor, dass ich HTML-Texte als Rohdaten in eine MySQL-Datenbank erfasse. Der Umgang mit HTML-Tags sind insgesamt nicht immer einfach, aber wenn man weiß, was man will, dann kann man sich sehr gut helfen.
Wenn HTML-Rohdaten nicht in einem Browser ausgeführt werden, dann gibt es unschöne Leseansichten bzw. die Daten sind nicht in einer MySQL-Datenbank erfassbar.
Wer einen HTML-Text außerhalb eines Browsers lesen will, der sollte tunlichst die HTML-Tags ausblenden.
Wer einen HTML-Text in eine Datenbank, z.B. MySQL, erfassen will, der muss diverse Sonderzeichen masieren, die sonst bei der Erfassung zu einem Fehler führen.
Fall 1
Ein HTML-Rohtext wird in der Konsole ausgegeben
Code: $text = "<p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>";
echo "Text 1 " . $text . "\n";
Ergebnis
Zitat:Text 1 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>
Fall 2
Die HTML-Rohdaten werden gestript, um den Text lesbar zu machen
Code: $text2 = "<p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>";
$text2 = strip_tags($text2);
echo "Text 2 " . $text2 . "\n";
Ergebnis
Code: Text 2 Das ist mein Text, der ausgegeben werden soll.
Fall 3 entfällt
Fall 4
Die HTML-Rohdaten werden als Entities umgewandelt
Code: $text4 = "<p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>";
$text4 = htmlentities($text4);
echo "Text 4 " . $text4 . "\n";
Ergebnis
Code: Text 4 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>
Fall 5
Insbesondere bei der Erfassung von HTML-Rohdaten in einer MySQL-Datenbank ist der folgende Befehl zu nutzen.
Code: $text5 = "<p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>";
$text5 = htmlspecialchars($text5);
echo "Text 5 " . $text5 . "\n";
Ergebnis
Code: Text 5 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>
Fall 6 entfällt
Fall 7
Die HTML-Entitäten werden wieder zurückgewandelt.
Code: $text7 = "<p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>";
$text7 = htmlspecialchars_decode($text7);
echo "Text 7 " . $text7 . "\n";
Ergebnis
Code: Text 7 <p>Das ist mein Text, der <strong>ausgegeben</strong> werden soll.</p>
Wie wohl zu erkennen ist, kann man die HMTL-Tags bzw. die Zeichen, die nicht einfach so in eine MySQL-Datenbank erfasst werden können, ohne sie zu maskieren, so umwandeln, dass man damit arbeiten kann.
Der Fall 2 zeigt, dass die HTML-Rohdaten in einen gut lesbaren Fließtext umgewandelt werden können.
Die Entities können in die eine, aber auch wieder in die andere Richtung zurückgewandelt werden.
Ich nutze diese Erkenntnisse derzeit so, dass ich Mailheader aus eMails in eine MySQL-Datenbank speichere, aber auch die entsprechenden Mailtext. Die Mailtexte können in Plaintext und als HTML-Rohdaten vorliegen. Auch dann sind die obigen Erkenntnisse absolut wichtig, um die Datenbankerfassung zu ermöglichen.
|
|
|
|