nyx-solutions / yii2-nyx-sendgrid
Yii2 Mailer extension for SendGrid with batch mailing support.
Installs: 84
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
Requires
- php: >=8.1.0 <8.2
- nyx-solutions/yii2-nyx: ~5.0.0
- sendgrid/sendgrid: ~5.4
README
Yii2 Mailer extension for SendGrid with batch mailing support.
Installation
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist nyx-solutions/yii2-nyx-sendgrid
or add
"nyx-solutions/yii2-nyx-sendgrid": "~2.0.0"
to the require section of your application's composer.json
file.
Then configure your mailer
component in your main-local.php
(advanced) or web.php
(basic) like so:
'mailer' => [ 'class' => \nyx\mail\sendgrid\Mailer::class, 'viewPath' => '@common/mail', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => false, 'apiKey' => '[YOUR_SENDGRID_API_KEY]', ],
Do not forget to replace apiKey
with your SendGrid API key. It must have permissions to send emails.
Usage
Single Mailing
$user = \common\models\User::find()->select(['id', 'username', 'email'])->where(['id' => 1])->one(); $mailer = Yii::$app->mailer; $message = $mailer->compose() ->setTo([$user->email => $user->username]) // or just $user->email ->setFrom(['alerts@example.com' => 'Alerts']) ->setReplyTo('noreply@example.com') ->setSubject('Hey -username-, Read This Email') ->setHtmlBody('Dear -username-,<br><br>My HTML message here') ->setTextBody('Dear -username-,\n\nMy Text message here') //->setTemplateId('1234') //->addSection('%section1%', 'This is my section1') //->addHeader('X-Track-UserType', 'admin') //->addHeader('X-Track-UID', Yii::$app->user->id) //->addCategory('tests') //->addCustomArg('test_arg', 'my custom arg') //->setSendAt(time() + (5 * 60)) //->setBatchId(Yii::$app->mailer->createBatchId()) //->setIpPoolName('7') //->attach(Yii::getAlias('@webroot/files/attachment.pdf')) ->addSubstitution('-username-', $user->username) ->send(); if ($message === true) { echo 'Success!'; echo '<pre>' . print_r($mailer->getRawResponses(), true) . '</pre>'; } else { echo 'Error!<br>'; echo '<pre>' . print_r($mailer->getErrors(), true) . '</pre>'; }
Batch Mailing
If you want to send to multiple recipients, you need to use the below method to batch send.
$mailer = Yii::$app->mailer; //$batchId = Yii::$app->mailer->createBatchId(); //$sendTime = time() + (5 * 60); // 5 minutes from now foreach (User::find()->select(['id', 'username', 'email'])->batch(500) as $users) { $message = $mailer->compose() ->setFrom(['alerts@example.com' => 'Alerts']) ->setReplyTo('noreply@example.com') ->setSubject('Hey -username-, Read This Email') ->setHtmlBody('Dear -username-,<br><br>My HTML message here') ->setTextBody('Dear -username-,\n\nMy Text message here'); //->setTemplateId('1234') //->addSection('%section1%', 'This is my section1') //->addHeader('X-Track-UserType', 'admin') //->addHeader('X-Track-UID', Yii::$app->user->id) //->addCategory('tests') //->addCustomArg('test_arg', 'my custom arg') //->setSendAt($sendTime) //->setBatchId($batchId) //->setIpPoolName('7') //->attach(Yii::getAlias('@webroot/files/attachment.pdf')); foreach ( $users as $user ) { // A Personalization Object Helper would be nice here... $personalization = [ 'to' => [$user->email => $user->username], // or just `email@example.com` //'cc' => 'cc@example.com', //'bcc' => 'bcc@example.com', //'subject' => 'Hey -username-, Custom message for you!', //'headers' => [ // 'X-Track-RecipId' => $user->id, //], 'substitutions' => [ '-username-' => $user->username, ], //'custom_args' => [ // 'user_id' => $user->id, // 'type' => 'marketing', //], //'send_at' => $sendTime, ]; $message->addPersonalization($personalization); } $result = $message->send(); } if ($result === true) { echo 'Success!'; echo '<pre>' . print_r($mailer->getRawResponses(), true) . '</pre>'; } else { echo 'Error!<br>'; echo '<pre>' . print_r($mailer->getErrors(), true) . '</pre>'; }
NOTE: SendGrid supports a max of 1,000 recipients. This is a total of the to, bcc, and cc addresses.