mirror of
https://github.com/xodivorce/mailer-dev-console.git
synced 2025-12-19 15:53:00 +05:30
(chore): initial MVP release
This commit is contained in:
108
htdocs/app/mail/mailer.php
Normal file
108
htdocs/app/mail/mailer.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require_once __DIR__ . '/../../config/env.php';
|
||||
require_once __DIR__ . '/templates/loader.php';
|
||||
|
||||
/**
|
||||
* Build and optionally send mail from a file-based template.
|
||||
*/
|
||||
function sendMailFromTemplate(string $templateKey, bool $previewOnly = false): bool
|
||||
{
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
$email = $_ENV['MAIL_TO'];
|
||||
$username = $_ENV['USERNAME'];
|
||||
|
||||
try {
|
||||
$mail->isSMTP();
|
||||
$mail->Host = $_ENV['MAIL_HOST'];
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = $_ENV['MAIL_USERNAME'];
|
||||
$mail->Password = $_ENV['MAIL_PASSWORD'];
|
||||
$mail->SMTPSecure = $_ENV['MAIL_ENCRYPTION'];
|
||||
$mail->Port = (int) $_ENV['MAIL_PORT'];
|
||||
|
||||
$mail->setFrom($_ENV['MAIL_FROM'], $_ENV['MAIL_FROM_NAME']);
|
||||
$mail->addAddress($email, $username);
|
||||
|
||||
$domain = $_ENV['DOMAIN'] ?? 'UNKNOWN DOMAIN';
|
||||
$company = $_ENV['COMPANY_NAME'] ?? 'UNKNOWN COMPANY';
|
||||
$github = $_ENV['GITHUB'] ?? 'UNKNOWN GITHUB';
|
||||
$website = $_ENV['WEBSITE'] ?? 'UNKNOWN WEBSITE';
|
||||
$projectStartYear = $_ENV['PROJECT_START_YEAR'] ?? 2025;
|
||||
$currentYear = (int) date('Y');
|
||||
$startYear = min((int) $projectStartYear, $currentYear);
|
||||
$yearText = ($currentYear > $startYear)
|
||||
? $startYear . '-' . substr((string) $currentYear, -2)
|
||||
: $startYear;
|
||||
|
||||
// context passed to template files
|
||||
$ctx = [
|
||||
'email' => $email,
|
||||
'username' => $username,
|
||||
'domain' => $domain,
|
||||
'company' => $company,
|
||||
'github' => $github,
|
||||
'website' => $website,
|
||||
'yearText' => $yearText,
|
||||
];
|
||||
|
||||
// 🔥 load subject + body from the selected template file
|
||||
$tpl = loadMailTemplate($templateKey, $ctx);
|
||||
|
||||
$mail->CharSet = 'UTF-8';
|
||||
$mail->Encoding = 'base64';
|
||||
$mail->isHTML(true);
|
||||
$mail->Subject = $tpl['subject'];
|
||||
$mail->Body = $tpl['body'];
|
||||
|
||||
// expose everything for preview
|
||||
$GLOBALS['MAIL_PREVIEW_SUBJECT'] = $mail->Subject;
|
||||
$GLOBALS['MAIL_PREVIEW_BODY'] = $mail->Body;
|
||||
$GLOBALS['MAIL_PREVIEW_TO'] = $email;
|
||||
$GLOBALS['MAIL_PREVIEW_USERNAME'] = $username;
|
||||
$GLOBALS['MAIL_PREVIEW_DOMAIN'] = $domain;
|
||||
$GLOBALS['MAIL_PREVIEW_COMPANY'] = $company;
|
||||
$GLOBALS['MAIL_PREVIEW_FROM'] = $_ENV['MAIL_FROM'];
|
||||
$GLOBALS['MAIL_PREVIEW_FROM_NAME'] = $_ENV['MAIL_FROM_NAME'];
|
||||
|
||||
$GLOBALS['MAIL_PREVIEW_MAIL_HOST'] = $_ENV['MAIL_HOST'] ?? null;
|
||||
$GLOBALS['MAIL_PREVIEW_MAIL_USERNAME'] = $_ENV['MAIL_USERNAME'] ?? null;
|
||||
$GLOBALS['MAIL_PREVIEW_MAIL_PORT'] = $_ENV['MAIL_PORT'] ?? null;
|
||||
$GLOBALS['MAIL_PREVIEW_MAIL_ENCRYPTION'] = $_ENV['MAIL_ENCRYPTION'] ?? null;
|
||||
$GLOBALS['MAIL_PREVIEW_PROJECT_START'] = $startYear;
|
||||
$GLOBALS['MAIL_PREVIEW_CURRENT_YEAR'] = $currentYear;
|
||||
$GLOBALS['MAIL_PREVIEW_MAIL_PASSWORD'] = empty($_ENV['MAIL_PASSWORD']) ? 'not set' : '•••• (configured)';
|
||||
|
||||
// template info for UI
|
||||
$GLOBALS['MAIL_PREVIEW_TEMPLATE_KEY'] = $tpl['key'];
|
||||
$GLOBALS['MAIL_PREVIEW_TEMPLATE_LABEL'] = $tpl['label'];
|
||||
$GLOBALS['MAIL_PREVIEW_TEMPLATES_INDEX'] = getMailTemplatesIndex($ctx);
|
||||
|
||||
if ($previewOnly) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$mail->send();
|
||||
return true;
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log('Mailer Error: ' . $mail->ErrorInfo);
|
||||
return false;
|
||||
} catch (\Throwable $e) {
|
||||
error_log('Mailer Exception: ' . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Backwards-compatible wrapper.
|
||||
* Default template: 'quary'
|
||||
*/
|
||||
function sendAccountCreationMail(bool $previewOnly = false, string $templateKey = 'quary'): bool
|
||||
{
|
||||
return sendMailFromTemplate($templateKey, $previewOnly);
|
||||
}
|
||||
Reference in New Issue
Block a user