Posílání e-mailů

Když chceme posílat z online aplikace e-maily, tak potřebujeme řešit následující věci:

  • Jaká bude podoba a obsah e-mailu
    To je samozřejmě to nejdůležitější - jak bude e-mail vypadat, jaký bude mít obsah a tak dále.

    Jet je MVC framework je tedy logické, že princip MVC bude použit o pro generování e-mailů.

    Subsystém rozesílání e-mailů tedy obsahuje systém šablon, který využívá MVC_View pro generování.

  • Jak bude fakticky mail odeslán
    A samozřejmě musí existovat něco co reprezentuje e-mail jako takový a také backend, který se postará o jeho faktické odeslání. Backend pochopitelně musí být vyměnitelný za jinou implementaci.

  • Odesílatel mailu
    Rozsáhlá aplikace zpravidla posílá celou řadu různých mailů. Typicky například e-shop, který posílá potvrzení objednávky, různé informační maily zákazníkům, ale i různé systémové notifikace (například upozornění na změny u dodavatele, varování o nestandardních stavech a tak dále).

    Každý takový e-mail bude patřit do jiného tématického okruhu a každý takový okruh bude mít jiného odesílatele. Například potvrzení objednávky bude odesláno z adresy obchod@ a systémové varování z e-mailu system@ a tak dále.

    A aby v tom byl pořádek, tak je důležité mít nějaký systém pro evidenci těchto odesílatelů.

A teď si to všechno pojďme probrat podrobně.

Odesílatelé

Při instalaci ukázkové aplikace jste si jistě všimli, že v instalátoru bylo třeba zadat údaje definující výchozího odesílatele e-mailů (alespoň e-mailovou adresu a volitelně jméno).

Odesílatelé jsou definováni pomocí konfiguračního systému aplikace. Je to tedy konfigurace u které se předpokládá, že si ji koncový uživatel bude moci sám upravovat ať už v instalátoru, nebo v administraci pomocí nástroje, který vašim uživatelům můžete vyvinout.

V instalátoru jste definovali jednoho odesílatele, protože alespoň jeden definován být musí, ale v praxi se předpokládá, že v rozsáhlých aplikacích bude odesílatelů víc. Jak ostatně již bylo uvedeno a vysvětleno výše. S tím by měl počítat i instalátor a/nebo konfigurační nástroje vaší reálné aplikace.

Pojďme se již podívat jak to funguje. Každý odesílatel musí mít nějaké ID. ID je unikátní textový řetězec. Vřele doporučuji v rámci vaší aplikaci pro ID odesílatelů vytvořit konstanty. Jedna konstanta představující ID odesílatele už je přímo v Jet a to Mailing::DEFAULT_SENDER_ID mající hodnotu default. Další ID už jsou na vás.

S odesílateli se pracuje přes definici konfigurace, kterou představuje třída Jet\Mailing_Config a k jejíž instanci získáte takto:

Mailing::getConfig()

Tedy pokud potřebujete údaje určitého odesílatele (například jeho adresu e-mailu), lze to udělat takto: $sender_email Mailing::getConfig()->getSenderMyApp::SOME_SENDER_ID )->getEmail();

Odesílatele lze samozřejmě přidávat, odebírat a tak dále. Viz třídy Jet\Mailing_Config a Jet\Mailing_Config_Sender

Šablony e-mailů

Mít celou aplikaci pěkně MVC a pouze podobu e-mailů sestavovat "všelijak pokoutně" a nedržet se při tom paradigmatu MVC je opravdu nejen "nepěkné", ale hlavně velice nepraktické (sám jsem si to vyzkoušel).

Z toho důvodu je v Jet systém šablon e-mailů. Několik ukázkových šablon najdete i v ukázkové aplikaci, tak si to na jedné z nich pojďme ukázat názorně.

Šablony jsou standardně umístěny v adresáři ~/application/email-templates (což samozřejmě můžete změnit pomocí systémové konfigurace SysConf_Jet_Mailing)

V tomto adresáři dále najdete podadresáře jejichž názvy odpovídají kódům lokalizací. Tedy například české verze šablon jsou v adresáři cs_CZ.

A v tomto adresáři už jsou jednotlivé šablony.

Ale ještě si řekněme, že každá šablona má nějaké ID. Jako ukázkovou si vezmeme šablonu mailu, který se zasílá po zřízení nového přístupu do administrace. Tato šablona má ID administrator/user_welcome a tomu odpovídá i adresář. Tedy českou verzi šablony uvítacího e-mailu pro nového administrátora najdeme v adresáři ~/application/email-templates/cs_CZ/administrator/user_welcome/

V tomto adresáři již najdete tyto tři soubory, vlastně view skripty:

  • body_html.phtml
    Generuje HTML verzi e-mailu
  • body_txt.phtml
    Generuje textovou verzi e-mailu
  • subject.phtml
    Generuje předmět e-mailu
    (protože i do předmětu mailu je někdy nutné dynamicky vkládat údaje)
Názvy těchto skriptů jsou pevně dané. Právě tyto soubory tvoří fakticky šablonu samotnou.

Použití šablony v aplikaci

Šablona je použita jednoduše vytvořením instance třídy Jet\Mailing_Email_Template. Zde je konkrétní praktický příklad jak je použita právě naše ukázková šablona. $email_template = new Mailing_Email_Template(
    
template_id'administrator/user_welcome',
    
locale$this->getLocale()
);

$email_template->setVar'user'$this );
$email_template->setVar'password'$password );

$email $email_template->getEmail();


$email->setTo$this->getEmail() );
$email->send();

Princip je zcela prostý:

  • Určíte jakou šablonu chcete (jaké ID)
  • Volitelně určíte lokalizace. Zde v příkladu je to lokalizace, která je vázána na konkrétního uživatele. Jinak výchozí lokalizace je ta aktuálně globálně výchozí.
  • Volitelně určíte ID odesílatele mailu.
  • Předáte šabloně potřebná data (stejný princip jako u view).
  • Získáte instanci e-mailu připraveného k odeslání ( ke kterému můžete ještě např. doplnit přilohy - viz dále).

Vřele doporučuji se seznámit s třídou Jet\Mailing_Email_Template detailně. Umí nejen vygenerovat e-mail, ale třeba pouze zobrazit HTML tělo mailu. To v praxi používáme při vytváření šablon, kdy je možné jednoduše realizovat jejich náhled a kolega frontend vývojář nemusí při každé úpravě posílat e-mail.

Samotný e-mail a jeho odeslání

e-mail

Samotný e-mail je reprezentován třídou Jet\Mailing_Email. Instance této třídy je výsledkem generování šablony e-mailu, ale to neznamená, že ji nelze použít samostatně. Možné to samozřejmě je a e-maily lze vytvářet i bez šablon, nebo si vytvořit zcela vlastní systém pro jejich generování.

Co třída přesně umí se dozvíte v její referenci. Ale zde si zdůrazněme, že s e-mailem krom běžných věcí (určení HTML podoby, TXT podoby ...) můžete dělat i tyto neméně důležité věci:

  • Připojovat soubory jako přílohy.
  • E-mail samozřejmě může přímo obsahovat obrázky (HTML verze mailu).
  • Můžete specifikovat volitelné SMTP hlavičky.

Odeslání e-mailu - backend

E-mail již máme vytvořený, připravený a teď jej musíme odeslat. A je to stále dle stejného principu, který v Jet platí obecně. K tomu je určený backend, který lze vyměnit. Jet obsahuje výchozí implementaci, kterou vy můžete nahradit svojí vlastní implementací.

Backend je definován abstraktní třídou Jet\Mailing_Backend_Abstract

Výchozí backend je Jet\Mailing_Backend_Default

Backend můžete vyměnit pomocí metody setBackend třídy Jet\Mailing a získat jeho instanci pomocí metody getBackend téže třídy.

Předchozí kapitola
Jet\RESTServer_Backend_Default
Další kapitola
Jet\Mailing