Emailová notifikace

Jak zařídit, aby se upozornění nebo obsah formuláře odeslal i na email.

Kompletní zdrojový kód příkladu najdete na https://github.com/JellyPot/tutorial/tree/02-02. Nebo máte-li nainstalovaný git, můžete ve své cvičné lokální složce JellyPot spustit příkaz
git init & git pull https://github.com/JellyPot/tutorial.git 02-02
(Jen si v takovém případě rozbalte jen samotný JellyPot bez boilerplate – to by vám pak git hlásil kolize.)

Pro odeslání obsahu formuláře na email slouží control <f:emailForm>. Ten je vlastně takový rozšířený <f:collectionForm>. Jeho chování je velmi podobné. <f:emailForm> umí vše, co umí <f:collectionForm>. Navíc kromě ukládání do kolekce dovede i odesílat upozornění na email, včetně obsahu formulářových polí. V takovém případě naopak nemusí mít atribut targetCollection uvedený – data z formuláře pak jen odesílá na email a nikam je neukládá (u controlů jednotlivých polí se pak pochopitelně neuvádí atribut targetField).

Zprovoznění formuláře <f:emailForm> se vám bude možná zdát nějaké složité. Nepropadejte panice, ve skutečnosti jde spíše o pár otravných drobností, jako například určení mailerserverů, účtů apod., které je potřeba udělat. Pojďme se na ně postupně podívat.

Formulář

Upravíme kontaktní formulář, který jsme vyrobili v předchozím kroku, tak, aby autorovi blogu zároveň chodilo upozornění na nové zprávy ze stránky „O autorovi“.

...
<form method="post" runat="server">
    <f:EmailForm runat="server"
                 id="contact"
                 targetCollection="message"
                 emailTemplate="Forms/Contact">
        <!-- sem přijde formulář -->
    </f:EmailForm>
</form>
...

Control <f:collectionForm> jsme tedy vyměnili za <f:emailForm> a přibyl nám atribut emailTemplate, který určuje šablonu emailu.

Šablona emailu

Šablona emailu se umísťuje do textového souboru. Hodnota atributu emailTemplate obsahuje cestu k uzlu, analogicky k atributu textNode controlu <je:text>. Do textového souboru zapíšeme šablonu emailu takto:

...
<Forms>
    <Contact>
        <Subject>Můj cvičný blog – někdo napsal</Subject>
        <Body>
            Gratuluji autore, píše ti čtenář tvého blogu.

            Jméno: {name}
            Email: {email}
            Zpráva: {message}
        </Body>
    </Contact>
</Forms>
...

Element <Subject> obsahuje předmět posílaného emailu, <Body> jeho tělo. Výrazy ve složených závorkách – např. {name} – odpovídají atributům id formulářových polí ve stránce.

Email příjemce a mailserver

Poslední nezbytností je říct systému JellyPot, odkud a komu má notifikační email poslat. To se dělá jednoduše přidáním následujícího kódu do souboru Runtime.config.

<JellyPotDef xmlns="urn:Bet:ns:JellyPot:RuntimeConfig">
    ...
    <EmailForms>
        <EmailServer name="primaryServer"
                     from="john.smith@example.org"
                     smtp="..."
                     userName="..." pwd="..." />
        <EmailForm name="contact"
                   server="primaryServer"
                   to="admin@example.org" />
    </EmailForms>
    ...
</JellyPotDef>

Sekce EmailForms obsahuje dva elementy. <EmailServer> obsahuje konfiguraci mail serveru – tj. adresu pro SMTP, email odesílatele, jméno uživatele a jeho heslo. Ten pak uvedeme v konfiguraci konkrétního formuláře v elementu <EmailForm>. Jeho atribut name obsahuje id formuláře ve stránce (v našem případě to je contact). Atribut server představuje výše definovaný emailový server. A konečně atribut to obsahuje emailovou adresu, na kterou se má email poslat. Adresu nemusíme uvádět v Runtime.config, můžeme uvést i odkaz na pole přístupné v administraci, tedy např.:

<EmailForm name="company"
           server="primaryServer"
           toVar="contact.adminEmail" />

Připomínky a postřehy

Máte-li nějakou připomínku, dobrý nápad, něco není úplně pochopitelné nebo jste našli v tutoriálu chybu, rádi od vás uslyšíme.