Wysyłanie maili – Swiftmailer [KO3.2]

Przy rejestracji nowego użytkownika, ale i nie tylko istnieje potrzeba wysłania użytkownikowi wiadomości email. Wiadomości wysyłane są w celu weryfikacji, przypomnienia hasła, powiadomienia o wydarzeniach w serwisie, a także przypomnienia o serwisie. Wiadomości mogą być wysyłane przez wbudowaną funkcję php, ale także przy użyciu innych klas.

W poradniku tym zaprezentuję implementację i proste wykorzystanie rozbudowanej klasy do wysyłania maili: Swiftmailer. Klasa oprócz podstawowych funkcjonalności, posiada np. możliwość logowania się na konto smtp przy użyciu szyfrowania danych (tls), co często zdarza mi się wykorzystywać.

Najpierw otwieramy github’a, przechodzimy do download i pobieramy implementację owej klasy od developera Kohany shadowhand email. Od razu poprawiamy odwołanie do configu na takie jak w ko3.2
Zamieniamy /classes/kohana/email.php:

$config = Kohana::config('email')->as_array() + array(

na:

$config = Kohana::$config->load('email')->as_array() + array(

Następnie pobieramy najnowszą wersję klasy Swiftmailer.

Foldery /classes, /config i /verdor wraz z zawartością umieszczamy w /application, natomiast folder z klasą swiftmailer umieszczamy w folderze /vendor.

Jeśli do wysyłania email chcemy wykorzystać smtp z szyfrowaniem przy logowaniu, to edytujemy configi i umieszczamy w nim:

<?php defined('SYSPATH') OR die('No direct access allowed.');
return array(
    'driver' => 'smtp',
    'options' =>  array(
        'hostname'=>'localhost',
        'port'=>'25', //'465',
        'username'=>'user',
        'password'=>'password',
        'encryption' => 'tls',
    ),
);

Należy jednak pamiętać iż serwer poczty musi posiadać taką możliwość. Poczty nie należy wysyłać z innej domeny niż posiadamy.

Przejdźmy teraz do wysyłania wiadomości w formacie HTML. Obecnie większość klientów pocztowych dobrze radzi sobie z odczytem takiej poczty, jednak nie wszystkie obsługują klasy CSS, dlatego należy umieszczać wszystko w znacznikach style.

Załóżmy, że jakiś zarejestrowany użytkownik chce wysłać koleżance :) zaproszenie do naszego serwisu. Aby wysłać taką wiadomość loguje się i w formularzu podaje email znajomego – zmienna _post[email]. Do szablonu email wykorzystamy widok invite.
/application/views/email/invite.php

$emailbody=View::factory('email/invite');

Do widoku przesyłamy obiekt zalogowanego użytkownika:

$user=Auth::instance()->get_user();
$emailbody->user=$user;

Widok ma następującą treść:

<div style="margin: 0 auto; padding: 0;font-family:Verdana;font-size:11px;">
    <div style="width:600px; background-color: #fff; border: 1px solid #CCC; margin: 45px 0 0 45px;">
        <div style="color: red; padding: 10px">
            <?php echo __('Invite')?>
        </div>
        <div style="padding: 10px">
            <?php echo $user->username.' '.__('invites you to join example.com')?><br />
            <?php echo __('After joining the site you will be able to use all functions'?>
        </div>
        <div style="color: gray; padding: 10px">
            Copyright &copy; <?php echo date('Y')?> example.com
        </div>
    </div>
</div>

Jak widać odwołujemy się w nim do atrybuty username obiektu user.

Teraz przechodzimy do wysłania maila:

require Kohana::find_file('vendor/Swift-4.1.5', 'lib/swift_required');                      
$email = Email::factory()
    ->subject(__('Message'))
    ->to($_POST['email'])
    ->from('noreply@example.com', 'Example')
    ->reply_to($user->email);
$email->message($emailbody, 'text/html');
$email->send();

Najpierw dołączmy plik swift_required.php z katalogu /application/vendor/Swift-4.1.5/lib/

require Kohana::find_file('vendor/Swift-4.1.5', 'lib/swift_required');

Następnie ustawiamy tytuł:

$email = Email::factory()
    ->subject(__('Message'))

Do kogo wysyłamy (email z formularza):

    ->to($_POST['email'])

Z jakiego adresu i jak ma się prezentować nadawca:

    ->from('noreply@example.com', 'Example')

Ewentualnie do kogo ma być odpowiedź, po naciśnięciu w kliencie pocztowym Odpowiedz:

    ->reply_to($user->email);

Na końcu ładujemy widok, ustawiamy typ jako text/html i wysyłamy:

    $email->message($emailbody, 'text/html');
    $email->send();

Jak widać wysyłanie email jest łatwe, a wykorzystując widoki możemy przygotować różne szablony emaili. Klasa Swiftmailer jest dość rozbudowana, więc jeśli ktoś potrzebowałby jakichś zaawansowanych funkcji to wielce prawdopodobne, że je w niej znajdzie.

11 Odpowiedzi :“Wysyłanie maili – Swiftmailer [KO3.2]”

  1. O, widzę że moduł shadowhanda jest znowu rozwijany. Alternatywą jest też kohana-email (https://github.com/synapsestudios/kohana-email), która ma przyjemną i prostą w użyciu funkcję Email::send()

    Co do samych maili, polecam zestawienie na Campaign Monitor (http://www.campaignmonitor.com/css/), które zawiera większość popularnych klientów pocztowych razem z ich obsługą CSS. Przydaje się przy tworzeniu maili, które są bardziej skomplikowane graficznie (czasami niestety trzeba ;) )

  2. Adam napisał:

    po zrobieniu wszystkiego zgodnie z poradnikiem otrzymujemy komuniakt ‚Class ‚Email’ not found’.

    • Adam napisał:

      sorry, blad to „HTTP_Exception_404 [ 404 ]: Unable to find a route to match the URI: 500.shtml”

    • Mariusz napisał:

      Hmm błąd Unable to find a route mówi, że nie znalazł routingu w bootstrapie, nie sądzę, aby dotyczył maili.
      Wrzuć cały kod błędu, np. na pastebin.pl i zapodaj link.

  3. faster napisał:

    rozumiem, że ten kod od dołączenia klasy jest w controllerze ?
    Jak sprawnie testować ten mailera na localhoscie ?

    • Mariusz napisał:

      Tak, w kontrolerze. Można podać dane smtp do logowania np. do onetu, albo użyć podstawowy driver.

      • faster napisał:

        a jeśli chodzi o

        require Kohana::find_file('vendor/Swift-4.1.5', 'lib/swift_required');
        

        W modelu mam metode, ktora wysyła maila i nie wiem ale gdy załączam te pliki (właśnie ta linijka z require),
        to kohana się ‚wywala’, jest biała strona zamiast czegokolwiek

      • Mariusz napisał:

        Doszliśmy do tego, że był błąd w odwołaniu do configu, który w kohanie 3.2 powinien wyglądać tak:

        $config = Kohana::$config->load('email')->as_array() + array(
        

        To tak w celu informacji.

  4. Marek napisał:

    W którym miejscu mam umieścić klasę shadowhand email.

Dodaj komentarz

Dodając kod PHP używaj tagów: [php][/php]

*