Let’s say I have this requirement to send the shipment email every 5 minutes or 10 minutes. To perform the task, I chose to create a custom cronjob and its file to achieve the functionality. Follow the below steps for more details.
Step 1: Create a crontab.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="default">
<job name="sendshipmentemail" instance="MagemonkeysShipmentemailsendCronSend" method="execute">
<schedule>0,15,30,45 * * * *</schedule>
</job>
</group>
</config>
Step 2: Create a Send.php file. Please follow the below code
<?php
namespace MagemonkeysShipmentemailsendCron;
use MagentoFrameworkApiSearchFilterGroupBuilder;
use MagentoFrameworkApiSearchCriteriaBuilder;
use MagentoFrameworkAppObjectManager;
use MagentoSalesModelOrderShipmentRepository;
use MagentoSalesModelOrderRepository;
use MagentoFrameworkApiFilterBuilder;
use PsrLogLoggerInterface;
class Send
{
private $orderRepository;
private $searchCriteriaBuilder;
public function __construct(
OrderRepository $orderRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
ShipmentRepository $shipmentRepository,
FilterBuilder $filterBuilder,
FilterGroupBuilder $filterGroupBuilder,
LoggerInterface $logger
)
{
$this->orderRepository = $orderRepository;
$this->shipmentRepository = $shipmentRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->filterBuilder = $filterBuilder;
$this->filterGroupBuilder = $filterGroupBuilder;
$this->objectManager = ObjectManager::getInstance();
$this->logger = $logger;
}
public function execute()
{
$filtergroup_date = $this->filterGroupBuilder
->addFilter(
$this->filterBuilder
->setField('created_at')
->setConditionType('gt')
->setValue('2020-01-01')
->create()
)
->create();
$filtergroup_email_sent = $this->filterGroupBuilder
->addFilter(
$this->filterBuilder
->setField('email_sent')
->setConditionType('null')
->create()
)
->create();
$filtergroup_send_email = $this->filterGroupBuilder
->addFilter(
$this->filterBuilder
->setField('send_email')
->setConditionType('null')
->create()
)
->create();
$searchCriteria = $this->searchCriteriaBuilder
->setFilterGroups([
$filtergroup_date,
$filtergroup_email_sent,
$filtergroup_send_email
])
->create();;
$shipmentList = $this->shipmentRepository->getList($searchCriteria)->getItems();
foreach ($shipmentList as $shipment) {
if (count($shipment->getTracks()) > 0) {
$this->objectManager->create('MagentoShippingModelShipmentNotifier')->notify($shipment);
$shipment->setEmailSent("1");
$shipment->save();
} else {
$this->logger->warning("Unable to send shipment email for order");
}
}
}
}
Now, when the cron runs it will execute our code and if any shipment mail needs to send then it will be sent.

