Original question was about not using template (as I got it) but I'm not sure. Best practice I assume is to use email template.
Here is an example of my extension which sends emails every day (cronjob isn't included)
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'ImaginationMedia_ReportSender',
__DIR__
);
etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="ImaginationMedia_ReportSender" setup_version="1.1.0" />
</config>
etc/email_templates.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd">
<template id="daily_status_template"
label="Daily Sales by ImaginationMedia"
file="daily_status_template.html" type="html"
module="ImaginationMedia_ReportSender" area="frontend"/>
</config>
etc/adminhtml/routes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="reportsender" frontName="reportsender">
<module name="ImaginationMedia_ReportSender" />
</route>
</router>
</config>
view/frontend/email/daily_status_template.html
<!--@subject {{trans "Sales Report from Our Client"}} @-->
<h3>Report from {{var data.report_date|raw}}</h3>
<p><b>Number of orders:</b> {{var data.orders_count|raw}}</p>
<p><b>Items count:</b> {{var data.order_items_count|raw}}</p>
<p><b>Average items per order:</b> {{var data.avg_items|raw}}</p>
Model/ReportSend.php
<?php
namespace ImaginationMedia\ReportSender\Model;
use Magento\Framework\Mail\Template\TransportBuilder;
class ReportSend {
public function __construct(
TransportBuilder $transportBuilder,
) {
$this->transportBuilder = $transportBuilder;
}
public function execute() {
$report = [
'report_date' => date("j F Y", strtotime('-1 day')),
'orders_count' => rand(1, 10),
'order_items_count' => rand(1, 10),
'avg_items' => rand(1, 10)
];
$postObject = new \Magento\Framework\DataObject();
$postObject->setData($report);
$transport = $this->transportBuilder
->setTemplateIdentifier('daily_status_template')
->setTemplateOptions(['area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => \Magento\Store\Model\Store::DEFAULT_STORE_ID])
->setTemplateVars(['data' => $postObject])
->setFrom(['name' => 'Robot','email' => 'robot@server.com'])
->addTo(['fred@server.com', 'otherguy@server.com'])
->getTransport();
$transport->sendMessage();
}
}
Controller/Adminhtml/ReportSender.php
<?php
namespace ImaginationMedia\ReportSender\Controller\Adminhtml\ReportSender;
use Magento\Backend\App\Action\Context;
use ImaginationMedia\ReportSender\Model\ReportSend;
class Index extends \Magento\Backend\App\Action {
public function __construct(
Context $context,
ReportSend $reportSend
) {
parent::__construct($context);
$this->reportSend = $reportSend;
}
public function execute() {
$this->reportSend->execute();
echo 'Email sent!';
}
}
And finally to test sending your emails use this link (your security keys should be off for this trick):
http://yourwebsite.dev/admin/reportsender/reportsender/index