Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: niskopoziomowy dostep do poczty
Forum PHP.pl > Forum > PHP
basu
Witam,

mam zrobic w bardzo krotkim czasie cos takiego:

Napisz prosty skrypt PHP, który podłączy się do serwera POP3, sprawdzi ilość
maili w skrzynce, a następnie wyświetli użytkownikowi listę maili w jego
skrzynce - dla każdego maila zaprezentuje nagłówki: To, From, Subject i Date.
Skrypt powinien na początku poprosić o podanie w formularzu parametrów serwera
POP3 (host, port) i parametrów konta (login, hasło).
Skrypt należy zaimplementować na niskopoziomowych funkcjach operujących na
socketach TCP/IP - niedopuszczalne jest użycie wbudowanych w PHP funkcji
obsługujących protokół POP. Skrypt powinien działać na PHP4.3. Parsowanie
MIME w tekstach podanych nagłówków nie jest konieczne.

Nie robilem tego nigdy, nie wiem od czego zaczac? Moze mnie ktos nakierowac na odpowiednia droge?
Sh4dow
najpierw zorientuj sie jak wyglada protokul imap albo pop3 niepamietam co to dokladnie bylo, a pozniej poprostu uzyj funkcji socket_connect itp
chociaz moim zdaniem to jest masohizm, zrozumiesz jak zaczniesz sie tym bawic.
basu
wlasnie glownie sie rozchodzi o to, czy moge to zrobic przy pomocy np. IMAP'a, czy ta niskopoziomowosc jest jeszcze nizej?
wrzasq
MUSISZ to zrobic za pomoca POP3 (nie IMAP'a, to rozne protokoly) bo jak inaczej chcesz wykonac zapytania do servera POP3 bez POP3? o.0 chodzi o to, ze masz ten protokol obsluzyc samodzilnie. czyli otwierasz socket (fsockopen() polecam bardziej niz socket_open() - nie kazdy ma rozszerzenie sockets zaisntalowane, a i obsluga zasobu jest latwiejsza jako zwykly strumien), wysylasz zapytania POP3 (fputs(), wzglednie socket_write() jesli juz uzywasz socket_open() ) i odczytujesz odpowiedzi (fgets(), badz analogicznie socket_read() ).

tutaj opis protokolu POP3: http://tools.ietf.org/html/rfc1939
weryfikacja uzytkownika POP3: http://tools.ietf.org/html/rfc1734

-edit-

tutaj prosty przyklad implementacji tego protokolu (ja bym to zrobil troche inaczej, no ale nie o wykonanie teraz chodzi): http://www.weberdev.com/get_example-501.html co prawda pojawia sie w kodzie (zgin przepadnij) global, ale sam mechanism protokolu i operacji na socketach TCP/IP jest niezaklocony praktycznie niczym w tym przykladzie wiec wsztstko powinno byc jasne.
basu
doszedlem do takiego prostego kodu:

  1. <?php
  2. // podanie loginu
  3. fputs($f, "USER $loginr\n");
  4. echo "<b>Zaloguj:</b> ";
  5. echo fgets($f, 1024).'<br />';
  6.  
  7. // podanie hasła
  8. fputs($f, "PASS $haslor\n");
  9. echo "<b>Hasło: </b>";
  10. echo fgets($f, 1024).'<br />';
  11.  
  12. // pobranie iloscci listow i ich lacznej wielkosci
  13. fputs($f, "STATr\n");
  14. echo fgets($f, 1024).'<br />';
  15.  
  16. // pobranie kolejnych numerow dla listoww i ich objetosci
  17. fputs($f, "LISTr\n");
  18. echo fgets($f, 1024).'<br />';
  19. while (substr($dane = fgets($f, 1024), 0, 1)<>'.') echo $dane."<br />";
  20.  
  21. // pobranie listu o numerze 2
  22. [b]fputs($f, "TOP 2 0r\n");[/b]
  23. echo fgets($f, 1024).'<br />';
  24. while (substr($dane = fgets($f, 1024), 0, 1)<>'.') echo $dane."<br />";
  25. ?>


ale w poleceniu mam ze tylko, ze dla każdego maila zaprezentuje nagłówki: To, From, Subject i Date.
a polecenie TOP wyswietla nam w calosci wszystkie naglowki. W samym POP3 nie mamy chyba mozliwosci rozdzielenia tego przez same komendy??
Dlatego sie zastanawiam, czy moze jakos inaczej do tego podejsc?
wrzasq
bo tak dziala protokol POP3, jak zreszta wszystkie inne. server przez POP3 wysyla ci CALA WIADOMOSC, to ty masz odczytac naglowki.
basu
wlasnie siedze nad sposobem na rozbicie naglowkow i wyciagniecie tylko potrzebnych danych: To, From, Subject i Date.

Jak to najszybciej zrobic?
wrzasq
przetwarzaj wiadomosc linijka po linijce, az nie trafisz na pusta linie, ktora oznacza koniec naglowkow (mozesz tez na poczatku uzyc explode($dane, "\r\n\r\n", 2), wtedy $dane[1] to naglowki, $dane[2] to wiadomosc).
basu
na razie skrypt dziala, po wpisaniu parametrow polaczenia wysyla nam naglowki (ale niestety w CALOSCI), teraz tylko je rozbic tylko jak?

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-type" content="text/html; charset=iso-8859-2" />
  4. <title>Poczta</title>
  5. </head>
  6. <body>
  7.  
  8. <?php
  9.  
  10. //jeśli podalismy parametry to przechodzimy do czytania wiadomosci z poczty
  11. if ($_POST['host'] && $_POST['port'] && $_POST['login'] && $_POST['haslo']) {
  12.  
  13. $host = $_POST['host'];
  14. $port = $_POST['port'];
  15. $login = $_POST['login'];
  16. $haslo = $_POST['haslo'];
  17.  
  18. // połączenie z serwerem POP3
  19. @$f = fsockopen($host, $port);
  20.  
  21.  
  22. //jeśli nastapilo polaczenie
  23. if ($f > 0) {
  24.  
  25. echo "<b>Połączenie:</b> ";
  26. echo fgets($f, 1024).'<br />';
  27.  
  28.  // podanie loginu
  29. fputs($f, "USER $loginr\n");
  30. echo "<b>Zaloguj:</b> ";
  31. echo fgets($f, 1024).'<br />';
  32.  
  33. // podanie hasła
  34. fputs($f, "PASS $haslor\n");
  35. echo "<b>Hasło: </b>";
  36. echo fgets($f, 1024).'<br />';
  37.  
  38.  
  39. // pobranie kolejnych numerow dla listow i ich objetosci
  40. fputs($f, "LISTr\n");
  41. echo "<b>Ilosc wiadomosci: </b>";
  42. echo fgets($f, 1024).'<br />';
  43. while (substr($ilosc = fgets($f, 1024), 0, 1)<>'.') $ile++;
  44.  
  45.  
  46.  echo "<hr /><br />";
  47. echo "<h2>Naglowki wiadomosci:</h2> <br />";
  48.  
  49. //wyswietlenie naglowkow wiadomosci
  50. for ($i=1; $i< $ile + 1; $i++) {
  51.  echo "<b>Naglowek ".$i. "</b><br /><br />";
  52. fputs($f, "TOP $i 0r\n");
  53.  while (substr($dane = fgets($f, 1024), 0, 1)<>'.') echo $dane."<br />";
  54. echo "<br />";
  55. }
  56.  
  57. }
  58.  
  59. //brak polaczenia
  60. else {
  61. echo "Złe parametry połączenia";
  62. }
  63.  
  64.  
  65.  
  66. }
  67.  
  68. //formularz z parametrami serwera oraz parametrami konta
  69. else {
  70. echo "<h4 align='center'>Szukaj:</h4>
  71. <form action='protokol_pop3_4.php' method='post' accept-charset='iso-8859-2'>
  72. <table border='1' align='center' bordercolor='#E2E2E2' cellpadding='2' cellspacing='1' width='780px'>
  73. <tr>
  74. <td align='right' valign='middle' id='opis_pol_tabeli' width='25%'> Host: </td>
  75. <td>
  76. <input type='text' name='host' size='80' maxlength='100' align='left'>
  77. </td>
  78. </tr>
  79. <tr>
  80. <td align='right' valign='middle' id='opis_pol_tabeli'> Port: </td>
  81. <td>
  82. <input type='text' name='port' size='10' maxlength='10' align='left'>
  83. </td>
  84. </tr>
  85. <tr>
  86. <td align='right' valign='middle' id='opis_pol_tabeli'> Login: </td>
  87. <td>
  88. <input type='text' name='login' size='15' maxlength='15' align='left'>
  89. </td>
  90. </tr>
  91. <tr>
  92. <td align='right' valign='middle' id='opis_pol_tabeli'> Haslo: </td>
  93. <td>
  94. <input type='text' name='haslo' size='15' maxlength='15' align='left'>
  95. </td>
  96. </tr>
  97. <tr>
  98. <td align='right' valign='top' id='opis_pol_tabeli'> </td>
  99. <td align='center'>
  100. <input type='submit' name='register' value='OK'>
  101.        
  102. <input type='reset' name='Wyczyść' value='Wyczyść' >
  103. </td>
  104. </tr>
  105. </table>
  106. </form>";
  107.  
  108. }
  109.  
  110.  
  111. ?>
  112.  
  113. </body>
  114. </html>
emacieka
Na końcu/początku pliku dodaj funkcję*:
  1. <?php
  2. function parseHeaders($input)
  3. {
  4. $input  = preg_replace("/r?\n/", "r\n", $input);
  5. $input  = preg_replace("/r\n(\t| )+/", ' ', $input);
  6.  
  7. $headers = explode("r\n", trim($input));
  8.  
  9. $return = array();
  10.  
  11. foreach ($headers as $value)
  12. {
  13. $hdr_name = substr($value, 0, $pos = strpos($value, ':'));
  14. $hdr_value = substr($value, $pos+1);
  15.  
  16. if($hdr_value[0] == ' ')
  17. {
  18. $hdr_value = substr($hdr_value, 1);
  19. }
  20.  
  21. $return[$hdr_name] = $hdr_value;
  22. }
  23.  
  24. return $return;
  25. }
  26. ?>


Następnie zmień pętlę na:
  1. <?php
  2. //wyswietlenie naglowkow wiadomosci
  3. for ($i=1; $i< $ile + 1; $i++) {
  4. $headers = '';
  5. fputs($f, "TOP $i 0r\n");
  6. while (substr($dane = fgets($f, 1024), 0, 1)<>'.')
  7. {
  8. $headers .= $dane;
  9. }
  10.  
  11. print_r( parseHeaders( $headers ) );
  12. }
  13. ?>

Jak odpalisz to z resztą już sobie poradzisz sam winksmiley.jpg.

BTW: Przy wysyłaniu komend do serwera na końcu każdej komendy powinno być "\r\n" - aktualnie masz "r\n".
BTW2: Możesz dodać po połączeniu:
  1. <?php
  2. @$f = fsockopen($host, $port);
  3. ?>
nie będzie tak mulić...

Tyle ode mnie.

*) wziete z pear'a winksmiley.jpg
basu
O to chodzilo smile.gif)))))THX :)Temat zamkniety.O to chodzilo smile.gif)))))THX :)Temat zamkniety.
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.