From ceec228718b9a1028fa8d5de73a18765443c51a5 Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Sun, 27 Jul 2025 18:05:48 +0200 Subject: [PATCH] Util/Mails * make sendMail a member of Util * move mail templates from strings to template files * enabled debug output to page --- includes/utilities.php | 50 +++++++++++++++++++++++++++ localization/locale_dede.php | 8 ++--- localization/locale_enus.php | 8 ++--- localization/locale_eses.php | 8 ++--- localization/locale_frfr.php | 8 ++--- localization/locale_ruru.php | 8 ++--- localization/locale_zhcn.php | 8 ++--- pages/account.php | 41 ++++++++-------------- pages/genericPage.class.php | 16 +++++++++ template/mails/activate-account_0.tpl | 10 ++++++ template/mails/activate-account_2.tpl | 10 ++++++ template/mails/activate-account_3.tpl | 10 ++++++ template/mails/activate-account_4.tpl | 10 ++++++ template/mails/activate-account_6.tpl | 10 ++++++ template/mails/activate-account_8.tpl | 10 ++++++ template/mails/recover-user_0.tpl | 7 ++++ template/mails/recover-user_2.tpl | 7 ++++ template/mails/recover-user_3.tpl | 7 ++++ template/mails/recover-user_4.tpl | 7 ++++ template/mails/recover-user_6.tpl | 7 ++++ template/mails/recover-user_8.tpl | 7 ++++ template/mails/reset-password_0.tpl | 7 ++++ template/mails/reset-password_2.tpl | 7 ++++ template/mails/reset-password_3.tpl | 7 ++++ template/mails/reset-password_4.tpl | 7 ++++ template/mails/reset-password_6.tpl | 7 ++++ template/mails/reset-password_8.tpl | 7 ++++ 27 files changed, 236 insertions(+), 63 deletions(-) create mode 100644 template/mails/activate-account_0.tpl create mode 100644 template/mails/activate-account_2.tpl create mode 100644 template/mails/activate-account_3.tpl create mode 100644 template/mails/activate-account_4.tpl create mode 100644 template/mails/activate-account_6.tpl create mode 100644 template/mails/activate-account_8.tpl create mode 100644 template/mails/recover-user_0.tpl create mode 100644 template/mails/recover-user_2.tpl create mode 100644 template/mails/recover-user_3.tpl create mode 100644 template/mails/recover-user_4.tpl create mode 100644 template/mails/recover-user_6.tpl create mode 100644 template/mails/recover-user_8.tpl create mode 100644 template/mails/reset-password_0.tpl create mode 100644 template/mails/reset-password_2.tpl create mode 100644 template/mails/reset-password_3.tpl create mode 100644 template/mails/reset-password_4.tpl create mode 100644 template/mails/reset-password_6.tpl create mode 100644 template/mails/reset-password_8.tpl diff --git a/includes/utilities.php b/includes/utilities.php index 5ee41de7..4e682350 100644 --- a/includes/utilities.php +++ b/includes/utilities.php @@ -1228,6 +1228,56 @@ abstract class Util return array_values($menu); } + + public static function sendMail(string $email, string $tplFile, array $vars = [], int $expiration = 0) : bool + { + if (!self::isValidEmail($email)) + return false; + + $template = ''; + if (file_exists('template/mails/'.$tplFile.'_'.User::$preferedLoc->value.'.tpl')) + $template = file_get_contents('template/mails/'.$tplFile.'_'.User::$preferedLoc->value.'.tpl'); + else + { + foreach (Locale::cases() as $l) + { + if (!$l->validate() || !file_exists('template/mails/'.$tplFile.'_'.$l->value.'.tpl')) + continue; + + $template = file_get_contents('template/mails/'.$tplFile.'_'.$l->value.'.tpl'); + break; + } + } + + if (!$template) + { + trigger_error('Util::SendMail() - mail template not found: '.$tplFile, E_USER_ERROR); + return false; + } + + [, $subject, $body] = explode("\n", $template, 3); + + $body = Util::defStatic($body); + + if ($vars) + $body = vsprintf($body, $vars); + + if ($expiration) + $body .= "\n\n".Lang::account('tokenExpires', [Util::formatTime($expiration * 1000)])."\n"; + + $subject = Cfg::get('NAME_SHORT').Lang::main('colon') . $subject; + $header = 'From: ' . Cfg::get('CONTACT_EMAIL') . "\n" . + 'Reply-To: ' . Cfg::get('CONTACT_EMAIL') . "\n" . + 'X-Mailer: PHP/' . phpversion(); + + if (Cfg::get('DEBUG') >= LOG_LEVEL_INFO && User::isInGroup(U_GROUP_DEV | U_GROUP_ADMIN)) + { + $_SESSION['debug-mail'] = $email . "\n\n" . $subject . "\n\n" . $body; + return true; + } + + return mail($email, $subject, $body, $header); + } } ?> diff --git a/localization/locale_dede.php b/localization/locale_dede.php index c69dfd03..7acd9059 100644 --- a/localization/locale_dede.php +++ b/localization/locale_dede.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "Benutzernamenanfrage", 'recoverPass' => "Kennwort zurücksetzen: Schritt %s von 2", 'newPass' => "Neues Kennwort", + 'tokenExpires' => "Das Token wird in %s verfallen.", // creation 'register' => "Registrierung: Schritt %s von 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "Kommentare", 'screenshots' => "Screenshots", 'videos' => "Videos", - 'posts' => "Forenbeiträge", - // user mail - 'tokenExpires' => "Das Token wird in %s verfallen.", - 'accConfirm' => ["Kontobestätigung", "Willkommen bei CFG_NAME_SHORT!\r\n\r\nKlicke auf den Link um euren Account zu aktivieren.\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\nFalls Ihr diese Mail nicht angefordert habt kann sie einfach ignoriert werden."], - 'recoverUser' => ["Benutzernamenanfrage", "Folgt diesem Link um euch anzumelden.\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\nFalls Ihr diese Mail nicht angefordert habt kann sie einfach ignoriert werden."], - 'resetPass' => ["Kennwortreset", "Folgt diesem Link um euer Kennwort zurückzusetzen.\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\nFalls Ihr diese Mail nicht angefordert habt kann sie einfach ignoriert werden."] + 'posts' => "Forenbeiträge" ), 'emote' => array( 'notFound' => "Dieses Emote existiert nicht.", diff --git a/localization/locale_enus.php b/localization/locale_enus.php index dca37d71..c1c45ad4 100644 --- a/localization/locale_enus.php +++ b/localization/locale_enus.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "Username Request", 'recoverPass' => "Password Reset: Step %s of 2", 'newPass' => "New Password", + 'tokenExpires' => "This token expires in %s.", // creation 'register' => "Registration - Step %s of 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "Comments", 'screenshots' => "Screenshots", 'videos' => "Videos", - 'posts' => "Forum posts", - // user mail - 'tokenExpires' => "This token expires in %s.", - 'accConfirm' => ["Account Confirmation", "Welcome to CFG_NAME_SHORT!\r\n\r\nClick the Link below to activate your account.\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\nIf you did not request this mail simply ignore it."], - 'recoverUser' => ["User Recovery", "Follow this link to log in.\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\nIf you did not request this mail simply ignore it."], - 'resetPass' => ["Password Reset", "Follow this link to reset your password.\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\nIf you did not request this mail simply ignore it."] + 'posts' => "Forum posts" ), 'emote' => array( 'notFound' => "This Emote doesn't exist.", diff --git a/localization/locale_eses.php b/localization/locale_eses.php index 477d8120..c8b79cf2 100644 --- a/localization/locale_eses.php +++ b/localization/locale_eses.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "Pedir nombre de usuario", 'recoverPass' => "Reiniciar contraseña: Paso %s de 2", 'newPass' => "Nueva Contraseña", + 'tokenExpires' => "Este token expira en %s", // creation 'register' => "Inscripción: Paso %s de 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "Comentarios", 'screenshots' => "Capturas de pantalla", 'videos' => "Vídeos", - 'posts' => "Mensajes en los foros", - // user mail - 'tokenExpires' => "Este token expira en %s", - 'accConfirm' => ["Confirmación de Cuenta", "Bienvenido a CFG_NAME_SHORT!\r\n\r\nHaga click en el enlace siguiente para activar su cuenta.\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\nSi usted no solicitó este correo, por favor ignorelo."], - 'recoverUser' => ["Recuperacion de Usuario", "Siga a este enlace para ingresar.\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\nSi usted no solicitó este correo, por favor ignorelo."], - 'resetPass' => ["Reinicio de Contraseña", "Siga este enlace para reiniciar su contraseña.\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\nSi usted no solicitó este correo, por favor ignorelo."] + 'posts' => "Mensajes en los foros" ), 'emote' => array( 'notFound' => "Este emoticón no existe.", diff --git a/localization/locale_frfr.php b/localization/locale_frfr.php index f31c917b..63597467 100644 --- a/localization/locale_frfr.php +++ b/localization/locale_frfr.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "Demande de nom d'utilisateur", 'recoverPass' => "Changement de mot de passe : Étape %s de 2", 'newPass' => "Nouveau mot de passe", + 'tokenExpires' => "This token expires in %s.", // creation 'register' => "Enregistrement : Étape %s de 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "Commentaires", 'screenshots' => "Captures d'écran", 'videos' => "Vidéos", - 'posts' => "Messages sur le forum", - // user mail - 'tokenExpires' => "This token expires in %s.", - 'accConfirm' => ["Activation de compte", "Bienvenue sur CFG_NAME_SHORT!\r\n\r\nCliquez sur le lien ci-dessous pour activer votre compte.\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\nSi vous n'avez pas demandé cet email, ignorez le."], - 'recoverUser' => ["Récupération d'utilisateur", "Suivez ce lien pour vous connecter.\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\nSi vous n'avez pas demandé cet email, ignorez le."], - 'resetPass' => ["Réinitialisation du mot de passe", "Suivez ce lien pour réinitialiser votre mot de passe.\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\nSi vous n'avez pas fait de demande de réinitialisation, ignorez cet email."] + 'posts' => "Messages sur le forum" ), 'emote' => array( 'notFound' => "[This Emote doesn't exist.]", diff --git a/localization/locale_ruru.php b/localization/locale_ruru.php index 2da19751..c5ee9b80 100644 --- a/localization/locale_ruru.php +++ b/localization/locale_ruru.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "Запрос имени пользователя", 'recoverPass' => "Сброс пароля: Шаг %s из 2", 'newPass' => "New Password", + 'tokenExpires' => "This token expires in %s.", // creation 'register' => "Регистрация: Шаг %s из 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "Комментарии", 'screenshots' => "Скриншоты", 'videos' => "Видео", - 'posts' => "Сообщений на форумах", - // user mail - 'tokenExpires' => "This token expires in %s.", - 'accConfirm' => ["Account Confirmation", "Welcome to CFG_NAME_SHORT!\r\n\r\nClick the Link below to activate your account.\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\nIf you did not request this mail simply ignore it."], - 'recoverUser' => ["User Recovery", "Follow this link to log in.\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\nIf you did not request this mail simply ignore it."], - 'resetPass' => ["Password Reset", "Follow this link to reset your password.\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\nIf you did not request this mail simply ignore it."] + 'posts' => "Сообщений на форумах" ), 'emote' => array( 'notFound' => "[This Emote doesn't exist.]", diff --git a/localization/locale_zhcn.php b/localization/locale_zhcn.php index a14fefb9..b197aa9e 100644 --- a/localization/locale_zhcn.php +++ b/localization/locale_zhcn.php @@ -898,6 +898,7 @@ $lang = array( 'recoverUser' => "用户名需求", 'recoverPass' => "密码重置:步骤 %s / 2", 'newPass' => "新密码", + 'tokenExpires' => "此令牌将在%s过期。", // creation 'register' => "注册 - 步骤 %s / 2", @@ -954,12 +955,7 @@ $lang = array( 'comments' => "评论", 'screenshots' => "截图", 'videos' => "视频", - 'posts' => "论坛帖子", - // user mail - 'tokenExpires' => "此令牌将在%s过期。", - 'accConfirm' => ["账户确认", "欢迎来到CFG_NAME_SHORT!\r\n\r\n点击下方链接以激活您的账户。\r\n\r\nHOST_URL?account=signup&token=%s\r\n\r\n如果您没有请求此邮件,请忽略它。"], - 'recoverUser' => ["用户恢复", "点击此链接登录\r\n\r\nHOST_URL?account=signin&token=%s\r\n\r\n如果您没有请求此邮件,请忽略它。"], - 'resetPass' => ["重置密码", "点击此链接以重置您的密码。\r\n\r\nHOST_URL?account=forgotpassword&token=%s\r\n\r\n如果您没有请求此邮件,请忽略它。"] + 'posts' => "论坛帖子" ), 'emote' => array( 'notFound' => "这个表情不存在。", diff --git a/pages/account.php b/pages/account.php index 9fbff9af..6ab78328 100644 --- a/pages/account.php +++ b/pages/account.php @@ -450,19 +450,18 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup ); if (!$ok) return Lang::main('intError'); - else if ($_ = $this->sendMail(Lang::user('accConfirm', 0), sprintf(Lang::user('accConfirm', 1), $token), Cfg::get('ACC_CREATE_SAVE_DECAY'))) - { - if ($id = DB::Aowow()->selectCell('SELECT id FROM ?_account WHERE token = ?', $token)) - Util::gainSiteReputation($id, SITEREP_ACTION_REGISTER); - // success:: update ip-bans - if (!$ip || $ip['unbanDate'] < time()) - DB::Aowow()->query('REPLACE INTO ?_account_bannedips (ip, type, count, unbanDate) VALUES (?, 1, 1, UNIX_TIMESTAMP() + ?d)', User::$ip, Cfg::get('ACC_FAILED_AUTH_BLOCK')); - else - DB::Aowow()->query('UPDATE ?_account_bannedips SET count = count + 1, unbanDate = UNIX_TIMESTAMP() + ?d WHERE ip = ? AND type = 1', Cfg::get('ACC_FAILED_AUTH_BLOCK'), User::$ip); + if (!Util::sendMail($this->_post['email'], 'activate-account', [$token], Cfg::get('ACC_RECOVERY_DECAY'))) + return Lang::main('intError2', ['send mail']); - return $_; - } + if ($id = DB::Aowow()->selectCell('SELECT id FROM ?_account WHERE token = ?', $token)) + Util::gainSiteReputation($id, SITEREP_ACTION_REGISTER); + + // success:: update ip-bans + if (!$ip || $ip['unbanDate'] < time()) + DB::Aowow()->query('REPLACE INTO ?_account_bannedips (ip, type, count, unbanDate) VALUES (?, 1, 1, UNIX_TIMESTAMP() + ?d)', User::$ip, Cfg::get('ACC_FAILED_AUTH_BLOCK')); + else + DB::Aowow()->query('UPDATE ?_account_bannedips SET count = count + 1, unbanDate = UNIX_TIMESTAMP() + ?d WHERE ip = ? AND type = 1', Cfg::get('ACC_FAILED_AUTH_BLOCK'), User::$ip); } private function doRecoverPass() @@ -471,7 +470,8 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup return $_; // send recovery mail - return $this->sendMail(Lang::user('resetPass', 0), sprintf(Lang::user('resetPass', 1), $token), Cfg::get('ACC_RECOVERY_DECAY')); + if (!Util::sendMail($this->_post['email'], 'reset-password', [$token], Cfg::get('ACC_RECOVERY_DECAY'))) + return Lang::main('intError2', ['send mail']); } private function doResetPass() @@ -502,8 +502,8 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup if ($_ = $this->initRecovery(ACC_STATUS_RECOVER_USER, Cfg::get('ACC_RECOVERY_DECAY'), $token)) return $_; - // send recovery mail - return $this->sendMail(Lang::user('recoverUser', 0), sprintf(Lang::user('recoverUser', 1), $token), Cfg::get('ACC_RECOVERY_DECAY')); + if (!Util::sendMail($this->_post['email'], 'recover-user', [$token], Cfg::get('ACC_RECOVERY_DECAY'))) + return Lang::main('intError2', ['send mail']); } private function initRecovery($type, $delay, &$token) @@ -521,19 +521,6 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup return Lang::main('intError'); } - private function sendMail($subj, $msg, $delay = 300) - { - // send recovery mail - $subj = Cfg::get('NAME_SHORT').Lang::main('colon') . $subj; - $msg .= "\r\n\r\n".sprintf(Lang::user('tokenExpires'), Util::formatTime($delay * 1000))."\r\n"; - $header = 'From: '.Cfg::get('CONTACT_EMAIL') . "\r\n" . - 'Reply-To: '.Cfg::get('CONTACT_EMAIL') . "\r\n" . - 'X-Mailer: PHP/' . phpversion(); - - if (!mail($this->_post['email'], $subj, $msg, $header)) - return sprintf(Lang::main('intError2'), 'send mail'); - } - private function getNext($forHeader = false) { $next = $forHeader ? '.' : ''; diff --git a/pages/genericPage.class.php b/pages/genericPage.class.php index 801f48c0..9a9bf748 100644 --- a/pages/genericPage.class.php +++ b/pages/genericPage.class.php @@ -623,6 +623,22 @@ class GenericPage ); } + // debug output from Util::sendMail + if (isset($_SESSION['debug-mail'])) + { + if (Cfg::get('DEBUG') >= LOG_LEVEL_INFO && User::isInGroup(U_GROUP_DEV | U_GROUP_ADMIN)) + $announcements[65535] = array( + 'parent' => 'announcement-65535', + 'id' => 0, + 'mode' => 0, + 'status' => 1, + 'name' => 'Debug sendmail', + 'style' => 'color: #'.$colors[LOG_LEVEL_INFO].'; font-weight: bold; font-size: 14px; padding-left: 40px; background-image: url('.Cfg::get('STATIC_URL').'/images/announcements/warn-small.png); background-size: 15px 15px; background-position: 12px center; border: dashed 2px #'.$colors[LOG_LEVEL_INFO].';', + 'text' => '[span]'.$_SESSION['debug-mail'].'[/span]' + ); + unset($_SESSION['debug-mail']); + } + // fetch announcements if ($this->pageTemplate['pageName']) { diff --git a/template/mails/activate-account_0.tpl b/template/mails/activate-account_0.tpl new file mode 100644 index 00000000..1c8a64b7 --- /dev/null +++ b/template/mails/activate-account_0.tpl @@ -0,0 +1,10 @@ +# Created: May 2018 +Account Creation +Hey! + +Thanks a lot for your interest in contributing to the site. + +Just click this link to activate your account: +HOST_URL?account=signup&token=%s + +The NAME_SHORT team diff --git a/template/mails/activate-account_2.tpl b/template/mails/activate-account_2.tpl new file mode 100644 index 00000000..b2231aa9 --- /dev/null +++ b/template/mails/activate-account_2.tpl @@ -0,0 +1,10 @@ +# Created: May 2018 +Account Creation +Bonjour ! + +Nous vous remercions chaleureusement pour l'intérêt que vous portez à contribuer à notre site. + +Vous n'avez qu'à cliquer sur le lien ci-dessous pour activer votre compte. +HOST_URL?account=signup&token=%s + +L'équipe NAME_SHORT diff --git a/template/mails/activate-account_3.tpl b/template/mails/activate-account_3.tpl new file mode 100644 index 00000000..42f02a89 --- /dev/null +++ b/template/mails/activate-account_3.tpl @@ -0,0 +1,10 @@ +# Created: May 2018 +Kontoerstellung +Hey! + +Vielen Dank für Euer Interesse an der Mitwirkung bei unserer Webseite. + +Klickt einfach auf den folgenden Link, um Euer Konto zu aktivieren: +HOST_URL?account=signup&token=%s + +Das Team von NAME_SHORT diff --git a/template/mails/activate-account_4.tpl b/template/mails/activate-account_4.tpl new file mode 100644 index 00000000..ab4d78c7 --- /dev/null +++ b/template/mails/activate-account_4.tpl @@ -0,0 +1,10 @@ +# Created by ChatGPT from May 2018 base; locale 0 +账户创建 +你好! + +非常感谢你有兴趣为本站做出贡献。 + +只需点击此链接激活你的账户: +HOST_URL?account=signup&token=%s + +NAME_SHORT 团队敬上 diff --git a/template/mails/activate-account_6.tpl b/template/mails/activate-account_6.tpl new file mode 100644 index 00000000..ff534e75 --- /dev/null +++ b/template/mails/activate-account_6.tpl @@ -0,0 +1,10 @@ +# Created by ChatGPT from May 2018 base; locale 0 +Creación de cuenta +¡Hola! + +Muchas gracias por tu interés en contribuir al sitio. + +Simplemente haz clic en este enlace para activar tu cuenta: +HOST_URL?account=signup&token=%s + +El equipo de NAME_SHORT diff --git a/template/mails/activate-account_8.tpl b/template/mails/activate-account_8.tpl new file mode 100644 index 00000000..cc664c92 --- /dev/null +++ b/template/mails/activate-account_8.tpl @@ -0,0 +1,10 @@ +# Created: May 2018 +Account Creation +Привет! + +Благодарим за ваш интерес по наполнению сайта. + +Для активации вашей учетной записи просто кликните по этой ссылке: +HOST_URL?account=signup&token=%s + +Команда NAME_SHORT. diff --git a/template/mails/recover-user_0.tpl b/template/mails/recover-user_0.tpl new file mode 100644 index 00000000..ffd9daf6 --- /dev/null +++ b/template/mails/recover-user_0.tpl @@ -0,0 +1,7 @@ +# Legacy import +User Recovery +Follow this link to log in. + +HOST_URL?account=signin&token=%s + +If you did not request this mail simply ignore it. diff --git a/template/mails/recover-user_2.tpl b/template/mails/recover-user_2.tpl new file mode 100644 index 00000000..7a3cd742 --- /dev/null +++ b/template/mails/recover-user_2.tpl @@ -0,0 +1,7 @@ +# Legacy import +Récupération d'utilisateur +Suivez ce lien pour vous connecter. + +HOST_URL?account=signin&token=%s + +Si vous n'avez pas demandé cet e-mail, ignorez le. diff --git a/template/mails/recover-user_3.tpl b/template/mails/recover-user_3.tpl new file mode 100644 index 00000000..6d9a2ee9 --- /dev/null +++ b/template/mails/recover-user_3.tpl @@ -0,0 +1,7 @@ +# Legacy import +Benutzernamenanfrage +Folgt diesem Link um euch anzumelden. + +HOST_URL?account=signin&token=%s + +Falls Ihr diese Mail nicht angefordert habt kann sie einfach ignoriert werden. diff --git a/template/mails/recover-user_4.tpl b/template/mails/recover-user_4.tpl new file mode 100644 index 00000000..916df2fc --- /dev/null +++ b/template/mails/recover-user_4.tpl @@ -0,0 +1,7 @@ +# Legacy import +用户恢复 +请点击此链接登录。 + +HOST_URL?account=signin&token=%s + +如果您没有请求此邮件,请忽略它。 diff --git a/template/mails/recover-user_6.tpl b/template/mails/recover-user_6.tpl new file mode 100644 index 00000000..2fbeb1c2 --- /dev/null +++ b/template/mails/recover-user_6.tpl @@ -0,0 +1,7 @@ +# Legacy import +Recuperacion de Usuario +Siga a este enlace para ingresar. + +HOST_URL?account=signin&token=%s + +Si usted no solicitó este correo, por favor ignorelo. diff --git a/template/mails/recover-user_8.tpl b/template/mails/recover-user_8.tpl new file mode 100644 index 00000000..1ad5709c --- /dev/null +++ b/template/mails/recover-user_8.tpl @@ -0,0 +1,7 @@ +# Created by ChatGPT from legacy import; locale 0 +Восстановление пользователя +Перейдите по этой ссылке, чтобы войти в систему. + +HOST_URL?account=signin&token=%s + +Если вы не запрашивали это письмо, просто проигнорируйте его. diff --git a/template/mails/reset-password_0.tpl b/template/mails/reset-password_0.tpl new file mode 100644 index 00000000..d9667e2d --- /dev/null +++ b/template/mails/reset-password_0.tpl @@ -0,0 +1,7 @@ +# Legacy import +Password Reset +Follow this link to reset your password. + +HOST_URL?account=forgotpassword&token=%s + +If you did not request this mail simply ignore it. diff --git a/template/mails/reset-password_2.tpl b/template/mails/reset-password_2.tpl new file mode 100644 index 00000000..6576d3cb --- /dev/null +++ b/template/mails/reset-password_2.tpl @@ -0,0 +1,7 @@ +# Legacy import +Réinitialisation du mot de passe +Suivez ce lien pour réinitialiser votre mot de passe. + +HOST_URL?account=forgotpassword&token=%s + +Si vous n'avez pas fait de demande de réinitialisation, ignorez cet e-mail. diff --git a/template/mails/reset-password_3.tpl b/template/mails/reset-password_3.tpl new file mode 100644 index 00000000..b1edfb6e --- /dev/null +++ b/template/mails/reset-password_3.tpl @@ -0,0 +1,7 @@ +# Legacy import +Kennwortreset +Folgt diesem Link um euer Kennwort zurückzusetzen. + +HOST_URL?account=forgotpassword&token=%s + +Falls Ihr diese Mail nicht angefordert habt kann sie einfach ignoriert werden. diff --git a/template/mails/reset-password_4.tpl b/template/mails/reset-password_4.tpl new file mode 100644 index 00000000..4c6e7707 --- /dev/null +++ b/template/mails/reset-password_4.tpl @@ -0,0 +1,7 @@ +# Legacy import +重置密码 +点击此链接以重置您的密码。 + +HOST_URL?account=forgotpassword&token=%s + +如果您没有请求此邮件,请忽略它。 diff --git a/template/mails/reset-password_6.tpl b/template/mails/reset-password_6.tpl new file mode 100644 index 00000000..31f7fefa --- /dev/null +++ b/template/mails/reset-password_6.tpl @@ -0,0 +1,7 @@ +# Legacy import +Reinicio de Contraseña +Siga este enlace para reiniciar su contraseña. + +HOST_URL?account=forgotpassword&token=%s + +Si usted no solicitó este correo, por favor ignorelo. diff --git a/template/mails/reset-password_8.tpl b/template/mails/reset-password_8.tpl new file mode 100644 index 00000000..6ad68462 --- /dev/null +++ b/template/mails/reset-password_8.tpl @@ -0,0 +1,7 @@ +# Created by ChatGPT from legacy import; locale 0 +Сброс пароля +Перейдите по этой ссылке, чтобы сбросить свой пароль. + +HOST_URL?account=forgotpassword&token=%s + +Если вы не запрашивали это письмо, просто проигнорируйте его.