- Mobile responsive CSS (touch targets 44px, iOS anti-zoom, reduced motion) - Vitest setup s 39 testy (formatters, attendanceHelpers, useTableSort) - Klavesove zkratky (Shift+? napoveda, Ctrl+S ulozit, navigace) - Drag & drop pro polozky nabidek (@dnd-kit, SortableRow, useSortableList) - Univerzalizace: odstraneni BOHA brandingu z UI, emailu, PDF - Smazany nepotrebne soubory (deploy.sh, AUTH_SYSTEM.md, example_design, .htaccess) - CORS konfigurovatelny pres env promennou Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
46 lines
1.2 KiB
PHP
46 lines
1.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Email Helper
|
|
*
|
|
* Sends emails via PHP mail() function.
|
|
* Configuration via .env variables.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
class Mailer
|
|
{
|
|
/**
|
|
* Send an email
|
|
*
|
|
* @param string $to Recipient email address
|
|
* @param string $subject Email subject (plain text, will be UTF-8 encoded)
|
|
* @param string $htmlBody HTML email body
|
|
* @param string|null $replyTo Optional reply-to address
|
|
* @return bool True if sent successfully
|
|
*/
|
|
public static function send(string $to, string $subject, string $htmlBody, ?string $replyTo = null): bool
|
|
{
|
|
$fromEmail = env('SMTP_FROM_EMAIL', env('CONTACT_EMAIL_FROM', 'web@boha-automation.cz'));
|
|
$fromName = env('SMTP_FROM_NAME', 'System');
|
|
|
|
$encodedSubject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
|
|
|
|
$headers = "MIME-Version: 1.0\r\n";
|
|
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
|
|
$headers .= "From: $fromName <$fromEmail>\r\n";
|
|
if ($replyTo) {
|
|
$headers .= "Reply-To: $replyTo\r\n";
|
|
}
|
|
|
|
$sent = mail($to, $encodedSubject, $htmlBody, $headers);
|
|
|
|
if (!$sent) {
|
|
error_log("Mailer error: mail() failed for recipient $to");
|
|
}
|
|
|
|
return $sent;
|
|
}
|
|
}
|