Here in this post, I’m going to show how you can send bulk transactional emails programmatically using SendGrid API & an email template created in Magento.
Before getting started, let’s understand the used table’s role in this script.
customer_data_live => here we have a list of customers’ emails with an email sent flag.
block_email => here we have a list of customers who are blocked from sending emails.
<?php ini_set("memory_limit", "-1"); ini_set('max_execution_time', 18000); ini_set('display_startup_errors', 1); error_reporting(E_ALL); use Magento\Framework\App\Bootstrap; include '/data/html/app/bootstrap.php'; $bootstrap = Bootstrap::create(BP, $_SERVER); $objectManager = $bootstrap->getObjectManager(); $state = $objectManager->get('Magento\Framework\App\State'); $state->setAreaCode('frontend'); $resource = $objectManager->get('Magento\Framework\App\ResourceConnection'); $connection = $resource->getConnection(); shootMail($connection); function shootMail($connection){ $sql = "select `template_text` from `email_template` where template_id =10"; //get you email template id from admin $email_template = $connection->fetchOne($sql); $customer_emails = getCustomerList($connection); foreach ($customer_emails as $email) { $customer_email = $email['email']; $entity_id = $email['entity_id']; $notblocklisted = checkifblocklisted($connection,$customer_email); //ignore this if you have no any blocked emails record in any custom table if($notblocklisted==false) { $response = sendEmail($connection,$customer_email,$email_template); $sql = "update `customer_data_live` set `mail_sent` ='$response' where entity_id ='$entity_id'"; $connection->query($sql); } else { $sql = "update `customer_data_live` set `mail_sent` ='blocklisted_email' where entity_id ='$entity_id'"; $connection->query($sql); } } } function sendEmail($connection,$customer_email,$message_text) { $response_mesage=NULL; $subject="Celebrating the Sale"; $url = 'https://api.sendgrid.com/'; $user = '[email protected]'; $pass = 'test@132'; $json_string = array( 'category' =>'no-reply' ); $fromaddress='Sales'; $from='[email protected]'; $request = $url . 'api/mail.send.json'; $html = $message_text; $html = urlencode($html); $session = curl_init($request); curl_setopt($session, CURLOPT_POSTFIELDS, "api_user=".$user."&api_key=".$pass."&x-smtpapi=".json_encode($json_string)."&X-PM-TrackOpens=true&to[]=$customer_email&subject=".$subject."&html=".$html."&fromname=".$fromaddress."&from=$from");curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); $response = json_decode(curl_exec($session),true); if(!empty($response) && is_array($response)) { $response_mesage = $response['message']; } curl_close($session); return $response_mesage; } function getCustomerList($connection){ $sql = "SELECT `email`,`entity_id` FROM `customer_data_live` where mail_sent is null limit 20"; return $connection->fetchAll($sql); } function checkifblocklisted($connection,$email){ $sql = "select email from `block_email` where email ='$email'"; $email = $connection->fetchOne($sql); if(!empty($email)) { return true; } return false; }