Mailer — Použití
Základní odeslání
use Core\Mailer\MailerFactory;
use Core\Mailer\MessageBuilder;
$message = MessageBuilder::compose()
->to('prijemce@firma.cz')
->subject('Předmět zprávy')
->html('<p>Obsah e-mailu</p>')
->build();
MailerFactory::create()->send($message);
Kontaktní formulář
Z app/website/tags/form/contact/action.php — odeslání notifikace na interní e-mail webu s Reply-To nastavením na odesílatele formuláře:
use Core\Mailer\MailerFactory;
use Core\Mailer\MessageBuilder;
use Core\Template\Template;
use function Core\Array\getArrayValue;
$tplEmail = new Template();
$tplEmail->data('data', $formData);
$tplEmail->data('url_app', $_SERVER['HTTP_HOST']);
$mailBody = $tplEmail->draw(__DIR__ . '/email.tpl', true);
$message = MessageBuilder::compose()
->replyTo($formData['email']) // odpověď jde zákazníkovi
->to(getArrayValue(CONFIG, 'email:contact')) // příjemce z konfigurace
->subject('Kontaktní formulář (' . $_SERVER['HTTP_HOST'] . ')')
->html($mailBody)
->build();
MailerFactory::create()->send($message);
Reset hesla
Z app/Modules/User/Auth/ForgottenPassword/ForgottenPasswordService.php — odeslání tokenu pro změnu hesla:
use Core\Mailer\MailerFactory;
use Core\Mailer\MessageBuilder;
use Core\Template\Template;
use Core\Cache\Cache;
use function Core\String\createCode;
$token = createCode(50);
Cache::set('change-password/' . $token, $userId, 15 * 60);
$tpl = new Template();
$tpl->data('href', URL_SERVER . '/auth/change-password/' . $token);
$html = $tpl->draw(__DIR__ . '/templates/forgotten-password-email_cs.tpl', true);
$message = MessageBuilder::compose()
->to($email)
->subject('Změna hesla')
->html($html)
->build();
MailerFactory::create()->send($message);
Přihlášení bez hesla (magic link + OTP)
Z app/Modules/User/Auth/Passwordless/PasswordlessService.php — jeden e-mail obsahuje OTP kód i magic link:
use Core\Mailer\MailerFactory;
use Core\Mailer\MessageBuilder;
use Core\Template\Template;
$tpl = new Template();
$tpl->data('code', $code); // 6místný OTP
$tpl->data('magicLink', $magicLink); // jednorázový přihlašovací odkaz
$tpl->data('expiresAt', date('d.m.Y H:i', time() + 900));
$html = $tpl->draw(__DIR__ . '/email_cs.tpl', true);
$message = MessageBuilder::compose()
->to($email)
->subject('Přihlášení')
->html($html)
->build();
MailerFactory::create()->send($message);
Příloha
$message = MessageBuilder::compose()
->to('prijemce@firma.cz')
->subject('Faktura č. 2024001')
->html('<p>V příloze zasíláme fakturu.</p>')
->build();
$message->attachments = [
['name' => 'faktura-2024001.pdf', 'file' => '/data/faktury/faktura-2024001.pdf'],
];
MailerFactory::create()->send($message);
Ecomail šablona
Odeslání transakčního e-mailu přes Ecomail s předdefinovanou šablonou:
use Core\Mailer\MailerFactory;
use Core\Mailer\MessageBuilder;
$message = MessageBuilder::compose()
->to('prijemce@firma.cz')
->subject('Potvrzení objednávky')
->build();
$message->templateId = 42; // ID šablony v Ecomailu
$message->variables = [
'ORDER_NUMBER' => '2024-0042',
'TOTAL_PRICE' => '1 490 Kč',
'CUSTOMER' => 'Jan Novák',
];
MailerFactory::create()->send($message);
Více příjemců, CC, BCC
$message = MessageBuilder::compose()
->to('a@firma.cz, b@firma.cz') // CSV string
->cc('manager@firma.cz')
->bcc('archiv@firma.cz')
->subject('Interní oznámení')
->html($html)
->build();
MailerFactory::create()->send($message);
Ošetření chyby
Transport hodí RuntimeException při selhání odeslání. Doporučený vzor:
try {
MailerFactory::create()->send($message);
} catch (\RuntimeException $e) {
Logger::error('Odeslání e-mailu selhalo: ' . $e->getMessage());
// vrať chybovou odpověď uživateli
}
Test redirect
Pokud je v configu zapnut test režim, MessageBuilder::to() automaticky přesměruje příjemce:
# config/websiteN.yaml
email:
on_test: true
test: dev@firma.cz
Všechny zprávy odeslané přes ->to() dorazí na dev@firma.cz, ->cc() a ->bcc() jsou potlačeny.