DEV Community

Rahul Khan
Rahul Khan

Posted on

2

Sending mails using Cron in Drupal 8

In this post, we will be sending a simple birthday greeting email to the users using cron.

First, we have to create a module file in our custom module folder. We will name it as 'MODULE_NAME.module'. Using the hook_cron(), we will call a function to send the emails to the users where the mail-body is defined.

function MODULE_NAME_cron() {
    user_birthday_mails();
}
Enter fullscreen mode Exit fullscreen mode

Now we will fetch the details of the users, namely User-Name, Email-ID & Date of Birth.

In this scenario, I'm fetching the user details from a custom table.

<?php
function user_birthday_mails() {
    // this is used to send HTML emails
    $send_mail = new \Drupal\Core\Mail\Plugin\Mail\PhpMail();

    $current_m_d = date('m-d', \Drupal::time()->getRequestTime());
    $fetch_query = \Drupal::database()->query("SELECT `firstname`, `email`, `dob` FROM `TABLE_NAME`");
    $query_result = $fetch_query->fetchAll();

    foreach($query_result as $result){
        $birthday = explode('-', $result->dob);
        $birth_m_d = $birthday[1].'-'.$birthday[2];

        $user_name = $result->firstname;
        $user_mail = $result->email;

        if($birth_m_d == $current_m_d){
            $from = 'sitename@example.com';
            $to = $user_mail;
            $message['headers'] = array(
                'content-type' => 'text/html',
                'MIME-Version' => '1.0',
                'reply-to' => $from,
                'from' => 'Site Admin <'.$from.'>'
            );
            $message['to'] = $to;
            $message['subject'] = "Happy Birthday ".$user_name."!!!";

            $message['body'] = 'Dear '.$user_name.',
            <br><br>
            We value your special day just as much as we value you. On your birthday, we send you our warmest and most heartfelt wishes..
            <br><br>
            Regards,<br>
            Site Admin';

            $send_mail->mail($message);
            \Drupal::logger('userinfo')->notice('Birthday mail sent to '.$user_name);
        };
    }
}
Enter fullscreen mode Exit fullscreen mode

I hope you find this simple use of cron helpful.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs