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

Fehler in einem CPAN Modul: MIME::Parser, ff



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
esskar
 2004-02-13 01:40
#80059 #80059
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hi...
ich benutze MIME::Parser, um Mails in ihre Bestandteile zu Zerlegen...
eine Mail bereitet mir Kopfschmerzen; hier der Teil, der Probleme bereitet:

Code: (dl )
1
2
3
4
5
Content-Type: message/rfc822;
name="=?ISO-8859-15?Q?F=E4hrenpreise?="
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="=?ISO-8859-15?Q?F=E4hrenpreise?="


MIME::Parser versucht nun, eine Datei im Dateisystem (Win32) abzulegen, die F?hrenpreise heißt... ? sind in Windowsdateinamen jedoch nicht erlaubt...
eigentlich müsst ja Fährenpreise rauskommen und draus dann Faehrenpreise werden...

Zwischendurch mal noch die Fehlermeldung
Code: (dl )
write-open 7A30B12F37E1E97C77B3B059282E2CA3\F?hrenpreise: Invalid argument at F:/Perl/site/lib/MIME/Body.pm line 414.


In Body.pm passiert zwar der Fehler, aber dort wird der Dateiname nur übergeben; der fehler passiert also vorher schon...
Hat jemand einen Tipp, wie ich den Aufrufer rausbekomme?

Während ich das so schreibe, werde ich mal caller versuchen!!!

Sonst noch tipps? pq weiß bestimmt Rat! :)
esskar
 2004-02-13 01:53
#80060 #80060
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay... der Bösewicht liegt glaub ich in MIME/Parser/Filer.pm: Zeile 639

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
sub output_path {
   my ($self, $head) = @_;

   ### Get the output directory:
   my $dir = $self->output_dir($head);
   
   ### Get the output filename, decoding into the local character set:
   my $fname = unmime $head->recommended_filename;

   ### Can we use it:
   if    (!defined($fname)) {
$self->debug("no filename recommended: synthesizing our own");
$fname = $self->output_filename($head);
   }
   elsif ($self->ignore_filename) {
$self->debug("ignoring all external filenames: synthesizing our own");
$fname = $self->output_filename($head);
   }
   elsif ($self->evil_filename($fname)) {

### Can we save it by just taking the last element?
my $ex = $self->exorcise_filename($fname);
if (defined($ex) and !$self->evil_filename($ex)) {
   $self->whine("Provided filename '$fname' is regarded as evil, ",
"but I was able to exorcise it and get something ",
"usable.");
   $fname = $ex;
}
else {
   $self->whine("Provided filename '$fname' is regarded as evil; ",
"I'm ignoring it and supplying my own.");
   $fname = $self->output_filename($head);
}
   }
   $self->debug("planning to use '$fname'");

   ### Resolve collisions and return final path:
   return $self->find_unused_path($dir, $fname);
}


dies schreibt nun wirklich den Mist rein:

Code: (dl )
my $fname = unmime $head->recommended_filename;


Frage, wie kann ich diese Funktion nun Patchen (eigentlich ist die Frage an welcher Stelle in meinem Code), damit es läuft?\n\n

<!--EDIT|esskar|1076630536-->
esskar
 2004-02-13 03:00
#80061 #80061
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
in dem Modul, in dem ich MIME::Parser benutze hab ich nun folgende Erweiterung:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package MIME::Parser;
# Paching the package

sub output_path
{
   my $self = shift;
   ### We use it, so don't warn!
   ### &MIME::Tools::whine("output_path deprecated in MIME::Parser");
   my $output_path = $self->filer->output_path(@_);

   $output_path =~ s![?*"<>]!_!g;

   return $output_path;
}


ist zwar nicht perfekt, da das Encoding noch nicht richtig aufgelöst wird (hab nämlich gerade festgestellt, dass unmime das Encoding "ISO-8859-15" von Haus aus nicht kennt) ...

Wie stell ich es denn am geschicktesten an, dass alle Module, die irgendwie das Modul MIME::Wordecoder benutzen, anstatt dem standard Modul, meinen eigenen Patch nutzen...
es sind nämlich noch ein paar andere Encoding (Windows-???, etcpp) die unmime nicht direkt kann...
ich bräuchte eben sowas wie einen Aspect, oder was ähnlichem
\n\n

<!--EDIT|esskar|1076664259-->
esskar
 2004-02-13 11:24
#80062 #80062
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
"Erinner!" :)
ptk
 2004-02-13 12:12
#80063 #80063
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Erstens: du solltest deine Patches unbedingt an den Autor von MIME::Parser weiterschicken! Es hilft nicht, wenn hier jeder sein eigenes Sueppchen kocht. Am besten du verwendest http://rt.cpan.org um den Bug einzutragen. Der Bugreport wird automatisch an den Maintainer geschickt und andere Leute haben die Moeglichkeit, sich Bug und Loesung anzuschauen.

Wenn du in der Zwischenzeit deinen eigenen Patch verwenden willst, kannst du beispielsweise die gesamte Datei mit dem Patch in ein eigenes Verzeichnis kopieren und dieses in @INC voranstellen. Oder manchmal reicht auch sowas:
Code: (dl )
1
2
3
4
5
6
7
use Ein::Modul;
{
package Ein::Modul;
sub ueberschriebene_funktion {
...
}
}

Das kommt ins aufrufende Skript.
esskar
 2004-02-14 03:50
#80064 #80064
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
werde den Bug benarchtigen... hatte ich sowieso vor...
bis dahin muss ich aber eben ne andere lösung finden...

vorallem die encodings nerven mich...

aber dein Tip ist wohl sehr vernünftig
fboneol
 2004-02-16 15:57
#80065 #80065
User since
2003-09-12
32 Artikel
BenutzerIn
[default_avatar]
Das Problem des Speicherns hatte ich bisher unter Unix nicht, aber die Fragezeichen in den Dateinamen nerven trotzdem.

http://search.cpan.org/~eryq/MIME-tools-6.200_02/lib/MIME/WordDecoder.pm

hilft es, die unbekannten zeichen zu ignorieren oder in _ umzuwandeln ?

könnte evtl so funktionieren :

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    use MIME::WordDecoder;

#so ?
### Construct:
# $wd = new MIME::WordDecoder::ISO_8859 2; ### ISO-8859-2

#oder so ? :
### Get the default word-decoder (used by unmime()):
$wd = default MIME::WordDecoder;


### What to translate unknown characters to (can also use empty):
### Default is "?".
$wd->unknown("_");

my $fname = $wd->decode($head->recommended_filename);


keine ahnung, wie oder ob das an den filer weitergegeben wird.
ich hab's so noch nicht ausprobiert. wenn du das mal testen solltest, sag mir bitte, ob es klappt. würde ich dann in meinen mailfilter mit einbauen wollen.

f.b.\n\n

<!--EDIT|fboneol|1076940211-->
esskar
 2004-02-16 17:16
#80066 #80066
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
werde es versuchen!

wie kann man deinen Mailfilter denn einstellen?
Also auf welche Filterregeln greift er?
fboneol
 2004-02-16 23:12
#80067 #80067
User since
2003-09-12
32 Artikel
BenutzerIn
[default_avatar]
den filter habe ich vor unseren postfix/cyrus mailserver geschaltet, hauptsächlich um jegliche viren/würmerflut irgendwie abzuwenden (d.h. attachment handling...).
ich hab dazu einige routinen von mimedefang benutzt und selber welche dazugebaut.

funktioniert im wesentlichen so:
-kommt die mail von extern ? dann scannen, sonst einfach zustellen
-alles html in ascii umwandeln
-attachment whitelist (z.b. pdf, doc): ist das attachment in der liste ? ok, mail zustellen
-ist das attachment nicht in der liste, dann datei auf die serverplatte speichern, nachricht bzw. kopie der mail an den admin, anhang aus der mail löschen und an den empfänger zustellen
-ist das attachment ein zip-file ? nach dateien durchsuchen, die da nicht reingehören und ggf aus dem zip file löschen. admin benachrichtigen
-anhang zu gross ? auf platte speichern und durch link ersetzen.
-diverse 'umwandlungen', um anzeigeprobleme bei einigen mailclients zu umgehen.

ist zwar'n bisschen restriktiv so, wir haben aber seitdem keine probleme mit würmern und so'm zeugs.
Crian
 2004-02-17 10:39
#80068 #80068
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
.doc würd ich aber nicht gerade in eine Whitelist stellen ^^

Stell lieber rtf in die Whitelist. .doc's zu verschicken ist eine Unart.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-02-13 01:40.