Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dekoder maila
Forum PHP.pl > Forum > PHP
Olimpia_ona
Witam,
potrzebuje pomocy/porady.

Próbuje zrobić program, który połączy się z pocztą i ściągnie wybrane maile (np. od konkretnego nadawcy) a następnie do odpowiedniego katalogu wrzuci jeden z załączników (o konkretnym rozszerzeniu) a do podkatalogu 'zalaczniki' wrzuci całego maila (mail.eml) oraz pozostałe załączniki.

Mam z tym kilka problemy (a może więcej niż kilka :|)

1. Problem z czasem wykonania skryptu. Nie chciałabym tego rozwiązywać zwiększając wartość max_execution_time na serwerze, gdyż być może będzie to na serwerze, gdzie nie będę miała takiej możliwości.
Gdy jest mało maili to nie ma tego problemu, jednak gdy jest ich więcej to skrypt nie zdąża się wykonać.
Podejrzewam, że całe przeszukanie poczty najbardziej spowalnia polecenie imap_headerinfo
  1. <?php
  2. for ($i = 1; $i <= imap_num_msg($con); $i++)
  3. {
  4. $naglowek = imap_headerinfo($con, $i, 80, 80);
  5. $id_wiadomosci = $naglowek->message_id;
  6. if($id_wiadomosci)
  7. {
  8.  
  9. $maiboxihost = $naglowek->from[0]->mailbox . '@' . $naglowek->from[0]->host;
  10. //if $maiboxihost == $określonemu_nadawcy
  11. //to coś wykonuje
  12. ...
  13. }
  14. }
  15. ?>

które jest wywoływane dla każdej znajdującej się na poczcie wiadomości. Wydaje mi się, że nie mogę tego ominąć, gdyż potrzebuje wykonać operacje na mailach określonego nadawcy.
Czy ktoś ma jakiś pomysł jak by można było przeszukać tą pocztę, nie przeglądając wszystkich wiadomości, tylko od razu od określonego nadawcy?

2. Po ściągnięciu emla i przeglądaniu go w Outlook Express jest z nim jakiś problem z czcionką (na wp tego problemu nie ma, jakoś sobie radzą z wyświetleniem tego maila)
  1. <?php
  2. $msg = imap_fetchheader($con,$i);
  3. $msg .= imap_body($con,$i);
  4. $nazwa_pliku = $idp.'/zalaczniki/'.gmdate('Y-m-d_H-i-s', $naglowek->udate).'_'.$numer.'.eml';
  5. echo "<b>Utworzono katalog: $idp</b><br />";
  6. $wskaznik_pliku = fopen ($nazwa_pliku, w);
  7. if (fwrite($wskaznik_pliku, $msg) === FALSE)
  8. ...
  9. ?>


Po otworzeniu tego maila w Outlook Express mam na początku wiadomości taki komunikat:
If this email is not spam, click here to submit the signatures to FortiGuard - AntiSpam Service.
oraz czcionka wygląda nie czytelnie.

Czy ja mam na to jakiś wpływ w czasie tworzenia emla?

3. By wyróżnić załączniki mam skrypt, który jednak jest nie 'elastyczny' tzn. wyglądał mienj więcej tak:
  1. <?php
  2. $wskaznik_pliku = fopen ($nazwa_pliku, r);
  3. $msg = fread ($wskaznik_pliku, filesize($nazwa_pliku));
  4.  
  5. $msg1 = explode("\n", $msg);
  6. $k=0;
  7. foreach ($msg1 as $linia)
  8. {
  9.  $string='Content-Disposition: attachment; filename="(.*)"';
  10.  //lub $string='name="(.*)"';
  11.  if(ereg($string, $msg1[$k]))
  12.  {
  13. ...
  14. $ostatnielementtab = count($msg1);
  15. $j = $nastepnywiersz;
  16. for ($j; $j< $ostatnielementtab; $j++)
  17. {
  18. if (!(ereg('--boundarymainentity', $msg1[$j])))
  19. {
  20. $tresc_zal .= $msg1[$j];
  21. }
  22. else //continue;
  23. break;
  24. }
  25. ...
  26.  }
  27.  $k++;
  28. }
  29. ?>


Niestety określenie gdzie są załączniki wyglądało tak:
Content-Disposition: attachment; filename="(.*)" a teraz wygląda tak:
Content-Type: text/plain;
name="upo.xml"


Jak mogę zrobić to uniwersalnie?

również koniec treści załącznika wykrywałam znając wartość zmiennej boundary
Content-Type: multipart/related;
boundary="boundarymainentity"

chodź wiem, że ta wartość też może się zmieniać:
(w innym mailu)
Content-Type: multipart/mixed; boundary="part4728282b31dd5" (w jednej linii)

Jak mogę wyłowić z maila stosowaną wartość boundary?
Na ty, forum znalazłam takią poradę napisaną przez bendi:
Cytat(bendi @ 30.03.2005, 08:31:22 ) *
  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.


Ja niestety mam z tym problem, nie wiem jak miałabym wyświetlić jaką kolwiek wartość tablicy $aMatches. Próbowałam tak: print ($aMatches[0][0]); ale takie coś nic mi nie zwraca.

Za każdą pomoc dziękuje.
hondek
coś Ci się z kodowaniem pochrzaniło, nie da się tego czytać
crackcomm
chyba u ciebie cos jest nie tak tongue.gif
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.