Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapis maili do bazy danych
Forum PHP.pl > Forum > PHP
Wolfie
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 ?
Athlan
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. ?>
Wolfie
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 ?
Athlan
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.
Wolfie
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 ?
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.