phpmailer w Kohana Framework [KO3]

phpmailer w Kohana Framework [KO3]

Written by sbl

Topics: Kohana 3, Programowanie

W dzisiejszym wpisie przedstawię sposób instalacji klasy phpMailer we frameworku Kohana (3).

Zacznę od przedstawienia w/w klasy:

Phpmailer jest bardzo prosty w obsłudze do wysyłania wiadomości z tej klasy należy pierw pobrać ją z oficjalnej strony. następnie należy ją rozpakować w miejscu z którego będziemy korzystać ze skryptu wysyłającego wiadomości.

Zgodnie z powyższym opisem pobieramy phpMailera z oficjalnej strony projektu i wypakowujemy go do folderu application/vendor/phpmailer. Jeśli nie posiadasz folderu vendor musisz go stworzyć.

Tworzymy model

Pracę zaczniemy od stworzenia modelu, który będzie przygotowywał klasę do pracy. Oszczędzi nam to czasu i sprawi, że nasz kod będzie czytelny.
Stwórz plik o nazwie mailer.php w application/classes/model i wklej do niego poniższą klasę.

<?php defined('SYSPATH') OR die('No direct access allowed.');
class Model_Mailer extends Model{

    public static function send($to, $subject, $message, $fromname = NULL, $from = NULL){
        require_once Kohana::find_file('vendor', 'phpmailer/class.phpmailer');
        $body             = $message; //definicja zmiennej z wiadomością
        $body             = preg_replace('/\\\\/','', $body); //Strip backslashes
        $mail             = new PHPMailer(true);
        $mail->IsSMTP();
        $mail->CharSet    = "UTF-8"; //wymuszanie kodowania UTF-8
        $mail->SMTPAuth   = true; //włączanie autoryzacji SMTP
        $mail->Host       = "adres.serwera.pocztowego.pl";
        $mail->Port       = 587; // port serwera SMTP (domyślnie 25)
        $mail->Username   = "login";
        $mail->Password   = "hasło";

		// tutaj prosta instrukcja warunkowa sprawdzająca, czy wpisailśmy adres nadawcy.
		// jeśli adres nadawcy jest pusty uzupełnia go o standardowy jaki zdefiniowaliśmy poniżej.
        if($from === NULL){
        $mail->From       = 'listonosz@naszadomena.pl';
        }else{
        $mail->From       = $from;
        }

		// kolejna instrukcja działająca tak samo jak w/w lecz tu sprawdzane jest pole FromName
		// czyli nazwa nadawcy wyświetlana w nagłówku email.
        if($fromname === NULL){
        $mail->FromName   = 'NASZA STRONA';
        }else{
        $mail->FromName   = $fromname;
        }

        $mail->Subject    = $subject;
        $mail->WordWrap   = 50; //prawdopodobnie zawijanie wierszy
        $mail->MsgHTML($body); //ustalanie wiadomości HTML ($zmienna)
        $mail->IsHTML(true); //włączanie obsługi wiadomości HTML
        $mail->AddAddress($to);
        //$mail->AddBCC('ukryty@adres.pl'); //tutaj ukryty adres email jako kopia BCC

        if($mail->Send()){
            return true;
        }else{
            return false;
        }
    }

}

Jak widzimy powyżej, ważnym aspektem działania tej klasy jest jej „wywołanie” z pliku poprzez funkcję Kohana::find_file oraz require_once.

require_once Kohana::find_file('vendor', 'phpmailer/class.phpmailer');

Tworzymy kontroler „kontakt”

Teraz przedstawię sposób na napisanie kontrolera kontaktu, użyłem wielu technik z poprzedniego wpisu, tj. walidacja formularza, wysyłanie komunikatów do widoku.

Oto kod naszego kontrolera (application/classes/controller/kontakt.php):

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Kontakt extends Controller_Template {
        var $template;

        public function action_index(){
			//wczytanie widoku application/views/forms/kontakt
            $this->template = View::factory('forms/kontakt'); 

            $contact = new Model_Mailer; //inicjacja modelu

            if($_POST){
				//inicjacja klasy walidacji i sprawdzenie formularza
                $walidacja = new Validate($_POST);
                $walidacja->rule('names', 'not_empty')
                          ->rule('email', 'not_empty')
                          ->rule('email', 'email')
                          ->rule('subject', 'not_empty')
                          ->rule('message', 'not_empty');

                if($walidacja->check()){
					//przypisanie zmiennych po poprawnej walidacji
					$adresat	= 'twoj@email.pl';
					$temat 		= $_POST['subject'];
                    $message    = $_POST['message'];
                    $ip         = $_SERVER['REMOTE_ADDR'];
                    $host       = gethostbyaddr($ip);
                    $data       = date('d-m-Y H:i:s');
                    $user_agent = $_SERVER['HTTP_USER_AGENT'];
					$fromname	= $_POST['names'];
					$fromemail	= $_POST['email'];
                    $wiadomosc = "$message<br /><br /><hr /><strong>Typ wiadomości:</strong> $temat<br /><strong>Adres IP:</strong> $ip<br /><strong>Host:</strong> $host<br /><strong>Data wysłania:</strong> $data<br /><strong>User agent:</strong> $user_agent";

					//jeśli model->wyślij to wyślij do widoku wiadomość pozytywną
                    if($contact->send($adresat, $temat, $wiadomosc, $fromname, $fromemail)){
                        $this->template->message = 'Wiadomość wysłana!';
                    }else{ //jeśli się nie udało, wyślij do modelu wiadomość negatywną.
                        $this->template->warning = 'Nie wysłano wiadomości! Błąd.';
                    }
                }else{ //jeśli walidacja się nie udała to wyślij monit do widoku.
                    $this->template->warning = 'Uzupełnij poprawnie formularz!';
                }                      

            }
        }
}

Czas na widok

Ostatnim krokiem jest stworzenie widoku w application/views/forms/kontakt.php i wpisaniem do niego poniższego kodu, który możesz dostosować indywidualnie do własnej strony.

<h1>Kontakt</h1>
<?php
    if(isset($message)){
		echo '<h3 class="success">'.$message.'</h3>'."\n";
    }elseif(isset($warning)){
		echo '<h3 class="fail">'.$warning.'</h3>'."\n";
    }
?>
<table border="0" cellpadding="0" cellspacing="5" width="510" class="formtable">
<?php echo Form::open()."\n"; ?>
    <tr>
		<td>Imię i nazwisko:<span style="color: #ff0000;">*</span></td><td><?php echo Form::input('names', NULL, array('class'=>'text')) ?></td>
    </tr>
    <tr>
		<td>Adres e-mail:<span style="color: #ff0000;">*</span></td><td><?php echo Form::input('email', NULL, array('class'=>'text')) ?></td>
    </tr>
    <tr>
		<td>Temat:<span style="color: #ff0000;">*</span></td><td><?php echo Form::input('subject', NULL, array('class'=>'text')) ?></td>
    </tr>
    <tr>
		<td>Treść:<span style="color: #ff0000;">*</span></td><td><?php echo Form::textarea('message', NULL, array('class'=>'text')) ?></td>
    </tr>

    <tr>
		<td></td>
		<td><?php echo Form::submit('send', 'Wyślij', NULL); ?></td>
    </tr>
<?php echo Form::close(); ?>
</table>

To na tyle. Całości nie testowałem tak więc w razie powstałych problemów proszę o komentarz :)

Proszę też o sugestkie na jakie tematy pisać o Kohana Framework 3

  • Dexterxx

    Zmienne przekazywane do $contact->send mogłyby być upchane do jednej zmiennej tablicowej, znacznie ładniej by to wyglądało.
    Send z resztą jest funkcją statyczną, więc czemu nie Model_Mailer::send(…) ? Nie ma tutaj przypadkiem warningów w twoim przypadku?
    3. Wypadałoby jeszcze dane wrzucane do treści maila odfiltrować, łatwo na przykład spreparować user-agenta, a wiele ludzi odczytuje maile przez przeglądarkę.

    Tyle w ramach szybkiej głowej kompilacji ;-)