Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> niskopoziomowy dostep do poczty, niskopoziomowe funkcje operujace na socketach TCP/IP
basu
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Sh4dow
post
Post #2





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
basu
post
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


wlasnie glownie sie rozchodzi o to, czy moge to zrobic przy pomocy np. IMAP'a, czy ta niskopoziomowosc jest jeszcze nizej?
Go to the top of the page
+Quote Post
wrzasq
post
Post #4





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował wrzasq 22.08.2007, 13:51:20
Go to the top of the page
+Quote Post
basu
post
Post #5





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
wrzasq
post
Post #6





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


bo tak dziala protokol POP3, jak zreszta wszystkie inne. server przez POP3 wysyla ci CALA WIADOMOSC, to ty masz odczytac naglowki.
Go to the top of the page
+Quote Post
basu
post
Post #7





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


wlasnie siedze nad sposobem na rozbicie naglowkow i wyciagniecie tylko potrzebnych danych: To, From, Subject i Date.

Jak to najszybciej zrobic?
Go to the top of the page
+Quote Post
wrzasq
post
Post #8





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
basu
post
Post #9





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


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>


Ten post edytował basu 23.08.2007, 13:21:17
Go to the top of the page
+Quote Post
emacieka
post
Post #10





Grupa: Zarejestrowani
Postów: 40
Pomógł: 1
Dołączył: 29.12.2003
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
basu
post
Post #11





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 26.12.2005

Ostrzeżenie: (0%)
-----


O to chodzilo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )))))THX :)Temat zamkniety.O to chodzilo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )))))THX :)Temat zamkniety.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 06:59