[2009–06–15|25ac85f] Nette\Mail – odesílání emailů

před 9 lety

David Grudl
founder | 6706
+
0
-

Nette Framework má novou třídu pro odesílání emailů Nette\Mail\Mail.

Příklad použití:

$mail = new Mail;
$mail->setFrom('Franta <franta@example.com>');
// nebo $mail->setFrom('franta@example.com', 'Franta');
$mail->addTo('petr@example.com');
$mail->setSubject('Potvrzení objednávky');
$mail->setBody("Dobrý den,\nvaše objednávka byla přijata.");
$mail->send();

Můžete využít i fluent interface:

$mail->setFrom('Franta <franta@example.com>')->addTo('petr@example.com')->send();

Do emailu lze vkládat přílohy:

$mail->addAttachment('example.zip');

Je také možné odesílat HTML emaily:

$mail->setHTMLBody('<b>Sample HTML</b> <img src="background.gif">');

Vložené obrázky lze do emailu vkládat metodou $mail->addEmbeddedFile('background.gif'), nicméně není to potřeba. Nette automaticky vyhledá a vloží všechny soubory odkazované v HTML kódu. Toto chování lze vypnout uvedením FALSE jako druhého parameteru metody setHtmlBody().

Pokud HTML email nemá textovou alternativu, bude vygenerována automaticky.

Pokud HTML email nemá nastavený subjekt, bude vzat z elementu <title>.


Třídu Mail lze dobře kombinovat se šablonama:

$template = new Template;
$template->setFile('email.phtml');

$mail = new Mail;
$mail->setFrom('Franta <franta@example.com>');
$mail->addTo('petr@example.com');
$mail->setHtmlBody($template); // nebo $mail->setBody($template) pro textovou šablonu
$mail->send();

Do šablony bude automaticky vložená proměnná $mail, je tedy možné přímo v šabloně nastavit další hlavičky emailu.


Samotné odesílání emailů obstarává mailer, tím výchozím je SendmailMailer používající PHP funkci mail(). SmtpMailer pro odesílání přes SMTP server je v přípravě.

před 9 lety

cuga
Člen | 212
+
0
-

bude mail pridan i do 0.8 verze, nebo mam pro posilani misto stable verze pouzivat devel verzi???

Jinak samozrejme diky za mail, ten chybel :)

Editoval cuga (15. 6. 2009 1:23)

před 9 lety

Patrik Votoček
Člen | 2249
+
0
-

A jak je to s plink, link atd. makrama v CurlyBracketsFilter-u ???

před 9 lety

Honza Marek
Člen | 1674
+
0
-

vrtak-cz napsal(a):

A jak je to s plink, link atd. makrama v CurlyBracketsFilter-u ???

Když šablonu vyrobíš v prezenteru pomocí $this->createTemplate(), tak o tyhle věci nemusíš mít starost.

před 9 lety

Honza Marek
Člen | 1674
+
0
-

cuga napsal(a):

bude mail pridan i do 0.8 verze, nebo mam pro posilani misto stable verze pouzivat devel verzi???

Jinak samozrejme diky za mail, ten chybel :)

Bude stačit, pokud si zkopíruješ složku Mail z development verze do té stable.

před 9 lety

hjr
Člen | 24
+
0
-

Skvělé, doufám, že tady alespoň nebudou problémy s češtinou a kódováním, které se rády vyskytují v ostatních mailerech :)

před 9 lety

xzajic
Člen | 19
+
0
-

Já bych měl prosbu. Pochopil jsem pohledem do zdrojáku, že Nette\Mail je až od verze 0.9. Nedalo by se to (tučně, výrazně, červeně, pro blbce) uvést do Průvodce programátora (https://doc.nette.org/cs/mailing) Kdž si jako nováček stáhnu doporučenou verzi (0.8) a vyzkouším si odeslání e-mailu, tak to nebude fungovat ;-)

před 9 lety

Tomik
Nette Evangelist | 489
+
0
-

xzajic napsal(a):

Já bych měl prosbu. Pochopil jsem pohledem do zdrojáku, že Nette\Mail je až od verze 0.9. Nedalo by se to (tučně, výrazně, červeně, pro blbce) uvést do Průvodce programátora (https://doc.nette.org/cs/mailing) Kdž si jako nováček stáhnu doporučenou verzi (0.8) a vyzkouším si odeslání e-mailu, tak to nebude fungovat ;-)

Je to tam, jen otázka, zda to dát jako tip nebo upozornění, zatím jsem to dal jako upozornění, páč je to docela důležitá informace… Ale zase to vypadá, jak nějaká chyba. :)

před 9 lety

xzajic
Člen | 19
+
0
-

ÚÚÚžasné ;-))

před 9 lety

David Grudl
founder | 6706
+
0
-

připravím tam nějaký infoboxík pro číslo verze.

před 9 lety

Roman Pištěk
Člen | 11
+
0
-

Nette\Mail\Mail.php, řádek 423: V reguláru asi chybí ungreedy modifikátor (bez něj je v $matches vše až po poslední uvozovku v ).
Jinak dobrá práce!

před 9 lety

David Grudl
founder | 6706
+
0
-

pravda, opravím

před 9 lety

Jakub Šulák
Člen | 223
+
0
-

Hlásím „asi bug“:

Subject se nastavuje automaticky z <title>.
Pokud je však v title {$abc}, tak se asi nevyhodnotí, nebo se každopádně poruší hlavička mailu.

před 9 lety

LeonardoCA
Člen | 297
+
0
-

Taky mám menší problém, MS Outlook 2007 po zaslání html mailu zobrazí nejdříve plain text a pak html kód jako plain text. Zkoušel jsem zaslat stejný mail s jednoduchou třídou, kterou jsem si psal v únoru a jediný zásadní rozdíl ve výstupech který jsem našel je, že má třída posílá plain text i po ‚Content-Type: multipart/alternative;‘. To jsem někde vyčetl na netu a tuším, že i google mail formátuje odchozí zprávy podobně.

Moje původní řešení, které MS Outlook přelouská správně vypadá takto:

// message
$body_html = $this->body;
$body_plain = $body_simple = strip_tags($body_html);
$boundary = md5(uniqid(time()));

//headers

$headers  = 'From: '.$this->from."\n";
$headers .= 'To: '.$toList."\n";
$headers .= 'Return-Path: '.$this->email."\n";
$headers .= 'MIME-Version: 1.0' ."\n";
$headers .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '"' . "\n\n";
$headers .= $body_simple . "\n";
$headers .= '--' . $boundary . "\n";
$headers .= 'Content-Type: text/plain; charset=UTF-8' ."\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\n";
$headers .= $body_plain . "\n";
$headers .= '--' . $boundary . "\n";
$headers .= 'Content-Type: text/HTML; charset=UTF-8' ."\n";
$headers .= 'Content-Transfer-Encoding: 8bit'. "\n\n";
$headers .= $body_html . "\n";
$headers .= '--' . $boundary . "--\n";

return mail('',$subject,'',$headers);

Nemám teď čas studovat detaily, ale třeba bude někdo vědět víc …

před 9 lety

David Grudl
founder | 6706
+
0
-

Jakub Šulák napsal(a):

Hlásím „asi bug“:

Subject se nastavuje automaticky z <title>.
Pokud je však v title {$abc}, tak se asi nevyhodnotí, nebo se každopádně poruší hlavička mailu.

Chtělo by to podrobnější report…

před 9 lety

David Grudl
founder | 6706
+
0
-

LeonardoCA napsal(a):

Taky mám menší problém, MS Outlook 2007 po zaslání html mailu zobrazí nejdříve plain text a pak html kód jako plain text. Zkoušel jsem zaslat stejný mail s jednoduchou třídou, kterou jsem si psal v únoru a jediný zásadní rozdíl ve výstupech který jsem našel je, že má třída posílá plain text i po ‚Content-Type: multipart/alternative;‘. To jsem někde vyčetl na netu a tuším, že i google mail formátuje odchozí zprávy podobně.

Zkus prosím nahradit v souboru Mail.php řádek $mail->setBody(NULL); za $mail->setEncoding(self::ENCODING_8BIT); a vyzkoušej, jestli to pomůže.

před 8 lety

krteczek_
Člen | 1
+
0
-

Jen bych rád připomenul pro ty, kteří dumají nad tím, proč se jim nevypisují obsahy proměnných do templatů při generování emailů, že je nutno registrovat patřičné filtr(y) [ne každý generuje templaty pro mail v presenteru];)

Malý příklad metody:

<?php
    public static function sendRegistrationMail($invoke, $email) {
        try {
            $mail = new NMail();

            //Nastavíme template
            $tpl = new NTemplate();

            // registrace filtru
            $tpl->registerFilter('Nette\Templates\NCurlyBracketsFilter::invoke');

            $tpl->setFile(APP_DIR."/templates/Mails/sendRegistrationMail.phtml");

            $mail->setFrom(MAIL_FROM); // od
            $mail->addTo($email); // komu

            $tpl->title = $invoke->texts['regMailTitle'];
            $tpl->contents = $invoke->texts['regMailContents'];

            $mail->setSubject($invoke->texts['regMailTitle']);

            $mail->setHtmlBody($tpl);

            $mail->send();
            return true;
        } catch(InvalidStateException $err) {
            return $err;
        }
    }
?>

před 8 lety

xzajic
Člen | 19
+
0
-

generuji templaty pro mail v presenteru a stejně musím registrovat filtry a helpery. Nevím, jestli je to chyba nebo vlastnost, ale bez toho to nejede.

před 8 lety

PetrP
Člen | 587
+
0
-

xzajic napsal(a):

generuji templaty pro mail v presenteru a stejně musím registrovat filtry a helpery. Nevím, jestli je to chyba nebo vlastnost, ale bez toho to nejede.

Mužeš si ho vytvářet přes $presenter->createTemplate() a budeš tam mít stejné filtry jako v presenteru. (Tedy jestli si přidáváš filtry správně v templatePrepareFilters a né třeba v startupu). Ještě by si mohl i (clone) $this->template (budou tam i parametry které si do té doby přidal; musíš udělat před renderováním)

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Napsal jsem mírně propagační článek Dokonalý kontaktní formulář za 10 minut :)

před 8 lety

redhead
Člen | 1315
+
0
-

hezký návod, jen pár otázek:

  1. proč setuješ flash message po redirectu? Tam by se kód po volání redirect neměl dostat.
  2. na co je proměnná $req v sendMail metodě? Není nikde využita.

Editoval redhead (17. 9. 2009 22:34)

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

redhead napsal(a):

hezký návod, jen pár otázek:

  1. proč setuješ flash message po redirectu? Tam by se kód po volání redirect neměl dostat.
  2. na co je proměnná $req v sendMail metodě? Není nikde využita.
  1. Sorry, má to být samozřejmě prohozené.
  2. Pozůstatek z doby, kdy jsem do šablony házel i všelijaké info o uživateli (user-agent, IP adresa, hostname…).

Oboje jsem opravil.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Dnes jsem to pustil na „ostrou“ e-mailovou adresu a zpráva prý přišla (do Outlook Express) v takovéto podobě:

=?UTF-8?Q?=20formul=C3=A1ra?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Date: Fri, 18 Sep 2009 15:30:17 +0200
From: =?UTF-8?Q?Peter=20Sk=C3=BA=C5=A1ka?= <reguli.peter@gmail.com>
Message-ID: <207c2ed1a7ddcdb25d7fcb8c1639e658@www.intermont-reguli.sk>
Content-Type: multipart/alternative;
boundary="--------a0263df5185113d5ebaca871a3c34797"

----------a0263df5185113d5ebaca871a3c34797
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

NovĂĄ zprĂĄva z kontaktnĂho formulĂĄĹ�e!

Meno: Peter Skúťka
E-mail: reguli.peter@gmail.com
Text zprĂĄvy:

Chceli by sme vam napisat to a to.
----------a0263df5185113d5ebaca871a3c34797
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<h3>NovĂĄ zprĂĄva z kontaktnĂho formulĂĄĹ�e!</h3>

<ul>
<li><strong>Meno:</strong> Peter Skúťka</li>
<li><strong>E-mail:</strong> <a href="mailto:reguli.peter@gmail.com">reguli.peter@gmail.com</a></li>
</ul>

<h4>Text zprĂĄvy:</h4>


<p>Chceli by sme vam napisat to a to.</p>

----------a0263df5185113d5ebaca871a3c34797--

U mě to při testování bylo v pořádku, netuší někdo, v čem by mohl být problém? Revize je (před nočními updaty) nejnovější, musel jsem tam totiž dávat prefixed verzi.

Editoval LastHunter (18. 9. 2009 15:51)

před 8 lety

kravčo
Člen | 723
+
0
-

Vyzerá to rovnako ako už hlásený bug v Nette\Mail (ondrique & Honza M.), skontroluj si, či máš na serveri naozaj najnovšiu verziu Nette a či Nette/Mail/MailMimePart.php neobsahuje self::EOL . ' ' prípadne v minified verzii Nette/loader.php self::EOL.' ', tiež skús zbehnúť test, ktorý som tam napísal.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Updatnul jsem revizi Nette, problém ale přetrvává :/ Zkoušel jsem pustit i test, na localhostu i na serveru PASS.

Přišel opět takový mail:

=?UTF-8?Q?=20formul=C3=A1ra?=
MIME-Version: 1.0
X-Mailer: Nette Framework
Date: Fri, 18 Sep 2009 16:22:29 +0200
From: =?UTF-8?Q?Ond=C5=99ej=20Mirtes?= <ondrej@mirtes.cz>
Message-ID: <9aaa55048b2cff711f92188a335da802@www.intermont-reguli.sk>
Content-Type: multipart/alternative;
boundary="--------9730d9c054228b968d22f609c564f5da"

----------9730d9c054228b968d22f609c564f5da
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

NovĂĄ zprĂĄva z kontaktnĂho formulĂĄĹ�e!

Meno: Ond�ej Mirtes
E-mail: ondrej@mirtes.cz
Text zprĂĄvy:

TestovacĂ zprĂĄva.

+Ä�ĹĄÄ�Ĺ�ŞýåĂĂŠ
----------9730d9c054228b968d22f609c564f5da
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<h3>NovĂĄ zprĂĄva z kontaktnĂho formulĂĄĹ�e!</h3>

<ul>
<li><strong>Meno:</strong> Ond�ej Mirtes</li>
<li><strong>E-mail:</strong> <a href="mailto:ondrej@mirtes.cz">ondrej@mirtes.cz</a></li>
</ul>

<h4>Text zprĂĄvy:</h4>


<p>TestovacĂ zprĂĄva.</p>

<p>+Ä�ĹĄÄ�Ĺ�ŞýåĂĂŠ</p>

----------9730d9c054228b968d22f609c564f5da--

Samotné vytváření e-mailu není nic zvláštního:

protected function createComponentContactForm() {
    $form = new BaseForm;

    $form->addText('name', 'Vaše meno')
        ->addRule(NForm::FILLED, 'Vyplňte vaše meno');

    $form->addText('email', 'Váš e-mail')
        ->addRule(NForm::FILLED, 'Vyplňte váš e-mail')
        ->addRule(NForm::EMAIL, 'E-mail má nesprávný tvar');

    $form->addTextarea('text', 'Správa')
        ->addRule(NForm::FILLED, 'Vyplňte správu');

    $form->addSubmit('okSubmit', 'Odeslat');

    $form->onSubmit[] = array($this, 'contactFormSubmitted');

    return $form;
}

public function contactFormSubmitted(BaseForm $form) {
    try {
        $this->sendMail($form->getValues());
        $this->flashMessage('Správa úspěšně odoslána!');
        $this->redirect('this');
    } catch (IOException $e) {
        $form->addError($e->getMessage());
    }
}

private function sendMail($values) {
    $mail = new NMail;

    $settings = NEnvironment::getConfig('mail');

    $mail->setSubject('Nová správa z kontaktného formulára');
    $mail->setFrom($values['email'], $values['name']);
    $mail->addTo($settings->to, $settings->toName);

    $template = $this->createTemplate();
    $template->setFile(NEnvironment::getVariable('templatesDir') . '/Mail.phtml');

    $template->name = $values['name'];
    $template->email = $values['email'];
    $template->text = $values['text'];

    $mail->setHtmlBody($template);

    try {
        $mail->send();
    } catch (InvalidStateException $e) {
        throw new IOException('Nepodařilo se odeslat e-mail, zkuste to prosím za chvíli.');
    }
}

A šablona:

<h3>Nová zpráva z kontaktního formuláře!</h3>

<ul>
    <li><strong>Meno:</strong> {$name}</li>
    <li><strong>E-mail:</strong> <a href="mailto:{$email}">{$email}</a></li>
</ul>

<h4>Text zprávy:</h4>

{!$text |texyPublic}

Editoval LastHunter (18. 9. 2009 16:32)

před 8 lety

Honza Marek
Člen | 1674
+
0
-

kravčo: Neměl jsem stejný bug jako ondrique. Nefungovalo mi to ani s nejnovější vývojovou verzí a ten test jsem omylem zkoušel na localhostu, kde jsem měl ještě starší nette, takže jsem ti pak poslal špatný výsledek.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Honza M. napsal(a):

kravčo: Neměl jsem stejný bug jako ondrique. Nefungovalo mi to ani s nejnovější vývojovou verzí a ten test jsem omylem zkoušel na localhostu, kde jsem měl ještě starší nette, takže jsem ti pak poslal špatný výsledek.

Tak máš asi to samé co já. Vyřešils to nějak?

před 8 lety

Honza Marek
Člen | 1674
+
0
-

Dal jsem kratší předmět :-D

před 8 lety

David Grudl
founder | 6706
+
0
-

Tyhle chyby se poměrně těžko takhle nadálku řeší, doporučil bych tento postup:

  1. vytvořte email v Nette a uložte do souboru
  2. pokuste se tentýž email vytvořit v programu, kde to nefunguje a jeho zdrojový soubor uložte do souboru
  3. oba soubory porovnejte (porovnávejte i whitespaces)

Do fóra nejlépe dávejte odkazy na stažení vygenerovaných emailů, důležitá je totiž jejich binární podoba.

ad bod 1) pro uložení lze použít tento kód

Mail::$defaultMailer = 'FileMailer';

class FileMailer implements IMailer
{
    function send(Mail $mail)
    {
        file_put_contents('email.dat', $mail->generateMessage());
    }
}

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Oboje je z prefixed verze, na websupport.sk běží rozšíření HTTP.

A jak uložit e-mail do této podoby v Outlook Express fakt netuším. Zkoušeli jsme eml, ale prostě to není tento formát.


EDIT: Délka předmětu to u mě také řeší :o)

Editoval LastHunter (18. 9. 2009 18:52)

před 8 lety

Cifro
Člen | 245
+
0
-

LastHunter napsal(a):

na websupport.sk běží rozšíření HTTP.

Off topic: keď požiadaš oni ťa prehodia na iný stroj kde nie je rozšírenie http a ani eAccelerator. Lenže potom namiesto verzie 5.2.9 bude 5.2.6.

před 8 lety

Ondřej Mirtes
Člen | 1539
+
0
-

Cifro napsal(a):

LastHunter napsal(a):

na websupport.sk běží rozšíření HTTP.

Off topic: keď požiadaš oni ťa prehodia na iný stroj kde nie je rozšírenie http a ani eAccelerator. Lenže potom namiesto verzie 5.2.9 bude 5.2.6.

Teď už je to jedno, přidávání N do zdrojáků jsem už absolvoval :) Na požadavek vypnutí HTTP mi odpověděli toto:

zial nie je to technicky mozne vypnut iba pre jednu domenu jedine riesenie je asi ze si premenujete tie nazvy u Vas v kode

Žádný přesun jinam mi nenabídli.

před 8 lety

Patrik Votoček
Člen | 2249
+
0
-

možná to celé souvisí s tím že Nette nezalomí řádek s předmětem. A tak překročí u RFC 2047 max. délku řákdu 75znaků.Blbost Nette na to myslí!!!

Editoval vrtak-cz (18. 9. 2009 20:02)

před 8 lety

Patrik Votoček
Člen | 2249
+
0
-

Beru zpět to co jsem napsal před chvilkou… Trochu po tom pátrám můžeš prosím zkusit jestli bude fungovat tenhle patch? (Je to jenom pokus!!!)

před 8 lety

kravčo
Člen | 723
+
0
-

Pri bugu v Nette\Mail fungovalo riešenie v jednom prípade (ondrique). Teraz sa tomu dosť divím, najmä po tom, čo som si prečítal na bugs.python.org: #1974 a #1645148 a na viacerích fórach súvisiacich s knižnicami na posielanie mailov.

Vraj má Thunderbird i Outlook problémy so správami, kde sa dlhé hlavičky zalamujú tabulátorom, pričom medzeru v pohode zvládnu. Hovorí sa síce len o ASCII hlavičkách, no problém s tabulátorom by mohol súvisieť aj s tými kódovanými. Aj preto je mi záhadou, ako to, že riešenie u ondriqua zabralo… možno tiež skrátil predmet…

Prosím vás teda (Honza M. i LastHunter), skúste či tieto problémy spôsobuje i foldovanie medzerou – v súbore Nette/Mail/MailMimePart.php nahraďte všetky (štyri) výskyty "\t → `" `.

diff --git a/Nette/Mail/MailMimePart.php b/Nette/Mail/MailMimePart.php
index d677e74..0f94006 100644
--- a/Nette/Mail/MailMimePart.php
+++ b/Nette/Mail/MailMimePart.php
@@ -151,7 +151,7 @@ class MailMimePart extends /*Nette\*/Object
                    $email = " <$email>";
                }
                if ($len + strlen($email) + 1 > self::LINE_LENGTH) {
-                   $s .= self::EOL . "\t";
+                   $s .= self::EOL . " ";
                    $len = 1;
                }
                $s .= "$email,";
@@ -267,7 +267,7 @@ class MailMimePart extends /*Nette\*/Object
        foreach ($this->headers as $name => $value) {
            $output .= $name . ': ' . $this->getEncodedHeader($name);
            if ($this->parts && $name === 'Content-Type') {
-               $output .= ';' . self::EOL . "\tboundary=\"$boundary\"";
+               $output .= ';' . self::EOL . " boundary=\"$boundary\"";
            }
            $output .= self::EOL;
        }
@@ -340,7 +340,7 @@ class MailMimePart extends /*Nette\*/Object
            if ($l = strspn($s, $range, $pos)) {
                while ($len + $l > self::LINE_LENGTH - 2) { // 2 = length of suffix ?=
                    $lx = self::LINE_LENGTH - $len - 2;
-                   $o .= substr($s, $pos, $lx) . '?=' . self::EOL . "\t" . $prefix;
+                   $o .= substr($s, $pos, $lx) . '?=' . self::EOL . " " . $prefix;
                    $pos += $lx;
                    $l -= $lx;
                    $len = strlen($prefix) + 1;
@@ -353,7 +353,7 @@ class MailMimePart extends /*Nette\*/Object
                $len += 3;
                // \xC0 tests UTF-8 character boudnary; 9 is reserved space for 4bytes UTF-8 character
                if (($s[$pos] & "\xC0") !== "\x80" && $len > self::LINE_LENGTH - 2 - 9) {
-                   $o .= '?=' . self::EOL . "\t" . $prefix;
+                   $o .= '?=' . self::EOL . " " . $prefix;
                    $len = strlen($prefix) + 1 + 3;
                }
                $o .= '=' . strtoupper(bin2hex($s[$pos]));

před 8 lety

Bernard Williams
Člen | 207
+
0
-

Nazdárek,

nevím, jestli se to někde řešilo (na fóru jsem to nenašel), ale napadla mě jedna věc.

Co změnit chování odesílání e-mailů na vývojovém serveru? Nevím jak je to u ostatních, ale v mém případě na všech vývojových serverech (tím myslím jak localhost, tak i přímo servery určené na vývoj) je zasílání e-mailů nežádoucí – nehledě na to, že na localhostu mi to ani nefunguje.

Proto bych navrhl, aby na vývojovém serveru (DEVELOPMENT) metoda $mail->send(); e-mail neodeslala a ale pouze vytvořil jakousi zprávu (log), informující uživatele, že kdyby se aplikace nacházela na ostrém serveru, tak by došlo k odeslání e-mailu.

Tuto zprávu (log) bych si představoval jako nějakou tabulky (popř. více tabulek podle počtu e-mailů), která by obsahovala základní informace (from, to, subject atd.) a tělo zprávy. Tato tabulka by byla absolutně pozicována (0,0) a překrývala by všechen obsah stránky. Také by obsahovala JS odkaz, který by ji po zkontrolování zneviditelnil.

Zatím to řeším zakomentováním metody $mail->send(); (popř. podmínkou isProduction), ale i tak to musím otestovat na ostrém serveru, abych měl jistotu, že obsah e-mailu odpovídá zadání.

Děkuji
Bernard

před 8 lety

Patrik Votoček
Člen | 2249
+
0
-

Udělej si vlastní SendmailMailer který to bude ukládat právě do logu… A v config.ini si ho zapni pro development…

před 8 lety

Roman Ožana
Člen | 52
+
0
-

Třebas se někomu bude hodit můj EmailWithTemplate class

class BaseMailPresenter extends BasePresenter {

}
/**
 * Send emails with html template (using latte filter)
 */
class MailWithTamplate extends Mail {

  /** @var Template */
  public $template = null;

  /**
   * Create new email with template
   * @param mixed $tamplate Template object or file path to template
   */
  function __construct($template = null) {
    parent::__construct();

    if ($template instanceof Template) {
      $this->template = $template;
    } elseif (is_string($template)) {
      $this->setTemplateFile($template);
    }

  }
  /**
   * Set template file
   * @param string $file
   */
  public function setTemplateFile($file) {
    $presenter = new BaseMailPresenter(); // or can be instance of BasePresenter unless isn't abstract class

    if (is_null($this->template)) {
      $this->template = $presenter->getTemplate(); // set template
    }

    // autodetect template
    if (!is_file($file)) {
      $files = $presenter->formatTemplateFiles(Environment::getApplication()->getPresenter()->getName(), $file);
      foreach ($files as $file) {
        $file = str_replace('templates/', 'templates/Mails/', $file); // add Mails after template
        if (is_file($file)) {
          break;
        }
      }
    }

    $this->template->setFile($file); // direct name select
  }
    public function send() {
    // set template as body
    if (!is_null($this->template)) {
      $this->setHtmlBody($this->template);
    }
    parent::send();
  }
}

// pouziti parametr muze byt cesta / jmeno nebo Template object

$mail = new MailWithTamplate('template');

Editoval Roman Ožana (15. 1. 2010 14:50)

před 8 lety

Ondřej Brejla
Člen | 748
+
0
-

Zaražte mě pokud se mýlím, ale neumí náhodou Nette\Mail nette šablony již v základu? ;-)

před 8 lety

Honza Marek
Člen | 1674
+
0
-

Jo..

před 8 lety

Roman Ožana
Člen | 52
+
0
-

To je pravda Mail Template umí, ale pokud vím, tak musíte vždy ručně nastavit cestu k template (viz). Tahle class si soubory automaticky najde, podobně jako Presenter si hledá Template k jednotlivým View.

V podstatě máte tři možnosti, class poslat přímo instanci Template, nebo ji zadat celou cestu k template a nebo stačí prostě poslat název souboru bez phtml a třída si ji najde v adresáři např.

$mail = new MailWithTamplate('mujmail');

class pak hledá tyhle soubory

  • {$appdir}/Module<name>/templates/Mail/<PresenterName>/mujmail.phtml
  • {$appdir}/templates/Mail/<PresenterName>.mujmail.phtml
  • {$appdir}/templates/Mail/<PresenterName>/mujmail.phtml

Pokud to nějaká nová verze umí podobně, tak si ji prostě budu muset stáhnout :)

Editoval Roman Ožana (15. 1. 2010 23:09)