Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8234[/thread]

Mail mit Anhang abholen und auswerten (Seite 2)

Leser: 3


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
krusty
 2006-08-12 22:31
#68831 #68831
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
@Dubu, habe ja auch schon bei den MIME:: Modulen nachgeschaut aber nichts brauchbares gefunden. Vielleicht kannst du ja was mit den MIME Header anfangen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C6BD43.CC3430CE
Content-Type: text/plain







------_=_NextPart_000_01C6BD43.CC3430CE
Content-Type: application/octet-stream;
name="test.csv"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="test.csv"


So steht das nach dem üblichen Mail Header in der Datei mit der Anlage drin. Nach dem Abschnitt kommt das die Anlage die mit den komischen "=[Zeilenumbruch]" getrennt sind.

Zum Schluss der Datei dann noch das:
Code: (dl )
------_=_NextPart_000_01C6BD43.CC3430CE--


Vielleicht kannst du mir ja nen Tipp geben wonach ich suchen könnte damit ich den Anhang mit einem MIME:: Module extrahieren kann und in eine separate Datei speichern kann.

Wäre super, ansonsten muss ich in mein Script noch ein Suche nach Umlauten und sontigem einbauen, da diese sonst, wie du schon bemerkt hast im Hex Format geschrieben sind.

PS: Wieso kann das zerlegen einer Mail nicht ebenso einfach sein, wie das Versenden einer Mail mit Anhang??? :rock:
krusty
 2006-08-12 22:43
#68832 #68832
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Habe mein Script jetzt folgendermaßen angepasst.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ( $gefunden == 1 )
{
$zeile =~ s/=\n//;
$zeile =~ s/=E4/ä/g;
$zeile =~ s/=FC/ü/g;
$zeile =~ s/=F6/ö/g;
$zeile =~ s/=DF/ß/g;
if ( $zeile =~ /^---/ )
{
next;
}
else
{
print OUT $zeile;
}
}


Leider kann ich damit nicht auf Groß und Kleinschreibung achten. Aber die Zeichen werden korrekt umgesetzt.
krusty
 2006-08-12 22:58
#68833 #68833
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

bin der Lösung ein gutes Stück näher gekommen. Manchmal sollte man einfach mal die Augen auf machen. ;-)

Hier mein Script:
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
#!C:/Perl/bin/perl.exe -w

use MIME::QuotedPrint;

die "Usage make_CSV2.pl Filename\n" if $#ARGV != 0;

my $datafile = $ARGV[0];
my $outfile = "C:/Perl/scripts/ausgabe2.csv";
my $doEncode = 0;

open(OUT, ">>$outfile") || die "Cannnot write file $outfile!\n";
open(DATA, $datafile) || die "Cannot open file!\n";
while (<DATA>)
{
if ( /^Content-Transfer-Encoding: quoted-printable/ )
{
$doEncode = 1;
}
if ( $doEncode == 1 )
{
print decode_qp($_);
$zeile = decode_qp($_);
print OUT $zeile;
}
}
close (DATA);
close (OUT);


Vielleicht könnt ihr ja mal drüber schauen ob das so alles in Ordnung ist, funktioniert auf jeden Fall. *freu*

@Dubu, vielen Dank für den Hinweis mit dem MIME:: Modul. Hatte hier nen völlig falschen Ansatz von anfang an. Seid ne super Community. Weiter so.\n\n

<!--EDIT|krusty|1155409205-->
Dubu
 2006-08-13 02:40
#68834 #68834
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=krusty,12.08.2006, 20:31]@Dubu, habe ja auch schon bei den MIME:: Modulen nachgeschaut aber nichts brauchbares gefunden. Vielleicht kannst du ja was mit den MIME Header anfangen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C6BD43.CC3430CE
Content-Type: text/plain







------_=_NextPart_000_01C6BD43.CC3430CE
Content-Type: application/octet-stream;
    name="test.csv"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
    filename="test.csv"

[/quote]
Lustig. Bei einer CSV-Datei hätte ich den Typ "text/x-csv" erwartet. Aber "application/octet-stream" ist natürlich für alles zu gebrauchen, was nicht irgendwie interpretiert werden soll.

Quote
Vielleicht kannst du mir ja nen Tipp geben wonach ich suchen könnte damit ich den Anhang mit einem MIME:: Module extrahieren kann und in eine separate Datei speichern kann.


Die MIME-Tools halte ich für genau das Richtige.
Vielleicht hilft dir das weiter:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
use strict;
use warnings;
use MIME::Parser;
use File::Copy;

my $mimemail = 'mimemail.txt';
my $ziel = 'ziel.dat';

# Parser anlegen
my $parser = MIME::Parser->new() or die "Parserobjekt nicht anlegen: $!";
$parser->output_dir("./mimeout");

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

# Gib mir alle Parts dieser Entity
my @parts = $entity->parts_DFS();

print "### Habe ", scalar @parts, " Teile gefunden. ###\n";
print "### Meldungen des Parsers:\n", $parser->results->msgs(), "### Ende der Meldungen des Parsers ###\n";

print $entity->dump_skeleton();

# Zeige alle Parts, die application/octet-stream sind :)
my $num = 0;
for my $part (@parts) {
   ++$num;
   print "### Teil $num hat den Typ ", $part->effective_type(), "###\n";
   next unless $part->effective_type() eq 'application/octet-stream';

   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";
   }

   # Hier wird der dekodierte Teil ausgegeben. Geht natuerlich auch in eine Datei.
   print "### Dekodierter Inhalt Teil $num ###\n", $bh->as_string, "### Ende Teil $num ###\n";

   # Wo liegt die Datei?
   print "### Pfad zu Body $num: ", $bh->path(), " ###\n";

   # Datei kopieren (wenn es mehrere Teile mit application/octet-stream gibt, bleibt nur die letzte uebrig!)
   print "### Kopiere ", $bh->path(), " nach $ziel ###\n";
   copy ($bh->path(), $ziel) or warn $!;
}

# Alle temporaeren Dateien loeschen
$parser->filer->purge();



Quote
PS: Wieso kann das zerlegen einer Mail nicht ebenso einfach sein, wie das Versenden einer Mail mit Anhang??? :rock:


Ist es doch. Oder dachtest du, das Versenden einer RFC-konformen MIME-Mail mit Anhang sei noch einfacher? ;)
Da darf man nicht einfach so beliebig lange Zeilen oder 8-Bit-Zeichen benutzen ...
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-08-11 14:11.