Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapis maili do bazy danych
Wolfie
post 28.01.2009, 15:31:52
Post #1





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Witam

Mam taki sobie oto skrypcik :
Kod
<?php

        $mailbox = "{imap.gmail.com:993/imap/ssl}INBOX";
        $user = "username";
        $pass = "password";

        $mbox = imap_open ($mailbox, $user, $pass)
        or die("can't connect: " . imap_last_error());


        echo "<h1>Mailboxes</h1>\n";
        $folders = imap_listmailbox($mbox, "{imap.gmail.com:993}", "*");

        if ($folders == false) {
            echo "Call failed<br />\n";
        } else {
            foreach ($folders as $val) {
                echo $val . "<br />\n";
            }
        }

        echo "<h1>Headers in INBOX</h1>\n";
        $headers = imap_headers($mbox);

        if ($headers == false) {
        echo "Call failed<br />\n";
        } else {
            foreach ($headers as $val) {
                echo $val . "<br />\n";
            }
        }

        $num = array(1,2,3);
        $numC = count($num);

        echo '<h1>Body of specified message</h1>';
        for ($i = 0; $i < $numC; ++$i)
        {
        $body = imap_body($mbox, $num[$i]);

        if ($body == false) {
            echo 'Call failed (' . $num[$i] . ')<br />';
        }
        else
            echo $body;
        }

        imap_close($mbox)


        ?>


Pominmy wyswietlanie tego co zostalo pobrane.
Nie mam pojecia jak teraz moge zapisac maile wraz z naglowkami do bazy danych po to abym mogl je pozniej z bazy wyciagnac i przeprowadzic na ich zawartosci analize....jaka analize to juz raczej nie ma znacznia , wazne jest to abym wiedzial gdzie konczy sie jeden mail a zaczyna drugi.....chociazby aby zostaly one zapisane do bazy tak aby kazdy mail byl w osobnej komorce.

I jeszcze jedno pytanko.
Czy za pomoca tych funkcji do pobierania maili z powyzszego skryptu pobierane sa rowniez tagi html i wszystkie szczegolowe informacje ktore sa przesylane przez protokoly ?

Ten post edytował Wolfie 28.01.2009, 15:32:33
Go to the top of the page
+Quote Post
Athlan
post 28.01.2009, 17:35:44
Post #2





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Aby mieć każdy mail w osobnym rekordzie (nie komórce) musisz użyć funkcji imap_sort(), która pobiera wszystkie wiadomości ze skrzynki. Otrzymasz tablicę z ID'ami poszczególnych wiadomości.

Teraz wykonujesz na tej tablicy foreach lub dowolną pętlę (wskazana, którą wymieniłem) i pobierasz nagłówki oraz body wiadomości, każdy z maili zapisujesz INSERT INTO do bazy jako osobny rekord. Kluczem rekordu powinien być też klucz ID wiadomości ze skrzynki - zapobiegnie to ewentualnemu dublowi. Do wyciągnięcia body używasz imap_fetchbody(), a do headerów imap_header().

Najlepiej po sprawdzeniu, czy zapis do bazy powiódł się, wywalić wiadomość ze skrzynki, żebyś nie musiał potem sprawdzać, czy istnieje i pobierać ją (wydłużać tego arraja). W tym celu oznaczasz wiadomość do usunięcia w foreach funkcją imap_delete() podając aktualny ID. Po zakończeniu pętli musisz wykonać funkcje, aby te wiadomości zniknęły: imap_expunge().

Kończysz imap_close() i gotowe. Ja do tego mam klasę, którą sobie napisałem, możesz wyciągnąć z niej jakieś kawałki:

  1. <?php
  2.  
  3. class Vframe_Mail_Inbox_Engine_Imap extends Vframe_Mail_Inbox_Engine
  4. {
  5.  protected
  6.    $_rConnection = null;
  7.  
  8.  public function connect($sServer, $sUser, $sPass, $iPort = 110, $sProtcol = 'pop3')
  9.  {
  10.    if(!($this->_rConnection = imap_open('{'.$sServer.':'.$iPort.'/'.$sProtcol.'/notls}INBOX', $sUser, $sPass)))
  11.      throw new Exception('Connection failed: '.imap_last_error());
  12.  }
  13.  
  14.  public function disconnect()
  15.  {
  16.    imap_expunge($this->_rConnection);
  17.    imap_close($this->_rConnection);
  18.  }
  19.  
  20.  public function inbox()
  21.  {
  22.    return imap_sort($this->_rConnection, SORTARRIVAL, false);
  23.  }
  24.  
  25.  public function delete($iId)
  26.  {
  27.    return imap_delete($this->_rConnection, $iId);
  28.  }
  29.  
  30.  public function body($iId)
  31.  {
  32.    return imap_fetchbody($this->_rConnection, $iId, 1);
  33.  }
  34.  
  35.  public function header($iId, $sParam = '')
  36.  {
  37.    $oHeader = imap_header($this->_rConnection, $iId);
  38.    
  39.    if($sParam)
  40.      return $oHeader->$sParam;
  41.    
  42.    return $oHeader;
  43.  }
  44.  
  45.  public function to($iId)
  46.  {
  47.    return $this->header($iId, 'toaddress');
  48.  }
  49.  
  50.  public function from($iId)
  51.  {
  52.    return $this->header($iId, 'senderaddress');
  53.  }
  54.  
  55.  public function subject($iId)
  56.  {
  57.    return $this->header($iId, 'subject');
  58.  }
  59. }
  60.  
  61. ?>


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Wolfie
post 10.02.2009, 22:59:27
Post #3





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Spoko.

Klasa napewno bedzie pomocna.
Problem polega na tym ze za bardzo sie nie orientuje w programowaniu obiektowym....jak narazie przeszedlem z 2-3 kursy i zrobilem kilka cwiczen.
Moglbys mi jeszcze pokazac jak np wykorzystywac dana funkcje w praktyce ?
Go to the top of the page
+Quote Post
Athlan
post 10.02.2009, 23:55:15
Post #4





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Przykład

  1. <?php
  2. $oImap = new Vframe_Mail .... ().
  3. $oImap->connect( ... podajesz dane ... );
  4. $aInbox = $oImap->inbox();
  5. $aMails = array();
  6.  
  7. foreach($aInbox as $iId)
  8. {
  9.  // zbierasz maila w jakiej chcesz formie, podalem przyklad pakowania do arraya danych
  10.  // 0 -> to, 1 -> headery, 2 -> tresc maila.
  11.  $aMails[] = array($oImap->from($iId), $oImap->header($iId), $oImap->body($iId));
  12.  $oImap->delete($iId); // usuwamy jezeli pobralismy maila
  13. }
  14.  
  15. $oImap->disconnect();
  16.  
  17. var_dump(); // nasze maila, array: 0 -> do kogo, 1 -> wszystkie headery, 2 -> body.
  18. ?>


Oczywiście klasa jest tylko elementem wzorca factory, więc u mnie connect i disconnect wykonują się automatycznie, ale to jest przykładowa implementacja. Musisz usunąć extends z klasy, jeżeli nie chcesz używać silnika Vframe_Mail_Inbox_Engine należącego do Vframe_Mail_Inbox.


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
Wolfie
post 12.02.2009, 17:03:28
Post #5





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Moglem wkleic to w poprzednim poscie
Zrobilem cos takiego

  1. <?
  2.  
  3. class Mailbox
  4.    {
  5.        protected $_connection = null;
  6.        
  7.        public function connect($server, $user, $pass, $port = 993, $protocol = 'imap')
  8.            {
  9.                if(!($this->_connection = imap_open('{imap.'.$server.':'.$port.'/'.$protocol.'/ssl}INBOX', $user, $pass)))
  10.                    throw new Exception ('Connection failure');
  11.            }
  12.            
  13.        public function inbox()
  14.            {
  15.                return $this->_sort = imap_sort($this->_connection, SORTARRIVAL, false);
  16.            }
  17.        
  18.        public function show_headers()
  19.            {
  20.                echo "<h1>Headers in INBOX</h1>\n";
  21.                $this->_headers = imap_headers($this->_connection);
  22.                
  23.                if ($this->_headers == false)
  24.                    {
  25.                    echo "Call failed<br />\n";
  26.                    }
  27.                else
  28.                    {
  29.                    foreach ($this->_headers as $val)
  30.                        {
  31.                        echo $val . "<br />\n";
  32.                        }
  33.                    }
  34.            }
  35.    }
  36.  
  37.    
  38. $mailbox = new Mailbox;
  39. $mailbox->connect('gmail.com','jakismail@gmail.com','jakieshaslo','993','imap');
  40. $tab = $mailbox->inbox();
  41. foreach($tab as $wart)
  42.    echo $wart.'<br />';
  43.  
  44.  
  45. $mailbox->show_headers();    
  46. ?>


Tylko ze jak widac tutaj mam pomieszane logike z prezentacja a chcialbym tego uniknac bo raczej to zla praktyka
Kod jest mniej czytelny i nie mozna go wykorzystac w innych przypadkach bez przerobek....ale niestety nie wiem jak to zrobic

Czy w odniesieniu do wzorca MVC Twoja klasa oraz przyklad z postu numer 4 to jest Model ?

Ten post edytował Wolfie 11.02.2009, 00:03:54
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 04:51