1
0
Fork 0
mirror of synced 2024-10-01 17:58:02 +13:00

Merge pull request #6047 from appwrite/feat-smtp-fixes-2

Feat SMTP Template Simplification
This commit is contained in:
Eldad A. Fux 2023-08-28 11:41:19 +03:00 committed by GitHub
commit e3576fd460
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 155 additions and 103 deletions

View file

@ -42,6 +42,10 @@
border: none; border: none;
border-top: 1px solid #E8E9F0; border-top: 1px solid #E8E9F0;
} }
p {
margin-bottom: 10px;
}
</style> </style>
</head> </head>
@ -62,19 +66,7 @@
<table style="margin-top: 40px"> <table style="margin-top: 40px">
<tr> <tr>
<td> <td>
<p>{{hello}}</p> {{body}}
<p>{{body}}</p>
<a href="{{redirect}}" target="_blank">{{redirect}}</a>
<p><br />{{footer}}</p>
<br />
<p>{{thanks}}
<br />
{{signature}}
</p>
</td> </td>
</tr> </tr>
</table> </table>

View file

@ -0,0 +1,15 @@
<p>{{hello}}</p>
<br>
<p>{{body}}</p>
<a href="{{redirect}}" target="_blank">{{redirect}}</a>
<p>{{footer}}</p>
<br>
<p>{{thanks}}</p>
<p>{{signature}}</p>

View file

@ -1092,13 +1092,13 @@ App::post('/v1/account/sessions/magic-url')
$url = Template::unParseURL($url); $url = Template::unParseURL($url);
$from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $project->getAttribute('name')); $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"); $subject = $locale->getText("emails.magicSession.subject");
$smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false;
$customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $locale->default] ?? []; $customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $locale->default] ?? [];
if ($smtpEnabled && !empty($customTemplate)) { if ($smtpEnabled && !empty($customTemplate)) {
$body = Template::fromString($customTemplate['message'] ?? ''); $body = $customTemplate['message'] ?? '';
$subject = $customTemplate['subject'] ?? $subject; $subject = $customTemplate['subject'] ?? $subject;
$from = $customTemplate['senderName'] ?? $from; $from = $customTemplate['senderName'] ?? $from;
@ -1112,28 +1112,32 @@ App::post('/v1/account/sessions/magic-url')
->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '')
->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '')
->setSmtpSenderName($customTemplate['senderName'] ?? ''); ->setSmtpSenderName($customTemplate['senderName'] ?? '');
} else {
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
$message->setParam('{{body}}', $body);
$body = $message->render();
} }
$body $emailVariables = [
->setParam('{{subject}}', $subject) 'subject' => $subject,
->setParam('{{hello}}', $locale->getText("emails.magicSession.hello")) 'hello' => $locale->getText("emails.magicSession.hello"),
->setParam('{{name}}', '') 'name' => '',
->setParam('{{body}}', $locale->getText("emails.magicSession.body")) 'body' => $body,
->setParam('{{redirect}}', $url) 'redirect' => $url,
->setParam('{{footer}}', $locale->getText("emails.magicSession.footer")) 'footer' => $locale->getText("emails.magicSession.footer"),
->setParam('{{thanks}}', $locale->getText("emails.magicSession.thanks")) 'thanks' => $locale->getText("emails.magicSession.thanks"),
->setParam('{{signature}}', $locale->getText("emails.magicSession.signature")) 'signature' => $locale->getText("emails.magicSession.signature"),
->setParam('{{project}}', $project->getAttribute('name')) 'project' => $project->getAttribute('name'),
->setParam('{{direction}}', $locale->getText('settings.direction')) 'direction' => $locale->getText('settings.direction'),
->setParam('{{bg-body}}', '#f7f7f7') 'bg-body' => '#f7f7f7',
->setParam('{{bg-content}}', '#ffffff') 'bg-content' => '#ffffff',
->setParam('{{text-content}}', '#000000'); 'text-content' => '#000000',
];
$body = $body->render();
$mails $mails
->setSubject($subject) ->setSubject($subject)
->setBody($body) ->setBody($body->render())
->setVariables($emailVariables)
->setFrom($from) ->setFrom($from)
->setRecipient($user->getAttribute('email')) ->setRecipient($user->getAttribute('email'))
->trigger() ->trigger()
@ -2519,13 +2523,13 @@ App::post('/v1/account/recovery')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); $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"); $subject = $locale->getText("emails.recovery.subject");
$smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false;
$customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $locale->default] ?? []; $customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $locale->default] ?? [];
if ($smtpEnabled && !empty($customTemplate)) { if ($smtpEnabled && !empty($customTemplate)) {
$body = Template::fromString($customTemplate['message'] ?? ''); $body = $customTemplate['message'];
$subject = $customTemplate['subject'] ?? $subject; $subject = $customTemplate['subject'] ?? $subject;
$from = $customTemplate['senderName'] ?? $from; $from = $customTemplate['senderName'] ?? $from;
@ -2539,30 +2543,34 @@ App::post('/v1/account/recovery')
->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '')
->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '')
->setSmtpSenderName($customTemplate['senderName'] ?? ''); ->setSmtpSenderName($customTemplate['senderName'] ?? '');
} else {
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
$message->setParam('{{body}}', $body);
$body = $message->render();
} }
$body $emailVariables = [
->setParam('{{subject}}', $subject) 'subject' => $subject,
->setParam('{{hello}}', $locale->getText("emails.recovery.hello")) 'hello' => $locale->getText("emails.recovery.hello"),
->setParam('{{name}}', $profile->getAttribute('name')) 'name' => $profile->getAttribute('name'),
->setParam('{{body}}', $locale->getText("emails.recovery.body")) 'body' => $body,
->setParam('{{redirect}}', $url) 'redirect' => $url,
->setParam('{{footer}}', $locale->getText("emails.recovery.footer")) 'footer' => $locale->getText("emails.recovery.footer"),
->setParam('{{thanks}}', $locale->getText("emails.recovery.thanks")) 'thanks' => $locale->getText("emails.recovery.thanks"),
->setParam('{{signature}}', $locale->getText("emails.recovery.signature")) 'signature' => $locale->getText("emails.recovery.signature"),
->setParam('{{project}}', $projectName) 'project' => $projectName,
->setParam('{{direction}}', $locale->getText('settings.direction')) 'direction' => $locale->getText('settings.direction'),
->setParam('{{bg-body}}', '#f7f7f7') 'bg-body' => '#f7f7f7',
->setParam('{{bg-content}}', '#ffffff') 'bg-content' => '#ffffff',
->setParam('{{text-content}}', '#000000'); 'text-content' => '#000000',
];
$body = $body->render();
$mails $mails
->setRecipient($profile->getAttribute('email', '')) ->setRecipient($profile->getAttribute('email', ''))
->setName($profile->getAttribute('name')) ->setName($profile->getAttribute('name'))
->setBody($body) ->setBody($body)
->setVariables($emailVariables)
->setFrom($from) ->setFrom($from)
->setSubject($subject) ->setSubject($subject)
->trigger(); ->trigger();
@ -2740,13 +2748,13 @@ App::post('/v1/account/verification')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); $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"); $subject = $locale->getText("emails.verification.subject");
$smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false;
$customTemplate = $project->getAttribute('templates', [])['email.verification-' . $locale->default] ?? []; $customTemplate = $project->getAttribute('templates', [])['email.verification-' . $locale->default] ?? [];
if ($smtpEnabled && !empty($customTemplate)) { if ($smtpEnabled && !empty($customTemplate)) {
$body = Template::fromString($customTemplate['message'] ?? ''); $body = $customTemplate['message'] ?? '';
$subject = $customTemplate['subject'] ?? $subject; $subject = $customTemplate['subject'] ?? $subject;
$from = $customTemplate['senderName'] ?? $from; $from = $customTemplate['senderName'] ?? $from;
@ -2760,28 +2768,32 @@ App::post('/v1/account/verification')
->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '')
->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '')
->setSmtpSenderName($customTemplate['senderName'] ?? ''); ->setSmtpSenderName($customTemplate['senderName'] ?? '');
} else {
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
$message->setParam('{{body}}', $body);
$body = $message->render();
} }
$body $emailVariables = [
->setParam('{{subject}}', $subject) 'subject' => $subject,
->setParam('{{hello}}', $locale->getText("emails.verification.hello")) 'hello' => $locale->getText("emails.verification.hello"),
->setParam('{{name}}', $user->getAttribute('name')) 'name' => $user->getAttribute('name'),
->setParam('{{body}}', $locale->getText("emails.verification.body")) 'body' => $body,
->setParam('{{redirect}}', $url) 'redirect' => $url,
->setParam('{{footer}}', $locale->getText("emails.verification.footer")) 'footer' => $locale->getText("emails.verification.footer"),
->setParam('{{thanks}}', $locale->getText("emails.verification.thanks")) 'thanks' => $locale->getText("emails.verification.thanks"),
->setParam('{{signature}}', $locale->getText("emails.verification.signature")) 'signature' => $locale->getText("emails.verification.signature"),
->setParam('{{project}}', $projectName) 'project' => $projectName,
->setParam('{{direction}}', $locale->getText('settings.direction')) 'direction' => $locale->getText('settings.direction'),
->setParam('{{bg-body}}', '#f7f7f7') 'bg-body' => '#f7f7f7',
->setParam('{{bg-content}}', '#ffffff') 'bg-content' => '#ffffff',
->setParam('{{text-content}}', '#000000'); 'text-content' => '#000000',
];
$body = $body->render();
$mails $mails
->setSubject($subject) ->setSubject($subject)
->setBody($body) ->setBody($body)
->setVariables($emailVariables)
->setFrom($from) ->setFrom($from)
->setRecipient($user->getAttribute('email')) ->setRecipient($user->getAttribute('email'))
->setName($user->getAttribute('name') ?? '') ->setName($user->getAttribute('name') ?? '')

View file

@ -1645,19 +1645,16 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale')
$localeObj = new Locale($locale); $localeObj = new Locale($locale);
if (is_null($template)) { if (is_null($template)) {
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-base.tpl'); $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
$message = $message $message
->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello")) ->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello"))
->setParam('{{name}}', '') ->setParam('{{name}}', '')
->setParam('{{body}}', $localeObj->getText("emails.{$type}.body"))
->setParam('{{footer}}', $localeObj->getText("emails.{$type}.footer")) ->setParam('{{footer}}', $localeObj->getText("emails.{$type}.footer"))
->setParam('{{body}}', $localeObj->getText('emails.' . $type . '.body'))
->setParam('{{thanks}}', $localeObj->getText("emails.{$type}.thanks")) ->setParam('{{thanks}}', $localeObj->getText("emails.{$type}.thanks"))
->setParam('{{signature}}', $localeObj->getText("emails.{$type}.signature")) ->setParam('{{signature}}', $localeObj->getText("emails.{$type}.signature"))
->setParam('{{direction}}', $localeObj->getText('settings.direction')) ->setParam('{{direction}}', $localeObj->getText('settings.direction'));
->setParam('{{bg-body}}', '#f7f7f7') $message = $message->render();
->setParam('{{bg-content}}', '#ffffff')
->setParam('{{text-content}}', '#000000')
->render();
$from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($localeObj->getText('emails.sender'), $project->getAttribute('name')); $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; $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; $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false;
if(!$smtpEnabled) { if (!$smtpEnabled) {
throw new Exception(Exception::PROJECT_SMTP_CONFIG_NOT_FOUND); throw new Exception(Exception::PROJECT_SMTP_CONFIG_NOT_FOUND);
} }

View file

@ -544,7 +544,7 @@ App::post('/v1/teams/:teamId/memberships')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$from = $project->isEmpty() || $project->getId() === 'console' ? '' : \sprintf($locale->getText('emails.sender'), $projectName); $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); $subject = \sprintf($locale->getText("emails.invitation.subject"), $team->getAttribute('name'), $projectName);
$smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false; $smtpEnabled = $project->getAttribute('smtp', [])['enabled'] ?? false;
@ -553,7 +553,7 @@ App::post('/v1/teams/:teamId/memberships')
$body = Template::fromString($customTemplate['message'] ?? ''); $body = Template::fromString($customTemplate['message'] ?? '');
$subject = $customTemplate['subject'] ?? $subject; $subject = $customTemplate['subject'] ?? $subject;
$from = $customTemplate['senderName'] ?? $from; $from = $customTemplate['senderName'] ?? $from;
$smtp = $project->getAttribute('smtp', []); $smtp = $project->getAttribute('smtp', []);
$mails $mails
->setSmtpHost($smtp['host'] ?? '') ->setSmtpHost($smtp['host'] ?? '')
@ -564,27 +564,29 @@ App::post('/v1/teams/:teamId/memberships')
->setSmtpReplyTo($customTemplate['replyTo'] ?? '') ->setSmtpReplyTo($customTemplate['replyTo'] ?? '')
->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '') ->setSmtpSenderEmail($customTemplate['senderEmail'] ?? '')
->setSmtpSenderName($customTemplate['senderName'] ?? ''); ->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')); $emailVariables = [
$body->setParam('{{team}}', $team->getAttribute('name')); 'owner' => $user->getAttribute('name'),
'team' => $team->getAttribute('name'),
$body 'subject' => $subject,
->setParam('{{subject}}', $subject) 'hello' => $locale->getText("emails.invitation.hello"),
->setParam('{{hello}}', $locale->getText("emails.invitation.hello")) 'name' => $user->getAttribute('name'),
->setParam('{{name}}', $user->getAttribute('name')) 'body' => $body,
->setParam('{{body}}', $locale->getText("emails.invitation.body")) 'redirect' => $url,
->setParam('{{redirect}}', $url) 'footer' => $locale->getText("emails.invitation.footer"),
->setParam('{{footer}}', $locale->getText("emails.invitation.footer")) 'thanks' => $locale->getText("emails.invitation.thanks"),
->setParam('{{thanks}}', $locale->getText("emails.invitation.thanks")) 'signature' => $locale->getText("emails.invitation.signature"),
->setParam('{{signature}}', $locale->getText("emails.invitation.signature")) 'project' => $projectName,
->setParam('{{project}}', $projectName) 'direction' => $locale->getText('settings.direction'),
->setParam('{{direction}}', $locale->getText('settings.direction')) 'bg-body' => '#f7f7f7',
->setParam('{{bg-body}}', '#f7f7f7') 'bg-content' => '#ffffff',
->setParam('{{bg-content}}', '#ffffff') 'text-content' => '#000000',
->setParam('{{text-content}}', '#000000'); ];
$body = $body->render();
$mails $mails
->setSubject($subject) ->setSubject($subject)
@ -592,6 +594,7 @@ App::post('/v1/teams/:teamId/memberships')
->setFrom($from) ->setFrom($from)
->setRecipient($invitee->getAttribute('email')) ->setRecipient($invitee->getAttribute('email'))
->setName($invitee->getAttribute('name')) ->setName($invitee->getAttribute('name'))
->setVariables($emailVariables)
->trigger() ->trigger()
; ;
} elseif (!empty($phone)) { } elseif (!empty($phone)) {

View file

@ -1,6 +1,7 @@
<?php <?php
use Appwrite\Resque\Worker; use Appwrite\Resque\Worker;
use Appwrite\Template\Template;
use Utopia\App; use Utopia\App;
use Utopia\CLI\Console; use Utopia\CLI\Console;
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\PHPMailer;
@ -32,13 +33,21 @@ class MailsV1 extends Worker
return; return;
} }
$recipient = $this->args['recipient']; $recipient = $this->args['recipient'];
$subject = $this->args['subject']; $subject = $this->args['subject'];
$name = $this->args['name']; $name = $this->args['name'];
$body = $this->args['body']; $body = $this->args['body'];
$variables = $this->args['variables'];
$from = $this->args['from']; $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 */ /** @var \PHPMailer\PHPMailer\PHPMailer $mail */
$mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp); $mail = empty($smtp) ? $register->get('smtp') : $this->getMailer($smtp);

8
composer.lock generated
View file

@ -2224,12 +2224,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/utopia-php/database.git", "url": "https://github.com/utopia-php/database.git",
"reference": "ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1" "reference": "2d52ce8ac92436cd51c36cff2ec7bfdf00c44189"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1", "url": "https://api.github.com/repos/utopia-php/database/zipball/2d52ce8ac92436cd51c36cff2ec7bfdf00c44189",
"reference": "ab0e2f8ad46884f69b354cd8ee84a1a75fee26d1", "reference": "2d52ce8ac92436cd51c36cff2ec7bfdf00c44189",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2273,7 +2273,7 @@
"issues": "https://github.com/utopia-php/database/issues", "issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/0.42.3" "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", "name": "utopia-php/domains",

View file

@ -13,6 +13,7 @@ class Mail extends Event
protected string $subject = ''; protected string $subject = '';
protected string $body = ''; protected string $body = '';
protected array $smtp = []; protected array $smtp = [];
protected array $variables = [];
public function __construct() public function __construct()
{ {
@ -310,6 +311,28 @@ class Mail extends Event
return $this->smtp['replyTo'] ?? ''; 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. * Executes the event and sends it to the mails worker.
* *
@ -325,6 +348,7 @@ class Mail extends Event
'subject' => $this->subject, 'subject' => $this->subject,
'body' => $this->body, 'body' => $this->body,
'smtp' => $this->smtp, 'smtp' => $this->smtp,
'variables' => $this->variables,
'events' => Event::generateEvents($this->getEvent(), $this->getParams()) 'events' => Event::generateEvents($this->getEvent(), $this->getParams())
]); ]);
} }