This module was made for easy management of automated emails and email campaigns.
This package is part of Netcore CMS ecosystem and is only functional in a project that has following packages installed:
- https://github.com/netcore/netcore
- https://github.com/netcore/module-admin
- https://github.com/netcore/module-translate
- https://github.com/netcore/module-user
- https://github.com/netcore/module-setting
- Require this package using composer
composer require netcore/module-email
- Publish assets/configuration/migrations
php artisan module:publish Email
php artisan module:publish-config Email
php artisan module:publish-migration Email
php artisan migrate
- Add automated emails command to scheduling in "app/Console/Kernel.php"
$schedule->command('automated-emails:send')->everyMinute();
-
Set queue driver to redis
-
In your supervisor configuration set --timeout to 3600 or larger if a project will have large user base to send campaigns to
-
Add
Modules\User\Traits\ReplaceableAttributes
trait to yourUser
model and set public property$replaceable
which you want dynamically use in email templates:
public $replaceable = [
'first_name',
'last_name',
'email'
];
and set $replaceablePrefix
to prefix the replaceable attributes.
- Add "getFilters" and "getFilterQuery" methods to User model, like so:
public function getFilters()
{
return [
'is_email_verified' => [
'name' => 'Email verified?',
'type' => 'select', // Available types: text, select, multi-select, from-to
'values' => [-1 => 'Not important', 1 => 'Yes', 0 => 'No']
],
'country' => [
'name' => 'Country',
'type' => 'multi-select', // Available types: text, select, multi-select, from-to
'values' => Country::all()->mapWithKeys(function ($country) {
return [
$country->id => $country->name
];
})
],
];
}
public function getFilterQuery()
{
$filters = request()->get('filters', []);
$query = User::select('id', 'email');
foreach ($this->getFilters() as $field => $filter) {
$data = (isset($filters[$field])) ? $filters[$field] : -1;
if ($data < 0) {
continue;
}
if ($filter['type'] == 'multi-select') {
$query->whereHas($field, function ($q) use ($data) {
$q->whereIn('id', $data);
});
} elseif ($filter['type'] == 'from-to') {
if (($data['from'] && $data['to']) && $data['to'] > $data['from']) {
$query->whereBetween($field, [$data['from'], $data['to']]);
}
} else {
$query->where($field, $data);
}
}
return $query;
}
- Configuration file is available at config/netcore/module-email.php
use Modules\Email\Models\AutomatedEmail;
use Netcore\Translator\Helpers\TransHelper;
$emails = [
[
'key' => 'verify_email',
'period' => 'now',
'type' => 'static', // Available types: static, period, interval
'is_active' => true,
'translations' => [
'name' => 'Email verification',
'text' => 'Please verify your email by clicking on the link: <a href="[VERIFICATION_URL]">[VERIFICATION_URL]</a>'
]
]
];
foreach ($emails as $email) {
$emailModel = AutomatedEmail::create(array_except($email, 'translations'));
$translations = [];
foreach (TransHelper::getAllLanguages() as $language) {
$translations[$language->iso_code] = $email['translations'];
}
$emailModel->updateTranslations($translations);
}
- Add/remove email to/from subscriptions list
email()->subscribe('[email protected]');
email()->unsubscribe('[email protected]');
- Send automated email
email()->send('verify_email', $user, [
'VERIFICATION_URL' => $verificationUrl
]);