Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    6

    Regular Expression su mail

    salve a tutti!
    Ho un problemino(per me enorme!)sull'estrapolare da una mail di notifica di mancata consegna il mittente originario.
    Scrivo subito un esempio per fammi capire
    codice:
    Received:  2 Jan 2005 18:33:28 -0000
    Date: 2 Jan 2005 18:33:28 -0000
    From: MAILER-DAEMON\@mioserver.it
    To: miosito.it
    Subject: failure notice
    .......
    Hi. This is the.....
    From MAILER-DAEMON\@mioserver.it
    ......
    < xxxxxxx\@provider.com>:
    11.11.1.1. does not like recipient.
    Remote host said: 501 Invalid Address
    Giving up on 11.11.11.1
    ........
    Return-Path: <miosito\@miosito.it>
    ........
    To:  xxxxxxx\@provider.com
    From: quello_che_mi_serve.com
    Subject:  prova
    Date: Sun, 2 Jan 2005 13:33:24 -0500
    Il mio scopo è estrapolare "quello_che_mi_serve.com "
    Essendoci molte volte la stringa From presente, l'unica cosa che mi è venuta in mente è trovare il testo tra "from" e "Subject" visto che si ripete solo 2 volte (l'esempio è tagliato in varie parti)
    Sono veramente scarso con le regex, potreste darmi una dritta?
    Ho provato molte volte ma ognivolta il risultato è lo stesso mi trova sempre il testo contenuto tra il primo "from"ed il primo "subject"
    e sembra ignorare completamente la seconda corrispondenza.

    Sono veramente scarso con le regex, potreste darmi una dritta?
    Grazie in anticipo per qualunque aiuto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Io farei in questo modo:
    codice:
    $str =~ /.+From(.+)\n/gs;
    my $out = $&;
    Se non funziona, devi fare un loop:
    codice:
    $_ = $str;
    while(/.+?From(.+)\n(.+)$/s) {
      $_ = $2
    }
    my $out = $1;
    Per il significato di $& vedi il man di perlvar
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    6
    Grazie Mich_ mi hai messo sulla buona strada.
    Io ho risolto così, visto che il mittente desiderato era l'ultimo(sicuramente non è molto corretta come procedura però funziona )
    codice:
    $_= $mail_prova;
    while ($_ =~ /From:\s(.*)/g) {
           $mittente = $1;
           }
    edit : scusate mi ero dimenticato di chiudere il CODE

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Devi mettere anche il /s nella RE, altrimenti ti prende una riga alla volta. Nella mia prima RE sfruttavo quel fatto, e che il + e` vorace ("greedy").

    Inoltre potresti avere problemi con lo spazio dopo il from: - non puoi sapere a priori se c'e` e se e` singolo; invece il mittente ci deve essere, quindi e` piu` appropriato il + anziche` l'*

    /From:\s*(.+)/g
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    6
    Grazie ancora dei consigli, l'ho rimessa a posto come indicato da te, però una cosa, tu intendi inserire un'opzione "/s"per trattare la stringa come fosse una sola linea alla fine della RE,vero?
    Facendo così:
    ~ /From:\s*(.+)/gs}
    mi riesce a schermo completamente tutta la mail e non mi trova niente...

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so come hai implementato la RE.

    Io davanti al From: avevo messo .+ e dopo la parentesi \n
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    6
    Finalmente ho trovato un po' di tempo per finire questo script, credo ci sia molto da limare(soprattutto sull'uso del pragma strict e dell'inizializzazione delle var.ho molti dubbi!) però.... sembra che funzioni, in fondo è il mio primo script in perl!
    Ovviamente se ci sono suggerimenti per migliorarlo sono tutto orecchie

    Lo script è per un sito di cartoline.
    Teoricamente prende le mail da un server POP3, verifica che sia una mail di notifica di mancata consegna, estrae il mittente originario ed infine il contenuto html della mail.
    codice:
    #!/usr/local/bin/perl -w
    
    use Net::POP3;
    use Mail::Sender;
    use strict;
    use warnings;
    
    
    #si connette ad un server POP3 ed inizializza le variabili
    my $msgnums;
    my $msgcontent;
    my @mail_prova;
    my $mittente;
    my $contenuto;
    my $subject;
    my $popserver='xxxx.xxxx';
    my $username='xxxx@xxxx.xxx';
    my $password='xxxxxx';
    my $pop = Net::POP3->new($popserver, Timeout => 60);
    if ($pop->login($username, $password) > 0) 
    	{
    		my $msgnums = $pop->list;			#prende la lista dei messaggi
    		foreach my $msgnum (keys %$msgnums)
    			{
    			my $msgcontent = $pop->get($msgnum);			#legge la mail
    			@mail_prova=@$msgcontent;		#copia il contenuto del array punt in un array			
    			$_="@mail_prova";
    			#ricava il mittente
    			
    			if ($_=~ /\s*(MAILER-DAEMON)/g)		#verifica che il subject sia una notifica di mancata consegna
    				{												
    					while ($_ =~ /\s*From:\s*(.+)/g)
    						{
    							 $mittente = $1;
    						}
    			
    	#ricava l'html della mail 		
    						
    					if ($_=~ /\s*text\s*\/\s*html\s*(.+)/gs) 
    						{
    							 $contenuto=$1;
    						}
    				}
                     }
              }
    P.S. Scusate la formattazione ma ho fatto copia ed incolla al volo e grazie per gli aiuti ricevuti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.