Using templates
On this page:
By defining a transactional mail template, you can let non-technical users specify the content of a transactional mail.
Getting started
To get started you should create a Spatie\Mailcoach\Domain\TransactionalMail\Models\TransactionalMailTemplate model.
Spatie\Mailcoach\Domain\TransactionalMail\Models\TransactionalMailTemplate::create([
'name' => 'name-of-your-template',
'type' => 'html', // this can be html, markdown or blade
'subject' => 'The subject of your mail',
'body' => '<html>Content of your mail</html>'
]);
After you have created this model, it will become visible in the UI of Mailcoach. Users of Mailcoach will be able to change the properties of the mail.
Next, you should create a mailable and let it use the Spatie\Mailcoach\Domain\TransactionalMail\Mails\Concerns\UsesMailcoachTemplate trait. In the build method of your mailable you should call the template method.
use Spatie\Mailcoach\Domain\TransactionalMail\Mails\Concerns\UsesMailcoachTemplate
use Illuminate\Mail\Mailable
class YourMailable extends Mailable
{
use UsesMailcoachTemplate;
public function build()
{
$this->template('test-template');
}
When the mailable is sent, it will use the subject and content of the TransactionalMailTemplate.
Using template types
You can use of one these types as the value of type in a TransactionalMailTemplate instance
html: the content of thebodycolumn will be used as ismarkdown: you can use mark down inbodycolumnblade: you can use Blade syntax in thebodycolumn. Only select this option if you trust all users of the Mailcoach UI, as arbitrary PHP in the template will be executed.
Storing and tracking open & clicks
By default, mails using templates will not be stored or tracked.
If you want to log any mail that use the template or track opens & clicks, you should set any of these attributes on TransactionalMailTemplate to true:
store_mailtrack_openstrack_clicks
Using replacers
You can define replacers to dynamically replace content in the template. A replacer is any class that implements the Spatie\Mailcoach\Domain\TransactionalMail\Support\Replacers\TransactionalMailReplacer interface. This interface requires you to implements two methods:
helpText: returns the help text to be displayed in the UIreplace: the function that makes the replacement.
Here’s an example implementation where we will replace ::subject:: in the content of the template with the subject used on the mailable.
namespace App\Support\Replacers;
use Illuminate\Mail\Mailable;
use Spatie\Mailcoach\Domain\TransactionalMail\Models\TransactionalMailTemplate;
use Spatie\Mailcoach\Domain\TransactionalMail\Support\Replacers\TransactionalMailReplacer;
class SubjectReplacer implements TransactionalMailReplacer
{
public function helpText(): array
{
return [
'subject' => 'The subject used on the template',
];
}
public function replace(string $templateText, Mailable $mailable, TransactionalMailTemplate $template): string
{
return str_replace('::subject::', $mailable->subject, $templateText);
}
}
You should register replacers in the transactional.replacers config key of the mailcoach config file. You should use array syntax: the key is the name of your replacer, the value should be the full qualified class name
// in mailcoach.php
return [
// ...
'transactional' => [
/*
* The default mailer used by Mailcoach for transactional mails.
*/
'mailer' => null,
/*
* Replacers are classes that can make replacements in the body of transactional mails.
*
* You can use replacers to create placeholders.
*/
'replacers' => [
'subject' => \App\Support\Replacers\SubjectReplacer::class,
],
// ...
],
];
To enable a registered replacer for a TransactionalMailTemplate, you should set the name of the replacer in the replacers column of the TransactionalMailTemplate. Use array notation to be able to specify multiple replacers.
$transactionalMailTemplate->update(['replacers' => ['subject', 'another_replacer']])