Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [w. reg.] Pobieranie content-type z maila
Forum PHP.pl > Forum > PHP
Seth
Pisze wyrazenie regularne do pobrania Content-Typea z czystego maila i natrafilem na maly problem.

Mozliwe ustawienia Content-Type to:
Kod
Content-Type: multipart/alternative; boundary="jh2x4CpaBw6eoB8"

Kod
Content-Type: multipart/alternative; boundary=jh2x4CpaBw6eoB8

Kod
Content-Type: multipart/alternative;
     boundary="jh2x4CpaBw6eoB8"

Kod
Content-Type: multipart/alternative;
     boundary=jh2x4CpaBw6eoB8

Kod
Content-Type: multipart/alternative;
boundary="jh2x4CpaBw6eoB8"

Kod
Content-Type: text/plain; charset="utf-8"

Kod
Content-Type: text/plain;
     charset="utf-8"

itd...

Narazie mam takei wyrazenie:
Kod
/^content-type: (.*);$/im

ktore pobiera mi ta pierwsza opcje (multipart/alternatice itp.)


Nie wiem jednak jak sie zabrac do drugiej czesci: boundary i charset.

Moze ma ktos na to pomysl ?
bendi
  1. <? 
  2. $sString = 'Content-Type: multipart/related;
  3.     type=\"multipart/alternative\";
  4.     boundary=\"__mime_boundary_related__NEXT_PART_\"
  5. From:Marek B <bla@bla.pl>';
  6. preg_match_all( '/content-type:(.*?)\"[^;]n/si', $sString, $aMatches );
  7. ?>

No i w tablicy aMatches mamy:
Kod
Array
(
   [0] => Array
       (
           [0] => Content-Type: multipart/related;
    type="multipart/alternative";
    boundary="__mime_boundary_related__NEXT_PART_"

       )

   [1] => Array
       (
           [0] =>  multipart/related;
    type="multipart/alternative";
    boundary="__mime_boundary_related__NEXT_PART_
       )

)

No i mysle ze dobranie sie do szczegolow nie bedzie stanowilo problemu.

BTW: to musza byc regularki questionmark.gif Domyslam sie ze to ma byc uniwersalne rozwiazanie, no ale duzo szybciej i latwiej jest skorzystac z rozszerzenia imap" title="Zobacz w manualu PHP" target="_manual, a dokladniej z funkcji imap_fetchstructure" title="Zobacz w manualu PHP" target="_manual
Seth
Wielkie dzieki smile.gif

Niestety IMAP nie wchodzi tutaj w gre. Mail jest przesylany wprost do skryptu php przez php://stdin dlatego regularne wydaja mi sie tutaj najodpowiedniejsze.
bendi
Nie wiem co knujesz, ale jezeli budujesz "dekoder" mejla to moze ci sie to przydac .

P.S. Sorka ze tak pozno, ale dopiero wczoraj na to trafilem winksmiley.jpg
Seth
Klasa jest swietna, wlasnie o to mi chodzilo.
Dzieki ! smile.gif

Mam jednak jeszcze jedno pytanie z zakresu pregow (nie moge na tym etapie uzyc tej klasy):

Chcial bym pobrac naglowki: from, to, cc, bcc, subject z listy naglowkow maila za pomoca jednego wyrazenia regualrnego.
Jednak nie wiem jak je polaczyc :?

Czyli jak polaczyc w jedno wyrazenie takie oto wyrazenia:
Cytat
$regHeaders = array(
  'from'    => '/^from: (.*)$/si',
  'to'      => '/^to: (.*)$/si',
  'cc'      => '/^cc: (.*)$/si',
  'bcc'    => '/^bcc: (.*)$/si',
  'subject' => '/^subject: (.*)$/si'
);

?


P.S.
Nie chodzi o dekoder. Podpowiedz w mojej sygnaturce winksmiley.jpg
bendi
Niestety nie przychodzi mi nic lepszego do glowy a na dodatek musze Cie nieco zmartwic, pomysla nie mam a na dodatek mam wrazenie ze te regulki, ktore wpisales w swoim poscie nei zadzialaja (przynajmniej nie zadzialaly na moim testowym zestawie naglowkow :/)

Sprawa jest niezwykle trudna - pokaze Ci co probowalem kombinowac, to moze akurat bedziesz mogl to jakos wykorzystac.

Najpierw myslalem zeby porozbijac same naglowki preg_splitem i lapac tez to pattern ktory powodowal rozbicie
  1. <?php
  2. preg_split( '%[s]+(from|to|bcc|cc|subject):%si', $sString, -1, PREG_SPLIT_DELIM_CAPTURE )
  3. ?>

Niestety okazalo sie ze to nie chce dzialac tak jak myslalem, bo okazalo sie ze takie naglowki jak "reply-to", albo kazdy inny z "to" w nazwie zaburzal wyszukiwanie naglowka "to"..

...no to pozniej wymyslilem ze bede pobieral wybrane naglowki w ten sposob:
  1. <?php
  2. preg_match_all( '/[s]+(from|to|bcc|cc|subject):(.*?)([w]+:)/si', $sString, $aMatches, PREG_SET_ORDER );
  3. ?>

Idea ktora lezala u podstaw napisania tej regulki zakladala ze naglowek moze sie przelamac do nowej linii, ale nie bedzie przeciez lecial dalej niz nastepny naglowek, no i wszytko cacy....
minusy:
- zatrzymuje sie na pierwszym napotkanym ciagu litery_: czyli np. "RE:" ktory przeciez jest bardzo czesto stosowany w tytulach
- po drugie lapiac nazwe kolejnego naglowka, silnik wyrazen oznacza te czesc tekstu jako przetworzona i juz do niej nie wraca, z powodu czego co drugi naglowek jest poprawnie odczytywany.

Niestety testowego zestawu naglowkow Ci tutaj nie moge wkleic, no ale jak sobie podejrzysz zrodlo wiadomosci spod outlooka expresa (nie tego ktory jest czescia ofisa, bo tam nie ma tej funkcji :/) to z mejla wyciagniesz co trzeba.

Jak widac moje proby skonczyly sie porazka, ale zycze powodzenia exclamation.gif
FiDO
a takie cos nie wystarczy? smile.gif
  1. <?php
  2.  
  3. preg_match_all('#^(From|To|CC|BCC|Subject):(.+)n(?!t)#Umsi', file_get_contents('mail.msg'), $m);
  4.  
  5. echo &#092;"<pre>\";
  6. print_r($m);
  7. echo &#092;"</pre>\";
  8.  
  9. ?>
bendi
Cytat(FiDO @ 2005-04-12 15:35:37)
a takie cos nie wystarczy? smile.gif

sam mi powiedz

[edit] Fakt slicznie dziala winksmiley.jpg. Sorka nie sparwdzilem
FiDO
No wg mnie dziala na tych danych.. wylapuje spokojnie wieloliniowego Subject'a.

Edit: tongue.gif

BTW.. mozna jeszcze to troche uscislic, bo ja przyjalem ze wszystkie wieloliniowe naglowki kolejne linie zaczynaja od tab'a, jak do tej pory nie spotkalem sie z innym przypadkiem, ale nie wiem jak to jest zdefiniowane w RFC. Mozna wiec tez robiac fuzje Twojego pomyslu z moim:
Kod
#^(From|To|CC|BCC|Subject):(.+)\n(?=\\w+:)#Umsi
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.