diff --git a/app/config/locale/templates/email-base.tpl b/app/config/locale/templates/email-base.tpl index b9b5b1bb8..4801c6fb2 100644 --- a/app/config/locale/templates/email-base.tpl +++ b/app/config/locale/templates/email-base.tpl @@ -42,6 +42,10 @@ border: none; border-top: 1px solid #E8E9F0; } + + p { + margin-bottom: 10px; + } @@ -62,19 +66,7 @@
-

{{hello}}

- -

{{body}}

- - {{redirect}} - -


{{footer}}

-
- -

{{thanks}} -
- {{signature}} -

+ {{body}}
diff --git a/app/config/locale/templates/email-inner-base.tpl b/app/config/locale/templates/email-inner-base.tpl new file mode 100644 index 000000000..53ffe83a5 --- /dev/null +++ b/app/config/locale/templates/email-inner-base.tpl @@ -0,0 +1,15 @@ +

{{hello}}

+ +
+ +

{{body}}

+ +{{redirect}} + +

{{footer}}

+ +
+ +

{{thanks}}

+ +

{{signature}}

\ No newline at end of file diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 9fd8f10f0..694cb8104 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1092,13 +1092,13 @@ App::post('/v1/account/sessions/magic-url') $url = Template::unParseURL($url); $from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $project->getAttribute('name')); - $body = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); + $body = $locale->getText("emails.magicSession.body"); $subject = $locale->getText("emails.magicSession.subject"); $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $locale->default] ?? []; if ($smtpEnabled && !empty($customTemplate)) { - $body = Template::fromString($customTemplate['message'] ?? ''); + $body = $customTemplate['message'] ?? ''; $subject = $customTemplate['subject'] ?? $subject; $from = $customTemplate['senderName'] ?? $from; @@ -1112,28 +1112,32 @@ App::post('/v1/account/sessions/magic-url') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); + } else { + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message->setParam('{{body}}', $body); + $body = $message->render(); } - $body - ->setParam('{{subject}}', $subject) - ->setParam('{{hello}}', $locale->getText("emails.magicSession.hello")) - ->setParam('{{name}}', '') - ->setParam('{{body}}', $locale->getText("emails.magicSession.body")) - ->setParam('{{redirect}}', $url) - ->setParam('{{footer}}', $locale->getText("emails.magicSession.footer")) - ->setParam('{{thanks}}', $locale->getText("emails.magicSession.thanks")) - ->setParam('{{signature}}', $locale->getText("emails.magicSession.signature")) - ->setParam('{{project}}', $project->getAttribute('name')) - ->setParam('{{direction}}', $locale->getText('settings.direction')) - ->setParam('{{bg-body}}', '#f7f7f7') - ->setParam('{{bg-content}}', '#ffffff') - ->setParam('{{text-content}}', '#000000'); - - $body = $body->render(); + $emailVariables = [ + 'subject' => $subject, + 'hello' => $locale->getText("emails.magicSession.hello"), + 'name' => '', + 'body' => $body, + 'redirect' => $url, + 'footer' => $locale->getText("emails.magicSession.footer"), + 'thanks' => $locale->getText("emails.magicSession.thanks"), + 'signature' => $locale->getText("emails.magicSession.signature"), + 'project' => $project->getAttribute('name'), + 'direction' => $locale->getText('settings.direction'), + 'bg-body' => '#f7f7f7', + 'bg-content' => '#ffffff', + 'text-content' => '#000000', + ]; $mails ->setSubject($subject) - ->setBody($body) + ->setBody($body->render()) + ->setVariables($emailVariables) ->setFrom($from) ->setRecipient($user->getAttribute('email')) ->trigger() @@ -2519,13 +2523,13 @@ App::post('/v1/account/recovery') $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); - $body = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); + $body = $locale->getText("emails.recovery.body"); $subject = $locale->getText("emails.recovery.subject"); $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $locale->default] ?? []; if ($smtpEnabled && !empty($customTemplate)) { - $body = Template::fromString($customTemplate['message'] ?? ''); + $body = $customTemplate['message']; $subject = $customTemplate['subject'] ?? $subject; $from = $customTemplate['senderName'] ?? $from; @@ -2539,30 +2543,34 @@ App::post('/v1/account/recovery') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); + } else { + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message->setParam('{{body}}', $body); + $body = $message->render(); } - $body - ->setParam('{{subject}}', $subject) - ->setParam('{{hello}}', $locale->getText("emails.recovery.hello")) - ->setParam('{{name}}', $profile->getAttribute('name')) - ->setParam('{{body}}', $locale->getText("emails.recovery.body")) - ->setParam('{{redirect}}', $url) - ->setParam('{{footer}}', $locale->getText("emails.recovery.footer")) - ->setParam('{{thanks}}', $locale->getText("emails.recovery.thanks")) - ->setParam('{{signature}}', $locale->getText("emails.recovery.signature")) - ->setParam('{{project}}', $projectName) - ->setParam('{{direction}}', $locale->getText('settings.direction')) - ->setParam('{{bg-body}}', '#f7f7f7') - ->setParam('{{bg-content}}', '#ffffff') - ->setParam('{{text-content}}', '#000000'); - - $body = $body->render(); + $emailVariables = [ + 'subject' => $subject, + 'hello' => $locale->getText("emails.recovery.hello"), + 'name' => $profile->getAttribute('name'), + 'body' => $body, + 'redirect' => $url, + 'footer' => $locale->getText("emails.recovery.footer"), + 'thanks' => $locale->getText("emails.recovery.thanks"), + 'signature' => $locale->getText("emails.recovery.signature"), + 'project' => $projectName, + 'direction' => $locale->getText('settings.direction'), + 'bg-body' => '#f7f7f7', + 'bg-content' => '#ffffff', + 'text-content' => '#000000', + ]; $mails ->setRecipient($profile->getAttribute('email', '')) ->setName($profile->getAttribute('name')) ->setBody($body) + ->setVariables($emailVariables) ->setFrom($from) ->setSubject($subject) ->trigger(); @@ -2740,13 +2748,13 @@ App::post('/v1/account/verification') $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); - $body = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); + $body = $locale->getText("emails.verification.body"); $subject = $locale->getText("emails.verification.subject"); $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $customTemplate = $project->getAttribute('templates', [])['email.verification-' . $locale->default] ?? []; if ($smtpEnabled && !empty($customTemplate)) { - $body = Template::fromString($customTemplate['message'] ?? ''); + $body = $customTemplate['message'] ?? ''; $subject = $customTemplate['subject'] ?? $subject; $from = $customTemplate['senderName'] ?? $from; @@ -2760,28 +2768,32 @@ App::post('/v1/account/verification') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); + } else { + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message->setParam('{{body}}', $body); + $body = $message->render(); } - $body - ->setParam('{{subject}}', $subject) - ->setParam('{{hello}}', $locale->getText("emails.verification.hello")) - ->setParam('{{name}}', $user->getAttribute('name')) - ->setParam('{{body}}', $locale->getText("emails.verification.body")) - ->setParam('{{redirect}}', $url) - ->setParam('{{footer}}', $locale->getText("emails.verification.footer")) - ->setParam('{{thanks}}', $locale->getText("emails.verification.thanks")) - ->setParam('{{signature}}', $locale->getText("emails.verification.signature")) - ->setParam('{{project}}', $projectName) - ->setParam('{{direction}}', $locale->getText('settings.direction')) - ->setParam('{{bg-body}}', '#f7f7f7') - ->setParam('{{bg-content}}', '#ffffff') - ->setParam('{{text-content}}', '#000000'); - - $body = $body->render(); + $emailVariables = [ + 'subject' => $subject, + 'hello' => $locale->getText("emails.verification.hello"), + 'name' => $user->getAttribute('name'), + 'body' => $body, + 'redirect' => $url, + 'footer' => $locale->getText("emails.verification.footer"), + 'thanks' => $locale->getText("emails.verification.thanks"), + 'signature' => $locale->getText("emails.verification.signature"), + 'project' => $projectName, + 'direction' => $locale->getText('settings.direction'), + 'bg-body' => '#f7f7f7', + 'bg-content' => '#ffffff', + 'text-content' => '#000000', + ]; $mails ->setSubject($subject) ->setBody($body) + ->setVariables($emailVariables) ->setFrom($from) ->setRecipient($user->getAttribute('email')) ->setName($user->getAttribute('name') ?? '') diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index a5487f57e..7b6b8c29a 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1645,19 +1645,16 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale') $localeObj = new Locale($locale); if (is_null($template)) { - $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); - $message = $message + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message ->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello")) ->setParam('{{name}}', '') - ->setParam('{{body}}', $localeObj->getText("emails.{$type}.body")) ->setParam('{{footer}}', $localeObj->getText("emails.{$type}.footer")) + ->setParam('{{body}}', $localeObj->getText('emails.' . $type . '.body')) ->setParam('{{thanks}}', $localeObj->getText("emails.{$type}.thanks")) ->setParam('{{signature}}', $localeObj->getText("emails.{$type}.signature")) - ->setParam('{{direction}}', $localeObj->getText('settings.direction')) - ->setParam('{{bg-body}}', '#f7f7f7') - ->setParam('{{bg-content}}', '#ffffff') - ->setParam('{{text-content}}', '#000000') - ->render(); + ->setParam('{{direction}}', $localeObj->getText('settings.direction')); + $message = $message->render(); $from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($localeObj->getText('emails.sender'), $project->getAttribute('name')); $from = empty($from) ? \urldecode(App::getEnv('_APP_SYSTEM_EMAIL_NAME', APP_NAME . ' Server')) : $from; @@ -1746,7 +1743,7 @@ App::patch('/v1/projects/:projectId/templates/email/:type/:locale') } $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; - if(!$smtpEnabled) { + if (!$smtpEnabled) { throw new Exception(Exception::PROJECT_SMTP_CONFIG_NOT_FOUND); } diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index dfa8cb0b7..b576da0bd 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -544,7 +544,7 @@ App::post('/v1/teams/:teamId/memberships') $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); - $body = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); + $body = $locale->getText("emails.invitation.body"); $subject = \sprintf($locale->getText("emails.invitation.subject"), $team->getAttribute('name'), $projectName); $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; @@ -553,7 +553,7 @@ App::post('/v1/teams/:teamId/memberships') $body = Template::fromString($customTemplate['message'] ?? ''); $subject = $customTemplate['subject'] ?? $subject; $from = $customTemplate['senderName'] ?? $from; - + $smtp = $project->getAttribute('smtp', []); $mails ->setSmtpHost($smtp['host'] ?? '') @@ -564,27 +564,29 @@ App::post('/v1/teams/:teamId/memberships') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); + } else { + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message->setParam('{{body}}', $body); + $body = $message->render(); } - $body->setParam('{{owner}}', $user->getAttribute('name')); - $body->setParam('{{team}}', $team->getAttribute('name')); - - $body - ->setParam('{{subject}}', $subject) - ->setParam('{{hello}}', $locale->getText("emails.invitation.hello")) - ->setParam('{{name}}', $user->getAttribute('name')) - ->setParam('{{body}}', $locale->getText("emails.invitation.body")) - ->setParam('{{redirect}}', $url) - ->setParam('{{footer}}', $locale->getText("emails.invitation.footer")) - ->setParam('{{thanks}}', $locale->getText("emails.invitation.thanks")) - ->setParam('{{signature}}', $locale->getText("emails.invitation.signature")) - ->setParam('{{project}}', $projectName) - ->setParam('{{direction}}', $locale->getText('settings.direction')) - ->setParam('{{bg-body}}', '#f7f7f7') - ->setParam('{{bg-content}}', '#ffffff') - ->setParam('{{text-content}}', '#000000'); - - $body = $body->render(); + $emailVariables = [ + 'owner' => $user->getAttribute('name'), + 'team' => $team->getAttribute('name'), + 'subject' => $subject, + 'hello' => $locale->getText("emails.invitation.hello"), + 'name' => $user->getAttribute('name'), + 'body' => $body, + 'redirect' => $url, + 'footer' => $locale->getText("emails.invitation.footer"), + 'thanks' => $locale->getText("emails.invitation.thanks"), + 'signature' => $locale->getText("emails.invitation.signature"), + 'project' => $projectName, + 'direction' => $locale->getText('settings.direction'), + 'bg-body' => '#f7f7f7', + 'bg-content' => '#ffffff', + 'text-content' => '#000000', + ]; $mails ->setSubject($subject) @@ -592,6 +594,7 @@ App::post('/v1/teams/:teamId/memberships') ->setFrom($from) ->setRecipient($invitee->getAttribute('email')) ->setName($invitee->getAttribute('name')) + ->setVariables($emailVariables) ->trigger() ; } elseif (!empty($phone)) { diff --git a/app/workers/mails.php b/app/workers/mails.php index baff25949..c6f79187f 100644 --- a/app/workers/mails.php +++ b/app/workers/mails.php @@ -1,6 +1,7 @@ args['recipient']; $subject = $this->args['subject']; $name = $this->args['name']; $body = $this->args['body']; + $variables = $this->args['variables']; $from = $this->args['from']; + $body = Template::fromFile(__DIR__ . '/../config/locale/templates/email-base.tpl'); + + foreach ($variables as $key => $value) { + $body->setParam('{{' . $key . '}}', $value); + } + + $body = $body->render(); + /** @var \PHPMailer\PHPMailer\PHPMailer $mail */ $mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp); diff --git a/composer.lock b/composer.lock index 35f1f6b11..8a2a7bab4 100644 --- a/composer.lock +++ b/composer.lock @@ -2224,12 +2224,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1" + "reference": "2d52ce8ac92436cd51c36cff2ec7bfdf00c44189" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1", - "reference": "ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1", + "url": "https://api.github.com/repos/utopia-php/database/zipball/2d52ce8ac92436cd51c36cff2ec7bfdf00c44189", + "reference": "2d52ce8ac92436cd51c36cff2ec7bfdf00c44189", "shasum": "" }, "require": { @@ -2273,7 +2273,7 @@ "issues": "https://github.com/utopia-php/database/issues", "source": "https://github.com/utopia-php/database/tree/0.42.3" }, - "time": "2023-08-22T02:15:28+00:00" + "time": "2023-08-25T06:18:31+00:00" }, { "name": "utopia-php/domains", diff --git a/src/Appwrite/Event/Mail.php b/src/Appwrite/Event/Mail.php index dfec4cd75..477d54d57 100644 --- a/src/Appwrite/Event/Mail.php +++ b/src/Appwrite/Event/Mail.php @@ -13,6 +13,7 @@ class Mail extends Event protected string $subject = ''; protected string $body = ''; protected array $smtp = []; + protected array $variables = []; public function __construct() { @@ -310,6 +311,28 @@ class Mail extends Event return $this->smtp['replyTo'] ?? ''; } + /** + * Get Email Variables + * + * @return array + */ + public function getVariables(): array + { + return $this->variables; + } + + /** + * Set Email Variables + * + * @param array $variables + * @return self + */ + public function setVariables(array $variables): self + { + $this->variables = $variables; + return $this; + } + /** * Executes the event and sends it to the mails worker. * @@ -325,6 +348,7 @@ class Mail extends Event 'subject' => $this->subject, 'body' => $this->body, 'smtp' => $this->smtp, + 'variables' => $this->variables, 'events' => Event::generateEvents($this->getEvent(), $this->getParams()) ]); }