Email system with templates and email queuing.
Please download using ONE of the following methods:
All requirements are automatically downloaded into the correct location when using composer. There is no need to download additional files or set paths to third party files.
Get composer:
curl http://getcomposer.org/installer | php
Install latest release OR development version:
php composer.phar require cornernote/yii-email-module:* // latest release php composer.phar require cornernote/yii-email-module:dev-master // development version
Add the vendor
folder to the aliases
in your yii configuration:
return array( 'aliases' => array( 'vendor' => '/path/to/vendor', ), );
Download the latest release or
development version and move the
email
folder into your protected/modules
folder.
In addition the following are required:
swiftMailerPath
as per the Configuration section.
mustachePath
as per the Configuration section.
Add the email
folder to the aliases
in your yii configuration:
return array( 'aliases' => array( 'email' => '/path/to/vendor/cornernote/yii-email-module/email', ), );
Add EmailModule
to the modules
in your yii configuration.
Minimum configuration:
return array( 'modules' => array( 'email' => array( 'class' => 'email.EmailModule', 'adminUsers' => array('admin'), ), ), );
Full configuration:
return array( 'modules' => array( 'email' => array( // path to the EmailModule class 'class' => 'email.EmailModule', // The ID of the CDbConnection application component. If not set, a SQLite3 // database will be automatically created in protected/runtime/email-EmailVersion.db. 'connectionID' => 'db', // Whether the DB tables should be created automatically if they do not exist. Defaults to true. // If you already have the table created, it is recommended you set this property to be false to improve performance. 'autoCreateTables' => true, // The layout used for module controllers. 'layout' => 'email.views.layouts.column1', // Defines the access filters for the module. // The default is EmailAccessFilter which will allow any user listed in EmailModule::adminUsers to have access. 'controllerFilters' => array( 'emailAccess' => array('email.components.EmailAccessFilter'), ), // A list of users who can access this module. 'adminUsers' => array('admin'), // The path to YiiStrap. // Only required if you do not want YiiStrap in your app config, for example, if you are running YiiBooster. // Only required if you did not install using composer. // Please note: // - You must download YiiStrap even if you are using YiiBooster in your app. // - When using this setting YiiStrap will only loaded in the menu interface (eg: index.php?r=menu). 'yiiStrapPath' => '/path/to/vendor/crisu83/yiistrap', ), ), );
Add EEmailManager
to the components
section in your yii configuration.
Minimum configuration:
return array( 'components' => array( 'emailManager' => array( 'class' => 'email.components.EEmailManager', 'fromEmail' => 'webmaster@your.dom.ain', ), ), );
Full configuration:
return array( 'components' => array( 'emailManager' => array( // path to the EEmailManager class 'class' => 'email.components.EEmailManager', // Path to the SwiftMailer lib folder. // Only required if you did not install using composer. 'swiftMailerPath' => '/path/to/vendor/swiftmailer/swiftmailer/lib', // Path to the Mustache src folder. // Only required then templateType is set to "db". // Only required if you did not install using composer. 'mustachePath' => '/path/to/vendor/mustache/mustache/src', // Default from email address. 'fromEmail' => 'webmaster@your.dom.ain', // Default from name. // If unset the application name is used. 'fromName' => null, // Template type, can be one of: php, db. 'templateType' => 'php', // When templateType=php this is the path to the email views. // You may copy the default templates from email/views/emails. 'templatePath' => 'application.views.emails', // List of template parts that will be rendered. 'templateFields' => array('subject', 'heading', 'message'), // The default layout to use for template emails. 'defaultLayout' => 'layout_default', // The default transport to use. // For this example you can use "mail", "smtp" or "anotherSmtp". 'defaultTransport' => 'mail', // A list of email transport methods, for example: // array( // 'transport_name_or_id' => array( // // the class name of the Swift_Transport subclass // 'class' => 'Swift_Transport', // // set Swift_Transport::property1 to "my value" // 'property1' => 'my value', // // call Swift_Transport::setProperty2("my value") // 'setters' => array( // 'property2' => 'my value', // ), // ), // ) 'transports' => array( // mail transport 'mail' => array( // can be Swift_MailTransport or Swift_SmtpTransport 'class' => 'Swift_MailTransport', ), // smtp transport 'smtp' => array( // if you use smtp you may need to define the host, port, security and setters 'class' => 'Swift_SmtpTransport', 'host' => 'localhost', 'port' => 25, 'security' => null, 'setters' => array( 'username' => 'your_username', 'password' => 'your_password', ), ), // another smtp transport 'anotherSmtp' => array( 'class' => 'Swift_SmtpTransport', 'host' => 'localhost', 'port' => 25, 'security' => null, 'setters' => array( 'username' => 'another_username', 'password' => 'another_password', ), ), // gmail smtp transport 'gmailSmtp' => array( 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.gmail.com', 'port' => 465, 'security' => 'ssl', 'setters' => array( 'username' => 'username@gmail.com', 'password' => 'password', ), ), ), ), ), );
To use the commands that are included with yii-email-manager, add the following to the
commandMap
section of your yiic configuration:
return array( 'commandMap' => array( 'emailSpool' => 'email.commands.EmailSpoolCommand', ), );
Yii::app()->emailManager->email('user@dom.ain', 'test email', '<b>Hello</b> <i>World<i>!');
To send more complex emails you will need to use Email Templates.
You will first need to follow the instructions in extending EEmailManager.
Create a new component in components/EmailManager.php
:
<?php Yii::import('email.components.EEmailManager'); class EmailManager extends EEmailManager { public $defaultSendNow = false; public function sendUserWelcome($user) { // build the message from the templates and layouts $template = 'user_welcome'; $templateParams = array( 'user' => $user, ); $message = $this->buildTemplateMessage($template, $templateParams, 'layout_fancy'); // get the message $swiftMessage = Swift_Message::newInstance($message['subject']); $swiftMessage->setBody($message['message'], 'text/html'); //$swiftMessage->addPart($message['text'], 'text/plain'); $swiftMessage->setFrom($this->fromEmail, $this->fromName); $swiftMessage->setTo($user->email, $user->name); // send the email if ($this->defaultSendNow) return Yii::app()->emailManager->deliver($swiftMessage); // or spool the email $emailSpool = $this->getEmailSpool($swiftMessage, $user); $emailSpool->priority = 10; $emailSpool->template = $template; // save template for logging and debugging purposes $emailSpool->transport = 'smtp'; // send using smtp return $emailSpool->save(false); } }
Subject views/emails/example/subject.php
:
<?php echo 'hello' . $user->name;
Heading views/emails/example/heading.php
:
<?php echo 'Hi there ' . $user->name . ', Welcome to My Application';
Message views/emails/example/message.php
:
<?php echo 'Here is an <b>awesome</b> email!';
Subject
hello {{user.name}}
Heading
Hi there {{user.name}}, Welcome to My Application
Message
Here is an <b>awesome</b> email!
Now you can send an email like this:
$user = User::model()->findByPk(123); Yii::app()->emailManager->sendUserWelcome($user);
You can send the spooled emails using the yiic command:
yiic emailSpool
Setup lockrun for overlap protection. This allows a cron job that will run every minute, with no risk of a new process starting if an existing process is running.
Add the following to your crontab:
* * * * * /usr/local/bin/lockrun --idempotent --lockfile=/path/to/app/runtime/emailSpool.lock -- /path/to/yiic emailSpool loop > /dev/null 2>&1
Before extending you should check the available configuration options. In many occasions you can configure the
EEmailManager
class to behave as you require.
If you wish to extend for more complex functionality, you can simply update the class path in your yii config to point to your own
EmailManager
class, all the other configuration options will still be available:
return array( 'components' => array( 'emailManager' => array( // path to the EmailManager class 'class' => 'application.components.EmailManager', ), ), );
For example, to make the app available to all templates and layouts, you can override
buildTemplateMessage()
:
class EmailManager extends EEmailManager { public function buildTemplateMessage($template, $viewParams = array(), $layout = 'layout_default') { $viewParams['app'] = Yii::app(); return parent::buildTemplateMessage($template, $viewParams, $layout); } }
In your PHP templates, you can use:
<?php echo 'My app, with ID=' . $app->id . ' is named ' . $app->name . '!';
In your DB mustache templates, you can use:
My app, with ID={{app.id}} is named {{app.name}}!
Each of the template parts is rendered (subject
,
heading
and
message
), and then those parts become variables in the layout.
This allows features such as:
{{contents}} - My Application
For an example, let's take a look at a layout and template for a subject
part:
TEMPLATE SUBJECT
Welcome {{user.username}}
LAYOUT SUBJECT
{{contents}} - My Application
GENERATED SUBJECT
Welcome cornernote - My Application
As you can see, the contents
in the
layout gets replaced by the parsed
template subject.
No, these variables will be created internally based on your the 3 parts of the
template (subject
, heading
and
message
), which will be passed into the layout.
In your layout you should use the variable {{content}}
or
$content
to refer to
the corresponding template output.
Note: Due to the rendering order:
{{subject}}
and {{heading}}
are available in the
layout message,
{{subject}}
is available in the layout header,Mustache replaces
{{double_curly_braces}}
with the htmlencoded value of the variable. You should use
{{{tripple_culry_braces}}}
if your variable contains HTML code.