Schrift
[thread]6823[/thread]

Mail-Body dekodieren



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Quenten
 2005-03-29 18:50
#53036 #53036
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Es geht darum, dass ich mittels dem Modul "MIME::Parser" eine eMail eingelesen (geparst) und die Header-Daten und den Body in Variablen eingelesen lassen habe.
Soweit so gut, nur ist der Body leider noch kodiert und muss dekodiert werden.
Auf der Seite http://www.thomas-fahle.de/pub/perl/MIME/MIME_Code.html gibt es ein kleines Beispiel für zwei Kodierungs-Verfahren (Base64 und QuotedPrint).

Meine Frage nun:
1) Wie kodiert man am besten eine eMail. Ist das auf der genannten Seite die beste Möglichkeit?
2) Welche Kodierungs-Verfahren gibt es und kann man überhaupt alles abfangen?
3) Wenn ich das Kodierungsverfahren "QuotedPrintable" bei einer 7-bit Verschlüsselung (also mit ASCII Zeichensatz) anwende (im Beispiel ist 8-bit angegeben), kriege ich trotzdem kein brauchbares Ergebnis. Was muss ich ändern?

Hier einmal ein Beispiel einer Test-Mail.
Vor dem Dekodieren (nach dem Parsen):
Code: (dl )
Dieser Zeichensatz enth=E4lt die schriftspezifis=chen Zeichen f=FCr westeurop=E4ische und amerikanische Sprachen. Der Zeichensatz= deckt die Sprachen Albanisch, D=E4nisch, Deutsch, Englisch, F=E4r=F6isch, Finnisc= h, Franz=F6sisch, Galizisch, Irisch, Isl=E4ndisch, Italienisch, Katalanisch, Niederl=E4ndisch, Norwegisch, Portugiesisch, Schwedisch und Spanisch ab. Lediglich einzelne Zeichen. Wie das niederl=E4ndische "ij" oder die deutschen Anf=FChrungszeichen.

Nach dem Dekodieren:
Code: (dl )
Dieser Zeichensatz enthõlt die schriftspezifishen f³r westeuropõische und amerikanische Sprachen. Der Zeichensatz= deckt die Sprachen Albanisch, Dõnisch, Deutsch, Englisch, Fõr÷isch, Finnisc= h, Franz÷sisch, Galizisch, Irisch, Islõndisch, Italienisch, Katalanisch, Niederlõndisch, Norwegisch, Portugiesisch, Schwedisch und Spanisch ab. Lediglich einzelne Zeichen. Wie das niederlõndische "ij" oder die deutschen Anf³hrungszeichen.
ptk
 2005-03-29 20:37
#53037 #53037
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Dein Problem ist wahrscheinlich, dass die Ausgabe in der DOS-Konsole landet, die leider noch immer mit den Zeichensatz cp437 arbeitet. Wenn du stattdessen die Ausgabe per Umleitung in eine Datei schreibst und sie dir mit notepad oder so anguckst, sollten die Umlaute richtig sein.

Als Alternative koenntest du auch
Code: (dl )
binmode(STDOUT, ":encoding(cp437)")

verwenden. (evtl. heisst es cp850 statt cp437)
Quenten
 2005-03-29 21:23
#53038 #53038
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Hey cool,
könntest echt recht haben.
Ich teste das morgen gleich mal.
DANKE
Quenten
 2005-03-30 10:39
#53039 #53039
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Wenn ich die Daten z.B. in eine Textdatei schreiben lasse, sieht das Ergebnis folgendermaßen aus:
Code: (dl )
Dieser Zeichensatz enthält die schriftspezifischen Zeichen für westeuropäische und amerikanische Sprachen. Der Zeichensatz= deckt die Sprachen Albanisch, Dänisch, Deutsch, Englisch, Färöisch, Finnisc= h, Französisch, Galizisch, Irisch, Isländisch, Italienisch, Katalanisch, Niederländisch, Norwegisch, Portugiesisch, Schwedisch und Spanisch ab. Lediglich einzelne Zeichen wie das niederländische "ij" oder die deutschen Anführungszeichen unten fehlen.

Woher kommen die Gleichheitszeichen?\n\n

<!--EDIT|Quenten|1112164768-->
ptk
 2005-03-30 14:33
#53040 #53040
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mit dem Gleichheitszeichen werden bei quoted-printable lange Zeilen abgetrennt. Normalerweise muesste das Modul diese Zeilen richtig behandeln, aber vielleicht kommt es mit dem Newline auf deinem System nicht klar. Versuch mal ein s/\r//g; oder s/\n/\r\n/g;
Dubu
 2005-03-30 17:26
#53041 #53041
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Quenten,29.03.2005, 16:50]1) Wie kodiert man am besten eine eMail. Ist das auf der genannten Seite die beste Möglichkeit?
[/quote]
Nein, MIME::Parser hat alles noetige schon eingebaut. Wenn eine Mail einen MIME-Part enthaelt, wird dieser vom Parser als MIME::Entity geliefert. In perldoc MIME::Entity kann man nachschauen, wie man an den dekodierten Inhalt kommt.

Hier mal ein kurzes Beispiel. Es wird evtl. nicht mit allen Kombinationen (insbes. eingebetteten "message/rfc-822" Teilen) klar kommen, aber als "Proof of Concept" hilft es vielleicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl
use strict;
use warnings;
use MIME::Parser;

# In dieser Datei liegt der Quelltext der Mail
my $mimemail = 'mimemail.txt';

# Parser anlegen
my $parser = MIME::Parser->new() or die "cannot create parser object: $!";

# Mail parsen, MIME::Entity zurueck erhalten
my $entity = $parser->parse_open($mimemail) or die "cannot parse $mimemail: $!";

# Gibt es mehrere Parts?
my @parts = $entity->parts();
# Wenn nicht, nimm $entity selber als Part
push @parts, $entity unless @parts;

# Dekodiere alle Parts
my $num = 1;
for my $part (@parts) {
   print "### Teil $num hat den Typ ", $part->effective_type(), "###\n";
   print "### Header von Teil $num ###\n", $part->head()->as_string, "### Ende Header Teil $num ###\n";

   # bodyhandle() liefert uns ein MIME::Body Objekt mit dem Inhalt des Parts
   my $bh = $part->bodyhandle();
   unless ($bh) {
       print "### Teil $num hat keinen Body ###\n";
   }
   print "### Dekodierter Inhalt Teil $num ###\n", $bh->as_string, "### Ende Teil $num ###\n";
   ++$num;
}


Quote
2) Welche Kodierungs-Verfahren gibt es und kann man überhaupt alles abfangen?

Gebraeuchlich sind die genannten, Base64 und Quoted Printable.

Quote
3) Wenn ich das Kodierungsverfahren "QuotedPrintable" bei einer 7-bit Verschlüsselung (also mit ASCII Zeichensatz) anwende (im Beispiel ist 8-bit angegeben), kriege ich trotzdem kein brauchbares Ergebnis. Was muss ich ändern?

Das ist ja schon oben beantwortet worden.
Quenten
 2005-03-30 19:09
#53042 #53042
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
So, habe jetzt im Quelltext die "Dekodierung" vor das "Entfernen der HTML-Tags" gesetzt, was ich eigentlich schon längst hätte machen sollen.
Weiterhin habe ich den Zeichenstandard NLS_LANG=american_america.we8hp auf der ausführenden Maschine geändert. Steht nun auf NLS_LANG=GERMAN_GERMANY.WE8ISO8859P1 und beim Apache später fürs Anzeigen im Webbrowser auf NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1. Somit müsste ich nun den englischen und deutschen Zeichensatz berücksichtigen.
Was mir gerade noch aufgefallen ist, ist, dass ich nun Probleme mit dem Betreff bekomme, wenn dieser Umlaute enthält. *man man man*
Hätte ich gewusst, dass das so ein Aufwand ist ... *grummel* Diese zich bekloppten Zeichensätze und Verschlüsselungs-Besonderheiten. :angry:
Quenten
 2005-03-31 14:56
#53043 #53043
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,30.03.2005, 15:26][quote=Quenten,29.03.2005, 16:50]1) Wie kodiert man am besten eine eMail. Ist das auf der genannten Seite die beste Möglichkeit?
[/quote]
Nein, MIME::Parser hat alles noetige schon eingebaut. Wenn eine Mail einen MIME-Part enthaelt, wird dieser vom Parser als MIME::Entity geliefert. In perldoc MIME::Entity kann man nachschauen, wie man an den dekodierten Inhalt kommt.[/quote]
Hi Dubu,
ich habe das MIME::Parser schon so oft hin und her gewälzt, sollte mir aber wirklich noch mal MIME::Entity anschaun.
Ich hatte es mit ->as_string des öfteren probiert, aber es haute nie hin, weil ich das ganze Haupt-Entity angesprochen hatte und nicht nur einen Party davon.

Was jetzt noch meine Probleme sind, ist zum einen, dass ich Probleme bei Attachments bekommen (schau ich mir in später noch mal an) und zum anderen, dass ich nicht weiß, welches Entity ich nehmen kann/brauche.

Wenn ich HTML-Mails per Outlook verschicke, so bekomme ich 2 Entity-Parts. Das gesammte Entity hat als Content-Type "multipart/mixed". Ausgelesen habe ich das mit...
Code: (dl )
print "Content-Type: ", $entity->head()->get('content-type');
Der erste MIME-Part hat dann "text/plain" und der zweite "text/html". In beiden Parts kann ich den body auslesen, im ersten Part eben als reinen Text und im 2. als mit HTML-Code.

Wenn ich "nurText"-Mails per Outlook verschicken, so bekomme ich nur ein Enitity-Part welcher den Content-Type "text/plain" hat.

Wieviel Entity-Parts kann so ne Mail denn haben? Und kann ich mich auf einen festlegen, als z.B. immer den 1., wenn ich nichts anderes will, als nur den Betreff und den Body?

Danke, Quenten
Dubu
 2005-03-31 19:04
#53044 #53044
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Quenten,31.03.2005, 12:56]Wieviel Entity-Parts kann so ne Mail denn haben?
[/quote]
Beliebig viele, AFAIK.

Quote
Und kann ich mich auf einen festlegen, als z.B. immer den 1., wenn ich nichts anderes will, als nur den Betreff und den Body?

Body ist alles, was nach dem Header kommt. Und eine Mail muss ueberhaupt keinen "textuellen Inhalt" haben, wenn du das meinst. Ich kann auch eine MIME-Mail verschicken, die nur aus einem Binaeranteil besteht.

Ein anderes Problem ist, dass durchaus ein einzelner Mailtext aus mehreren MIME-Parts bestehen kann! Mutt macht sowas gerne, wenn unterschiedliche Teile unterschiedliche Zeichensaetze benoetigen. Da kann es also sein, dass ein MIME-Part US-ASCII ist, der naechste dann ISO-8859-1 und der wiederum naechste ISO-8859-15. Alle hintereinander gehaengt bilden den Text der Mail. Damit kommt nichtmal jeder User Agent klar.

Ein Kriterium fuer die Auswahl ist natuerlich, was Content-type und Content-Disposition sagen. Wenn die Content-Disposition "attachment" ist, oder der Content-type etwas anderes als "text/*", dann gehoert es wohl nicht zum textuellen Inhalt der Mail.

Wenn im Mail-Header dagegen "multipart/alternative" steht, dann sollten die MIME-Parts den gleichen Inhalt haben und nur einer davon dargestellt werden (z.B. text/plain als Variante zu text/html).
Quenten
 2005-04-04 16:51
#53045 #53045
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Quote
Wieviel Entity-Parts kann so ne Mail denn haben?
Quote
Beliebig viele, AFAIK.

Hab ich mir fast schon gedacht. *hmmmm*

Quote
Und kann ich mich auf einen festlegen, als z.B. immer den 1., wenn ich nichts anderes will, als nur den Betreff und den Body?
Quote
Body ist alles, was nach dem Header kommt. Und eine Mail muss ueberhaupt keinen "textuellen Inhalt" haben, wenn du das meinst. Ich kann auch eine MIME-Mail verschicken, die nur aus einem Binaeranteil besteht.
Du meinst indem ich einer Mail keinen Body-Text mitgebe? Klar, kann ja auch Mails ohne Daten raushauen. In dem Fall hab ich halt nen leeren Body, den ich auch verwerten würde zusammen mit den restlichen Daten. Oder ich fange leere Felder vorher ab. Trotz allem möchte ich sie aber auslesen aus der Mail.
Im großen ganzen geht es darum, dass ich ein Script schreiben will, welches mir die Daten einer eMail, die an bestimmte Empfänger geschickt werden, ausliest und in eine Datenbank schreibt.

Quote
Ein anderes Problem ist, dass durchaus ein einzelner Mailtext aus mehreren MIME-Parts bestehen kann! Mutt macht sowas gerne, wenn unterschiedliche Teile unterschiedliche Zeichensaetze benoetigen. Da kann es also sein, dass ein MIME-Part US-ASCII ist, der naechste dann ISO-8859-1 und der wiederum naechste ISO-8859-15. Alle hintereinander gehaengt bilden den Text der Mail. Damit kommt nichtmal jeder User Agent klar.
Bleibt die Frage wie sowas zustande kommt (Aufteilung der Mail in mehrere Entity-Parts und die unterschiedlichen Zeichensätze)? Und es bleibt die Frage wie wahrscheinlich sowas ist. Ich will ja keinen eMail-User-Agent proggen und da eigentlich keinen riesigen Aufwand reinstecken.

Quote
Ein Kriterium fuer die Auswahl ist natuerlich, was Content-type und Content-Disposition sagen. Wenn die Content-Disposition "attachment" ist, oder der Content-type etwas anderes als "text/*", dann gehoert es wohl nicht zum textuellen Inhalt der Mail.
Klar, daran mache ich ja aus, ob ich es verwerten kann oder nicht.
Hat jede Mail einen text/plain Part? Ist das immer der erste?

Was ist der Unterschied zwischen "effective_type", "content-type" und "mime_type".

Wäre klasse, wenn ihr mir antworten würdet.
LG, Quenten\n\n

<!--EDIT|Quenten|1112619231-->
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-03-29 18:50.