CodeForum.chCode ForenPerlThema: problem mit string-vergleich in if-abfrage
Seiten: [1]
AntwortenDrucken
Autor Thema: problem mit string-vergleich in if-abfrage  (Gelesen 5241 mal)
dmaphy
nicht zu stoppen
*
Offline Offline

Beiträge: 554



WWW
« am: 24. September 2003, 23:15:43 »
ZitierenZitat

ich bin gerade dabei, ein cgi-script in perl zu schreiben, welches emails von pop3 empfangen soll.
das tut es auch.
ich habe ein array @$mail welches zeile für zeile die email gespeichert hat.
nehmen wir aber an, der quelltext einer email sieht ungefähr so aus:
Code:

Message-ID: <008a01c382c8$0e123450$0100a8c0@de>
From: "SiteAdmin" <SiteAdmin@systemb.de>
To: "dmaphy" <dmaphy@systemb.de>
Subject: mailed with outlook express -> html + attachment
Date: Wed, 24 Sep 2003 20:17:03 +0200
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0086_01C382D8.D1829A50"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.3790.0
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.0


dann möchte ich informationen, die der user nicht braucht entfernen.
an zeilennummern direkt kann ich mich da nicht halten, da so ein quelltext ja immer anders aussieht.
also lass ich mir folgendes script dazu einfallen:
Code:

my $mail_lenght=@$mail;
    for ($i=0;$i<=$mail_lenght;$i++){
@pruef=split(/ /,$$mail[$i]);
if ($pruef[0] eq "MIME-Version:"){my $mime=$pruef[1];$i++;}
if ($pruef[0] eq "Content-Type:"){my $type=$pruef[1];$i++;}
if ($pruef[0] eq "Content-Transfer-Encoding:"){my $encoding=$pruef[1];$i++;}
if ($pruef[0] eq "X-Priority:"){my $priority=$pruef[1];$i=$i+2;}
if ($pruef[0] eq "X-MSMail-Priority:"){my $ms_priority=$pruef[1];$i++;}
if ($pruef[0] eq "X-Mailer:"){$i++;}
if ($pruef[0] eq "X-MimeOLE:"){$i++;}

if ($i<=3){
   $$mail[$i]=~s/</&/;
   $$mail[$i]=~s/>/&/;
   }
if ($i==5){
   print "<hr />";
   }
$$mail[$i]=~s/\n/<br \/>\n/;
print $$mail[$i];
if ($pruef[0] eq "Date:"){print "<hr />";}

}


wie erwartet verschwinden die einträge, allerdings nicht alle.
nach ausführen des scripts, sehe ich diese immernoch:
Code:

Content-Type: text/plain;
charset="iso-8859-1"
X-Priority: 3
X-Mailer: Microsoft Outlook Express 6.00.3790.0


warum?

wenn ich die if-abfragen so gestalte:
if ($pruef[0] =~ m /wort/){}
hab ich dasselbe ergebnis...
wenn ich diese anweisung
@pruef=split(/ /,$$mail[$i]);
so modifiziere
@pruef=split(/:/,$$mail[$i]);
und bei den abfragen dann den doppelpunkt weglasse, funtioniert das ebenfalls nicht...
Moderator informieren   Gespeichert

aus dem Chaos sprach eine Stimme zu mir:
"lächele und sei froh, es könnte schlimmer kommen".
und ich lächelte und war froh....
Ephraim
nicht zu stoppen
*
Offline Offline

Beiträge: 534



WWW
« Antworten #1 am: 25. September 2003, 07:11:34 »
ZitierenZitat

Könntest du den genauen MailHeader und den dazu gehörigen output
mal posten. ich denke des da irgend ein Zeichen vorher oder
nachher nicht passt. kannst ja mal nen chomp vorher auf $pruef[0]
machen oder gross kleinschreibung ?!?
Is aufjedenfall seltsam.
Was machst du eigentlich dann mit doppelten Zeilen. Da
verlierst du ja die vorherige.
Und bei nem Attachment ?!?

Naja is ja noch in der Entwicklung Zwinkernd

Ciao Ephraim
Moderator informieren   Gespeichert

Vorsicht Grandslam hält mich für: "Schizophren und nicht zu stoppen"
Kann ich zwar nicht bestätigen, aber Sicherheit geht vor. L&auml;chelnd

43 69 61 6F 20 45 70 68 72 61 69 6D 0A
4C 69 6E 75 78 20 69 73 0A
74 68 65 20 42 65 73 74 00
Ephraim
nicht zu stoppen
*
Offline Offline

Beiträge: 534



WWW
« Antworten #2 am: 25. September 2003, 12:04:31 »
ZitierenZitat

Ich denke du solltest immer wenn du
so eine Zeile entdeckt hast, nicht $i inkrementieren
sondern einfach die for schleife weiterführen mit nem continue,
also so:
Code:

my $mail_lenght=@$mail;
    for ($i=0;$i<=$mail_lenght;$i++){
   if ($i<=3){
       $$mail[$i]=~s/</&/;
       $$mail[$i]=~s/>/&/;
   }
   if ($i==5){
       print "<hr />";
   }
   @pruef=split(/ /,$$mail[$i]);
   if ($pruef[0] eq "Date:"){print "<hr />";}
   if ($pruef[0] eq "MIME-Version:"){my $mime=$pruef[1];continue;}
   if ($pruef[0] eq "Content-Type:"){my $type=$pruef[1];continue;}
   if ($pruef[0] eq "Content-Transfer-Encoding:"){my $encoding=$pruef[1];continue;}
   if ($pruef[0] eq "X-Priority:"){my $priority=$pruef[1];continue;}
   if ($pruef[0] eq "X-MSMail-Priority:"){my $ms_priority=$pruef[1];continue;}
   if ($pruef[0] eq "X-Mailer:"){continue;}
   if ($pruef[0] eq "X-MimeOLE:"){continue;}
   
   $$mail[$i]=~s/\n/<br \/>\n/;
   print $$mail[$i];


Probiers mal aus  :roll:

Ciao Ephraim
Moderator informieren   Gespeichert

Vorsicht Grandslam hält mich für: "Schizophren und nicht zu stoppen"
Kann ich zwar nicht bestätigen, aber Sicherheit geht vor. L&auml;chelnd

43 69 61 6F 20 45 70 68 72 61 69 6D 0A
4C 69 6E 75 78 20 69 73 0A
74 68 65 20 42 65 73 74 00
Ephraim
nicht zu stoppen
*
Offline Offline

Beiträge: 534



WWW
« Antworten #3 am: 25. September 2003, 12:12:15 »
ZitierenZitat

Zitat von: "maphy"
da so ein quelltext ja immer anders aussieht.


genau Smiley deswegen muss nicht immer die reinfolge wie bei dir
mit den if's eingehalten werden und deswegen kanns sein des die
übersprungen wurden.

Ciao Ephraim
Moderator informieren   Gespeichert

Vorsicht Grandslam hält mich für: "Schizophren und nicht zu stoppen"
Kann ich zwar nicht bestätigen, aber Sicherheit geht vor. L&auml;chelnd

43 69 61 6F 20 45 70 68 72 61 69 6D 0A
4C 69 6E 75 78 20 69 73 0A
74 68 65 20 42 65 73 74 00
dmaphy
nicht zu stoppen
*
Offline Offline

Beiträge: 554



WWW
« Antworten #4 am: 25. September 2003, 22:47:31 »
ZitierenZitat

mit den besonderen zeichen hab ich schon überlegt, aber noch nich ausprobiert, könnte schon sein, da in einer zeile ja ein tabulator ist.

das was ich noch probiert habe ist folgendes:
Code:

if ($pruef[0] =~ m/(^X-|Return-Path|Received|From|Subject|MIME-Version|Reply-To| #erwungener umbruch wegens dem style im board
To|References|Content-Type|Content-Transfer-Encoding|Date|Message-ID|Disposition-Notification-To)/)


das steht alles in einer zeile.
(edit: auf die oder-anweisung hätt ich allerdings schon früher kommen können...aber wenn ich eine if-abfrage mit || -operator mache...immer dasselbe ergebnis...)
es sollte eigentlich alles gefunden werden was mit "X-" anfängt...
das ergebnis ist wider erwarten immernoch folgendes:

From: "SiteAdmin"
Subject: mailed with outlook express -> nur text
MIME-Version: 1.0
charset="iso-8859-1"
X-Priority: 3
X-Mailer: Microsoft Outlook Express 6.00.3790.0

bei ner anderen email so:

From: "SiteAdmin"
Subject: mailed with outlook express -> nur text + attachment
MIME-Version: 1.0
boundary="----=_NextPart_000_0054_01C382D8.7A37F420"
X-MSMail-Priority: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.0

fest steht, das vor den zeilen:
charset="iso-8859-1"
boundary="----=_NextPart_000_0054_01C382D8.7A37F420"
ein tabulator steht, aber ob das die anderen zeilen erklärt...
ich werds auf jeden fall probieren

ich hab das script bis jetzt so geschrieben, das der header in einen hash gespeichert wird, damit ggf. from usw. aufgerufen werden kann.
den code dazu kann ich ja noch nachreichen...

seltsamerweise kann ich in dem hash aber z.b. mehrere werte mit dem schlüssel content-type speichern...ich hoffe ich komme da dann irgendwie auf den anhang. da erscheint ja dann was mit octet-stream und so...

ich kann ja mal einen gnazen email-code posten, wie ich ihn getestet hab.
wenn ich eine email abrufe, die über mein selbst geschriebenes script gesendet wurde funktioniert ja alles. aber outlook express z.b. sendet ne ganze menge sachen mit, wo ich mich frage, ob man die wirklich braucht...
in opera hat man ja auch eine funktion um sich den gnazen header anzuschauen, so ähnlich stell ich mir das script vor, dass er nicht mit angezeigt wird, aber auf abruf bereitsteht...nur leider wird die zeit immer knapper bis ich mich wieder mit anderne sachen beschäftigen muss Traurig

danke für die tipps Smiley werd sie gleich ausprobieren..
Moderator informieren   Gespeichert

aus dem Chaos sprach eine Stimme zu mir:
"lächele und sei froh, es könnte schlimmer kommen".
und ich lächelte und war froh....
dmaphy
nicht zu stoppen
*
Offline Offline

Beiträge: 554



WWW
« Antworten #5 am: 26. September 2003, 00:33:02 »
ZitierenZitat

ich möchte die problemstellung ändern.
folgendes programm zeigt mir, dass alle zeilen gefunden werden:
Code:

$lenght=@data; #laenge des array
    #print $lenght;    
    for ($j=0;$j<=$lenght;$j++){
@pruef=split(/:/,$data[$j]);
#print $data[$j]."<br />\n";
my $key=$pruef[0];
#print $key."<br />";
if ($key =~ m/(^X-|^Return-Path|^Received|^From|^Subject| #eine zeile
^MIME-Version|^Reply-To|^To|^References|^Content-Type| #immernoch dieselbe
^Content-Transfer-Encoding|^Date|^Message-ID|^Disposition-Notification-To)/) #hier endet sie
{ print $key."<br />"; }

}


das ergebnis bei einer etwas komplexeren mail siehst dann so aus:
Code:

Message-ID
From
To
Subject
Date
MIME-Version
Content-Type
X-Priority
X-MSMail-Priority
X-Mailer
X-MimeOLE
Content-Type
Content-Type
Content-Transfer-Encoding
Content-Type
Content-Transfer-Encoding
Content-Type
Content-Transfer-Encoding


endlich mal das, was ich erwartet habe Smiley

die subroutine siehst folgendermassen aus, und ich habe den fehler gefunden L&auml;chelnd
Code:

sub cut_mail_header {
    #cut_mail_header erwartet zwei paramter
    #1: die email in form eines arrays
    #2: einen string, was zurueckgegeben werden soll
    # kann sein: "body" oder "header"
    # gibt dann jeweils den body in form eines arrays oder
    # den header in form eines hashes zurueck
    @data=@_;    
    my $action=pop(@data);
    splice(@data,0,2); #schneidet die ersten zwei zeilen, die infos ueber den server
    $lenght=@data; #laenge des array
    #print $lenght;    
    for ($j=0;$j<=$lenght;$j++){
@pruef=split(/:/,$data[$j]);
#print $data[$j]."<br />\n";
my $key=$pruef[0];
#print $key."<br />";
if ($key =~ m/(^X-|^Return-Path|^Received|^From|^Subject|^MIME-Version|^Reply-To|^To|^References|^Content-Type|^Content-Transfer-Encoding|^Date|^Message-ID|^Disposition-Notification-To)/)
{   print $key."<br />";
   #erzeugen des hash %header
   my @value=split(/ /,$pruef[1]); #ich weiss genau, dass nach den doppelpunkt ein leerzeichen kommt
   my %header = ();
   if($header {$key}){
      $key .= "I";
      }
   $header {$key} = $value[1];
   
   #test zum ausgeben des hashs %header
   @schluessel=keys(%header);
   print "<ul>";
   foreach (@schluessel){
    print "<li>".$_."</li>";
        }
   print "</ul>";
   
   #erzeugen des array @data als rueckgabewert
   splice(@data,$j,1); #hier ist der fehler
   
   
}
    }
    if ($action eq "body"){ return @data; }
   elsif ($action eq "header") { return %header;}
 
}

das problem ist die eins,
ich dachte, ich möchte an stelle $j eine stelle löschen...
falsch gedacht, da muss null stehen ...  :oops:

mal der quelltext einer kompletten email:
Code:

Received: from mailout04.sul.t-online.com ([194.25.134.18])
        by mailexpress.de (VisNetic.MailServer.v5.8.6.4) with ESMTP id M41DFX
        for <dominichopf@mailexpress.de>; Thu, 05 Jun 2003 23:13:26 +0200
Received: from fwd10.aul.t-online.de
by mailout04.sul.t-online.com with smtp
id 19O22w-0003JY-02; Thu, 05 Jun 2003 23:13:18 +0200
Received: from 217.3.158.97 (VmFPTrZvYeQLxjGtmAwnCqJMTXNMXCJmgPN7t3GUVtnNZDEMlgW2r2@[217.3.158.97]) by fwd10.sul.t-online.com
with smtp id 19O1Rj-1Ks2pk0; Thu, 5 Jun 2003 22:34:51 +0200
MIME-Version: 1.0
Subject: Ph 47
From: <adresse aus sicherheitsgründen gelöscht>
Reply-To:   <adresse aus sicherheitsgründen gelöscht>
To: <adresse aus sicherheitsgründen gelöscht>
X-Mailer: T-Online eMail 4.111
Content-Type: Multipart/Mixed;
 Boundary="__Next_1054845882_Part11__"
Date: 05 Jun 2003 20:44 GMT
Message-ID: <19O1Rj-1Ks2pk0@fwd10.sul.t-online.com>
X-Seen: false
X-ID: VmFPTrZvYeQLxjGtmAwnCqJMTXNMXCJmgPN7t3GUVtnNZDEMlgW2r2@t-dialin.net


--__Next_1054845882_Part11__
Content-Type: Text/Plain;
 Charset="ISO-8859-1"
Content-Transfer-Encoding: Quoted-Printable



--=20
Mit freundlichen Gr=FC=DFen
           J=F6rg Hartung
--__Next_1054845882_Part11__
Content-Disposition: Attachment; filename="1Kinematik Punktmasse.pdf"
Content-Type: application/pdf;
 Name="1Kinematik Punktmasse.pdf"
Content-Transfer-Encoding: Base64

JVBERi0xLjMNJeLjz9MNCjYgMCBvYmoNPDwgDS9MaW5lYXJpemVkIDEgDS9PIDggDS9IIFsg
MzQ5NSA0MjcgXSANL0wgMTAxMjk2IA0vRSA5OTUxMCANL04gMSANL1QgM
...weitere tausend zeilen unverständliches zeug, welches die pdf-datei kenntlich macht....


leider ist das nicht mit allen anhängen so einfach.... Zwinkernd
Moderator informieren   Gespeichert

aus dem Chaos sprach eine Stimme zu mir:
"lächele und sei froh, es könnte schlimmer kommen".
und ich lächelte und war froh....
Seiten: [1]
AntwortenDrucken
CodeForum.chCode ForenPerlThema: problem mit string-vergleich in if-abfrage
Gehe zu:  

 

Partner Sites

Werbung

TinyPortal v1.0.5 beta 1© Bloc