Schrift
[thread]6823[/thread]

Mail-Body dekodieren (Seite 2)



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Dubu
 2005-04-05 00:37
#53046 #53046
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Quenten,04.04.2005, 14:51]
Quote
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.
[/quote]
Ich dachte an eine Mail, die nur aus einem Bild (z.B. Content-type: image/jpeg) besteht. Dann ist der Body nicht leer, aber es gibt keinen Text.

Quote
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.

Das muss, wie gesagt, kein Text sein.

Quote
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 halte es fuer recht unwahrscheinlich.
multipart/alternative ist dagegen sehr haeufig.

Quote
Ich will ja keinen eMail-User-Agent proggen und da eigentlich keinen riesigen Aufwand reinstecken.

Naja, eigentlich schon. Zumindest den Empfangsteil. ;)

Quote
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.

Gut, das sind die entscheidenden Kriterien (Attachment ja/nein und der MIME-Typ). Mehr kenne ich nicht.

Quote
Hat jede Mail einen text/plain Part? Ist das immer der erste?

Nein, nein, nein. Das sagte ich doch schon oben: Ich kann auch nur ein Bild verschicken, dann gibt's keinen Text-Teil. Ausserdem hat eine Nicht-MIME-Mail gar keine Parts (sondern besteht nur aus Text), kann die Reihenfolge der Teile AFAIK beliebig sein, und muss kein bestimmter Teil vorkommen.

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

"Content-type" ist der Header der gesamten Mail bzw. eines MIME-Parts, der angibt, welchen Inhaltstyp die Mail / dieser Teil hat. Der Inhaltstyp wird als "type/subtype" angegeben - und das ist der MIME-Type dieses Teils.
MIME::Entity->mime_type() liefert diesen MIME-Type zurueck, so wie er angegeben ist.
MIME::Entity->effective_type() liefert das gleiche wie mime_type(), sofern die Kodierung dieses Teils (angegeben in Content-Transfer-Encoding) bekannt ist und der Teil dekodiert werden konnte. Wenn nicht, dann bekommt man hier "application/octet-stream" zurueck, was soviel heisst wie "irgendwelche Binaerdaten".

So steht's jedenfalls in der Manpage zu MIME::Entity. ;)
Quenten
 2005-04-06 20:16
#53047 #53047
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Ok, ich will es nun mal so angehen, da ich feste Kriterien brauche zum coden. Ich muss mir ja irgendwelche Regeln setzen.

Also, will die Mail rekursiv durchgehen Part für Part.
1) Auslesen des MIME-Typ's mittels $part->effective_type()
2) Wenn es nen "text/plain"-Typ ist, dann an ein Array @body anhängen und somit speichern.
3) Wenn es multipart/relatebale, image/jpeg oder sonstiges ist, dann muss ich anders verfahren (weiß noch nicht wie).

Die ersten beiden Punkte habe ich fertig komplett mit Fehlerausgabe, Analyse, u.s.w.!

Jetzt fehlt nur nich die Handhabung von Sonderfällen wie Mails mit Bildern im Text oder Anhängen.

Wie gehe ich da jetzt am besten vor?
Hatte mir das Modul "Email::MIME::Attachment::Stripper" angeschaut, aber bin net schlau draus geworden.
Vor allem, wie kann ich angeben, wo er die attachments speichern soll und welchen Namen die haben sollen?

Meno, alles so kompliziert.
Quenten
 2005-04-09 16:00
#53048 #53048
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Kann mir noch einer den Sinn folgender if-abfrage wiedergeben?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $entity = $parser->parse_open("mail.dat")

if ($entity->parts() > 0)
{
print "IF-ZWEIG\n";
@parts = $entity->parts();
}
else
{
print "ELSE-ZWEIG\n";
push @parts, $entity unless @parts;
}
TRUE (IF-Zweig) -> Wenn MIME-Parts vorhanden sind, weise die Anzahl dem Array @parts zu. Verstehe ich ja, aber ...
FALSE (ELSE-Zweig) -> Wenn keine MIME-Parts vorhanden sein, hänge an @parts $entity an wenn nicht @parts gesetzt ist??????\n\n

<!--EDIT|Quenten|1113052995-->
pKai
 2005-04-09 17:53
#53049 #53049
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Quote
@parts = $entity->parts();

Nicht die Anzahl sondern das komplette Array der Teile wird nach @parts kopiert (da Zuweisung im Listenkontext). Die Anzahl wurde im if benutzt (dort skalarer Kontext). MIME::Entity
Quote
push @parts, $entity unless @parts;

Mache das betrachtete MIME::Entity-Object ($entity) zum einzigen Element in @parts, außer @parts enthält schon was.
I sense a soul in search of answers.
Quenten
 2005-04-09 18:19
#53050 #53050
User since
2005-02-15
22 Artikel
BenutzerIn
[default_avatar]
Hmmm, versteh ich, klar, thx.
Hab ich so aber nicht aus der Doku entnehmen könne, echt nicht. :-\
DANKE

Noch eine kleine Frage nebenbei:
Ich möchte einen String vergleichen und dies als Entscheidungsoperator für einen IF-Abfrage nutzen.

String: $text

Gehe in den IF-Zweig, wenn...
...der String $text einem Wert aus dem Array @werte entspricht
ODER
...der String nach folgendem Schema aufgebaut ist: $string =~ /^application\/(.*)/

Hatte es folgendermaßen probiert, was aber nicht funktionierte:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my @werte = qw(
audio/basic
image/bmp
image/gif
image/jpeg
image/png
image/tiff
video/mpeg
video/quicktime
);

foreach $werte (@werte)
{
if ($string eq $werte || $string =~ /^application\/(.*)/)
{
...
\n\n

<!--EDIT|Quenten|1113056574-->
pKai
 2005-04-09 18:28
#53051 #53051
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
if (grep {$_ eq $string} @werte) {
I sense a soul in search of answers.
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



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