@JonoM Have played around with Bulk Manager. The following code allows me to send a custom (currently hard-coded) email message to selected members (add to desired members modeladmin):
namespace App\Web;
use SilverStripe\Admin\ModelAdmin;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
use Colymba\BulkManager\BulkManager;
use App\Web\BulkEmailHandler;
use App\Web\Guide;
class GuidesAdmin extends ModelAdmin {
private static $menu_title = 'Guides';
private static $url_segment = 'guides';
private static $managed_models = array (
Guide::class
);
function getEditForm($id = null, $fields = null){
$form = parent::getEditForm($id, $fields);
$guidegrid = $form->Fields()->fieldByName("App-Web-Guide");
// allows bulk emailing to selected members
if($guidegrid){
$config = $guidegrid->getConfig()->addComponent(new BulkManager());
$config->getComponentByType('Colymba\\BulkManager\\BulkManager')
->addBulkAction(BulkEmailHandler::class)
->removeBulkAction('Colymba\BulkManager\BulkAction\DeleteHandler')
->removeBulkAction('Colymba\BulkManager\BulkAction\UnlinkHandler')
->removeBulkAction('Colymba\BulkManager\BulkAction\EditHandler');
}
return $form;
}
}
Then the custom bulk action - BulkEmailHandler.php
namespace App\Web;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\Email\Email;
use SilverStripe\SiteConfig\SiteConfig;
use Exception;
use Colymba\BulkManager\BulkAction\Handler;
use Colymba\BulkTools\HTTPBulkToolsResponse;
class BulkEmailHandler extends Handler
{
private static $url_segment = 'email';
private static $allowed_actions = array('email');
private static $url_handlers = array(
'' => 'email',
);
protected $label = 'Send Login Details Email';
protected $destructive = false;
public function email(HTTPRequest $request)
{
$records = $this->getRecords();
$response = new HTTPBulkToolsResponse(false, $this->gridField);
try {
foreach ($records as $record)
{
// send email to each selected member
$sender = SiteConfig::current_site_config()->Email;
$email = Email::create()
->setTo($record->Email)
->setReplyTo($sender)
->setSubject("Member login details")
->setBody("
<p>Hi {$record->FirstName},</p>
<p>To login, please visit: [website link]<br>Email: {$record->Email}</p>
");
$done = $email->send();
if ($done){
$response->addSuccessRecord($record);
} else {
$response->addFailedRecord($record, $done);
}
}
$doneCount = count($response->getSuccessRecords());
$failCount = count($response->getFailedRecords());
/*$message = sprintf(
'Published %1$d of %2$d records.',
$doneCount,
$doneCount + $failCount
);*/
$message = 'Emails sent to: '.implode(', ',$records->column('Email'));
$response->setMessage($message);
} catch (Exception $ex) {
$response->setStatusCode(500);
$response->setMessage($ex->getMessage());
}
return $response;
}
}
It’s still away off yet, but maybe you have some ideas as to how to add a user-customisable email message?