Skip to content

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);

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.