
Sendex
Email newsletters in MODX — subscribers, send queue, and a front-end subscribe form


Sendex has no public REST API. Use xPDO models and sx* classes from MODX context (snippet, plugin, cron).
Cron and the connector load bootstrap automatically. In custom code:
$corePath = $modx->getOption('sendex_core_path', null, MODX_CORE_PATH . 'components/sendex/');
require_once $corePath . 'bootstrap.php';
sendexBootstrap($modx);/** @var sxNewsletter $newsletter */
$newsletter = $modx->getObject('sxNewsletter', 1);
if (!$newsletter) {
return;
}| Method | Description |
|---|---|
subscribe($userId, $email, $source) | Subscribe; $source: snippet, ajax, confirm, mgr, guest |
unSubscribe($code, $source) | Unsubscribe by sxSubscriber.code |
confirmEmail($hash) | Confirm guest after link click |
isSubscribed($userId, $email) | Subscriber ID or 0 |
addQueues() | Build queue for all newsletter subscribers |
sendToSubscribers($options) | addQueues() + flush() in one call |
$newsletter = $modx->getObject('sxNewsletter', 1);
$result = $newsletter->subscribe($modx->user->id, '', 'mgr');
// true | false | string (error / Before event cancel message)$newsletter = $modx->getObject('sxNewsletter', 1);
$result = $newsletter->sendToSubscribers([
'stopOnError' => true,
]);
// ['success' => bool, 'message' => string, 'queued' => int, 'sent' => int, ...]Low-level queue delivery (cron uses the same class):
require_once MODX_CORE_PATH . 'components/sendex/model/sendex/sxqueuesender.class.php';
$stats = sxQueueSender::flush($modx, [
'limit' => (int) $modx->getOption('sendex_queue_limit', null, 100),
'logErrors' => true,
'criteria' => ['newsletter_id' => 1], // optional
]);
// ['sent' => int, 'skipped' => int, 'failed' => int, 'firstError' => string|null]Single row:
$queue = $modx->getObject('sxQueue', 42);
$result = sxQueueSender::sendOne($queue);
// true | false (skip) | string (mail error)$queue->send() on sxQueue — use sxQueueSender::sendOne()Sendex snippet on the siteEvery subscribe, unSubscribe, addQueues, flush call fires sxOn* events. See Events.