From 608b6b3847c2ef298e45309b6cc3ad35971e109d Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Sun, 27 Aug 2023 23:45:37 +0100 Subject: [PATCH 1/9] Continue work --- .../locale/templates/email-stock-body.tpl | 13 +++ app/controllers/api/account.php | 85 +++++++++++-------- app/controllers/api/projects.php | 24 ++---- app/workers/mails.php | 16 +++- src/Appwrite/Event/Mail.php | 24 ++++++ 5 files changed, 109 insertions(+), 53 deletions(-) create mode 100644 app/config/locale/templates/email-stock-body.tpl diff --git a/app/config/locale/templates/email-stock-body.tpl b/app/config/locale/templates/email-stock-body.tpl new file mode 100644 index 0000000000..13af5477f1 --- /dev/null +++ b/app/config/locale/templates/email-stock-body.tpl @@ -0,0 +1,13 @@ +

{{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 9fd8f10f09..3560cff166 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1114,26 +1114,26 @@ App::post('/v1/account/sessions/magic-url') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); } - $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' => $locale->getText("emails.magicSession.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 +2519,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; @@ -2541,28 +2541,45 @@ App::post('/v1/account/recovery') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); } - $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 + // ->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(); + // $body = $body->render(); + + $emailVariables = [ + 'subject' => $subject, + 'hello' => $locale->getText("emails.recovery.hello"), + 'name' => $profile->getAttribute('name'), + 'body' => $locale->getText("emails.recovery.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(); diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index a5487f57ec..bcf6e1594d 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1525,11 +1525,11 @@ App::patch('/v1/projects/:projectId/smtp') ->label('sdk.response.model', Response::MODEL_PROJECT) ->param('projectId', '', new UID(), 'Project unique ID.') ->param('enabled', false, new Boolean(), 'Enable custom SMTP service') - ->param('sender', '', new Email(), 'SMTP sender email') - ->param('host', '', new HostName(), 'SMTP server host name') - ->param('port', null, new Integer(), 'SMTP server port') - ->param('username', null, new Text(0), 'SMTP server username') - ->param('password', null, new Text(0), 'SMTP server password') + ->param('sender', '', new Email(), 'SMTP sender email', true) + ->param('host', '', new HostName(), 'SMTP server host name', true) + ->param('port', null, new Integer(), 'SMTP server port', true) + ->param('username', null, new Text(0, 0), 'SMTP server username', true) + ->param('password', null, new Text(0, 0), 'SMTP server password', true) ->param('secure', '', new WhiteList(['tls'], true), 'Does SMTP server use secure connection', true) ->inject('response') ->inject('dbForConsole') @@ -1645,19 +1645,7 @@ 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 - ->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello")) - ->setParam('{{name}}', '') - ->setParam('{{body}}', $localeObj->getText("emails.{$type}.body")) - ->setParam('{{footer}}', $localeObj->getText("emails.{$type}.footer")) - ->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(); + $message = $localeObj->getText("emails.{$type}.body"); $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; diff --git a/app/workers/mails.php b/app/workers/mails.php index baff259495..73fb0abb7f 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) { + var_dump($key, $value); + $body->setParam('{{'.$key.'}}', $value); + } + + var_dump($body); + + $body = $body->render(); + + var_dump($body); + /** @var \PHPMailer\PHPMailer\PHPMailer $mail */ $mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp); diff --git a/src/Appwrite/Event/Mail.php b/src/Appwrite/Event/Mail.php index dfec4cd756..6dde45ac57 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()) ]); } From 1f1e7dd397a79cc0b3ac97e5481a1e3c32215620 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 05:55:40 +0100 Subject: [PATCH 2/9] Remove Testing Bypasses --- app/config/locale/templates/email-stock-body.tpl | 13 ------------- app/controllers/api/projects.php | 10 +++++----- 2 files changed, 5 insertions(+), 18 deletions(-) delete mode 100644 app/config/locale/templates/email-stock-body.tpl diff --git a/app/config/locale/templates/email-stock-body.tpl b/app/config/locale/templates/email-stock-body.tpl deleted file mode 100644 index 13af5477f1..0000000000 --- a/app/config/locale/templates/email-stock-body.tpl +++ /dev/null @@ -1,13 +0,0 @@ -

{{hello}}

- -

{{body}}

- -{{redirect}} - -


{{footer}}

-
- -

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

\ No newline at end of file diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index bcf6e1594d..e6f568e995 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1525,11 +1525,11 @@ App::patch('/v1/projects/:projectId/smtp') ->label('sdk.response.model', Response::MODEL_PROJECT) ->param('projectId', '', new UID(), 'Project unique ID.') ->param('enabled', false, new Boolean(), 'Enable custom SMTP service') - ->param('sender', '', new Email(), 'SMTP sender email', true) - ->param('host', '', new HostName(), 'SMTP server host name', true) - ->param('port', null, new Integer(), 'SMTP server port', true) - ->param('username', null, new Text(0, 0), 'SMTP server username', true) - ->param('password', null, new Text(0, 0), 'SMTP server password', true) + ->param('sender', '', new Email(), 'SMTP sender email') + ->param('host', '', new HostName(), 'SMTP server host name') + ->param('port', null, new Integer(), 'SMTP server port') + ->param('username', null, new Text(0), 'SMTP server username') + ->param('password', null, new Text(0), 'SMTP server password') ->param('secure', '', new WhiteList(['tls'], true), 'Does SMTP server use secure connection', true) ->inject('response') ->inject('dbForConsole') From ee0563c46f9bdbf01b61bb1848cc777033e41998 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 06:09:28 +0100 Subject: [PATCH 3/9] Cover other routes and cleanup code --- app/controllers/api/account.php | 57 ++++++++++++--------------------- app/workers/mails.php | 5 --- composer.lock | 36 ++++++++++----------- 3 files changed, 38 insertions(+), 60 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 3560cff166..8ace6f273b 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; @@ -2541,23 +2541,6 @@ App::post('/v1/account/recovery') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); } - // $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"), @@ -2757,13 +2740,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; @@ -2779,26 +2762,26 @@ App::post('/v1/account/verification') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); } - $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' => $locale->getText("emails.verification.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/workers/mails.php b/app/workers/mails.php index 73fb0abb7f..2d7620d76f 100644 --- a/app/workers/mails.php +++ b/app/workers/mails.php @@ -43,16 +43,11 @@ class MailsV1 extends Worker $body = Template::fromFile(__DIR__ . '/../config/locale/templates/email-base.tpl'); foreach ($variables as $key => $value) { - var_dump($key, $value); $body->setParam('{{'.$key.'}}', $value); } - var_dump($body); - $body = $body->render(); - var_dump($body); - /** @var \PHPMailer\PHPMailer\PHPMailer $mail */ $mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp); diff --git a/composer.lock b/composer.lock index e429b7d771..c396a7917e 100644 --- a/composer.lock +++ b/composer.lock @@ -522,22 +522,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -628,7 +628,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -644,7 +644,7 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", @@ -731,16 +731,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -827,7 +827,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -843,7 +843,7 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:06:02+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "influxdb/influxdb-php", @@ -2224,12 +2224,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "0d6c9de4e2ca43feb26a60debe3254f3194db019" + "reference": "2d52ce8ac92436cd51c36cff2ec7bfdf00c44189" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/0d6c9de4e2ca43feb26a60debe3254f3194db019", - "reference": "0d6c9de4e2ca43feb26a60debe3254f3194db019", + "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/feat-document-clone" }, - "time": "2023-08-24T14:21:25+00:00" + "time": "2023-08-25T06:18:31+00:00" }, { "name": "utopia-php/domains", From 1be5f58fd964e7aae52aff89dd7f6a1a1ddb281c Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 06:14:43 +0100 Subject: [PATCH 4/9] Update account.php --- app/controllers/api/account.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 8ace6f273b..4fa258528f 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1118,7 +1118,7 @@ App::post('/v1/account/sessions/magic-url') 'subject' => $subject, 'hello' => $locale->getText("emails.magicSession.hello"), 'name' => '', - 'body' => $locale->getText("emails.magicSession.body"), + 'body' => $body, 'redirect' => $url, 'footer' => $locale->getText("emails.magicSession.footer"), 'thanks' => $locale->getText("emails.magicSession.thanks"), @@ -2545,7 +2545,7 @@ App::post('/v1/account/recovery') 'subject' => $subject, 'hello' => $locale->getText("emails.recovery.hello"), 'name' => $profile->getAttribute('name'), - 'body' => $locale->getText("emails.recovery.body"), + 'body' => $body, 'redirect' => $url, 'footer' => $locale->getText("emails.recovery.footer"), 'thanks' => $locale->getText("emails.recovery.thanks"), @@ -2766,7 +2766,7 @@ App::post('/v1/account/verification') 'subject' => $subject, 'hello' => $locale->getText("emails.verification.hello"), 'name' => $user->getAttribute('name'), - 'body' => $locale->getText("emails.verification.body"), + 'body' => $body, 'redirect' => $url, 'footer' => $locale->getText("emails.verification.footer"), 'thanks' => $locale->getText("emails.verification.thanks"), From 11dca76a70574f9a8d147c781faf8a16ccde7f28 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 06:53:02 +0100 Subject: [PATCH 5/9] Update teams.php --- app/controllers/api/teams.php | 39 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index dfa8cb0b7a..aae105f0b8 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; @@ -566,25 +566,23 @@ App::post('/v1/teams/:teamId/memberships') ->setSmtpSenderName($customTemplate['senderName'] ?? ''); } - $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 +590,7 @@ App::post('/v1/teams/:teamId/memberships') ->setFrom($from) ->setRecipient($invitee->getAttribute('email')) ->setName($invitee->getAttribute('name')) + ->setVariables($emailVariables) ->trigger() ; } elseif (!empty($phone)) { From 88d48715c5d31ab0c645f76a738d680247ccc60d Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 06:53:26 +0100 Subject: [PATCH 6/9] Run Linter --- app/controllers/api/projects.php | 2 +- app/controllers/api/teams.php | 2 +- app/workers/mails.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index e6f568e995..845a1f0e9a 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1734,7 +1734,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 aae105f0b8..3941e810d8 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -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'] ?? '') diff --git a/app/workers/mails.php b/app/workers/mails.php index 2d7620d76f..c6f79187f3 100644 --- a/app/workers/mails.php +++ b/app/workers/mails.php @@ -43,7 +43,7 @@ class MailsV1 extends Worker $body = Template::fromFile(__DIR__ . '/../config/locale/templates/email-base.tpl'); foreach ($variables as $key => $value) { - $body->setParam('{{'.$key.'}}', $value); + $body->setParam('{{' . $key . '}}', $value); } $body = $body->render(); From 77aa48c22a509f2f475c6988b8053c4af2c94c86 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 06:53:29 +0100 Subject: [PATCH 7/9] Update Mail.php --- src/Appwrite/Event/Mail.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Event/Mail.php b/src/Appwrite/Event/Mail.php index 6dde45ac57..477d54d574 100644 --- a/src/Appwrite/Event/Mail.php +++ b/src/Appwrite/Event/Mail.php @@ -313,7 +313,7 @@ class Mail extends Event /** * Get Email Variables - * + * * @return array */ public function getVariables(): array @@ -323,7 +323,7 @@ class Mail extends Event /** * Set Email Variables - * + * * @param array $variables * @return self */ From 82f400d1776c9083772d3dca99d4a8520b9f7378 Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 09:03:55 +0100 Subject: [PATCH 8/9] Add more HTML back --- app/config/locale/templates/email-base.tpl | 14 +------------- app/config/locale/templates/email-inner-base.tpl | 12 ++++++++++++ app/controllers/api/account.php | 12 ++++++++++++ app/controllers/api/projects.php | 11 ++++++++++- app/controllers/api/teams.php | 4 ++++ 5 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 app/config/locale/templates/email-inner-base.tpl diff --git a/app/config/locale/templates/email-base.tpl b/app/config/locale/templates/email-base.tpl index b9b5b1bb8d..83b272e08b 100644 --- a/app/config/locale/templates/email-base.tpl +++ b/app/config/locale/templates/email-base.tpl @@ -62,19 +62,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 0000000000..59eddb8cbb --- /dev/null +++ b/app/config/locale/templates/email-inner-base.tpl @@ -0,0 +1,12 @@ +

{{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 4fa258528f..694cb81046 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1112,6 +1112,10 @@ 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(); } $emailVariables = [ @@ -2539,6 +2543,10 @@ 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(); } $emailVariables = [ @@ -2760,6 +2768,10 @@ 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(); } $emailVariables = [ diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 845a1f0e9a..7b6b8c29ac 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1645,7 +1645,16 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale') $localeObj = new Locale($locale); if (is_null($template)) { - $message = $localeObj->getText("emails.{$type}.body"); + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message + ->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello")) + ->setParam('{{name}}', '') + ->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')); + $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; diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 3941e810d8..b576da0bd9 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -564,6 +564,10 @@ 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(); } $emailVariables = [ From c566843518c415a2cec95f17201e947a1481688f Mon Sep 17 00:00:00 2001 From: Bradley Schofield Date: Mon, 28 Aug 2023 09:35:26 +0100 Subject: [PATCH 9/9] Style Changes --- app/config/locale/templates/email-base.tpl | 4 ++++ app/config/locale/templates/email-inner-base.tpl | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/config/locale/templates/email-base.tpl b/app/config/locale/templates/email-base.tpl index 83b272e08b..4801c6fb2c 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; + } diff --git a/app/config/locale/templates/email-inner-base.tpl b/app/config/locale/templates/email-inner-base.tpl index 59eddb8cbb..53ffe83a5b 100644 --- a/app/config/locale/templates/email-inner-base.tpl +++ b/app/config/locale/templates/email-inner-base.tpl @@ -1,12 +1,15 @@

{{hello}}

+
+

{{body}}

{{redirect}}

{{footer}}

-

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

\ No newline at end of file +
+ +

{{thanks}}

+ +

{{signature}}

\ No newline at end of file