. Fuer Agenturen mit vielen Websites und fuer Pruefungen per Skript. * Gibt nie Zugangsdaten aus. */ final class Cli { /** * Status: sending, connection, sender, quota, queue. * * ## OPTIONS * * [--format=] * : table or json * --- * default: table * --- * * @when after_wp_load */ public function status(array $args, array $assoc): void { $k = Einstellungen::apiSchluessel() !== '' ? Api::kontingent(true) : null; $zeilen = [ ['feld' => 'version', 'wert' => SENDMAILS_VERSION], ['feld' => 'versand_aktiv', 'wert' => Einstellungen::versandAktiv() ? 'yes' : 'no'], ['feld' => 'api', 'wert' => $k === null ? 'no key' : ($k['ok'] ? 'connected' : 'error: ' . $k['fehler'])], ['feld' => 'absender', 'wert' => (string) Einstellungen::wert('absender_email')], ['feld' => 'anderes_mail_plugin', 'wert' => Versand::fremdesMailPlugin() ?? '-'], ['feld' => 'kontingent', 'wert' => $k && $k['ok'] ? sprintf('%d of %d (%d %%)', (int) $k['daten']['verbraucht'], (int) $k['daten']['mails_pro_monat'], (int) $k['daten']['prozent']) : '-'], ['feld' => 'bei_vollem_kontingent', 'wert' => $k && $k['ok'] ? (string) ($k['daten']['verhalten_wirksam'] ?? '-') : '-'], ['feld' => 'warteschlange', 'wert' => sprintf('%d waiting, %d held, %d given up', Warteschlange::anzahl('wartet'), Warteschlange::anzahl('angehalten'), Warteschlange::anzahl('aufgegeben'))], ['feld' => 'letzter_abgleich', 'wert' => (string) Abgleich::stand()['letzter_lauf']], ]; \WP_CLI\Utils\format_items((string) ($assoc['format'] ?? 'table'), $zeilen, ['feld', 'wert']); } /** * Send a test email via send-mails.de (also before sending is turned on). * * ## OPTIONS * * * : recipient * * @when after_wp_load */ public function test(array $args): void { $an = sanitize_email((string) ($args[0] ?? '')); if (!is_email($an)) { \WP_CLI::error('Not a valid email address.'); } [$ok, $fehler] = Versand::test(['to' => $an, 'subject' => __('Test email from send-mails.de for WordPress', 'purehost-send-mails'), /* translators: %s: website address */ 'message' => sprintf(__("This test email comes from %s and was sent via send-mails.de.\n\nIf it has arrived, sending is set up correctly.", 'purehost-send-mails'), home_url())]); $ok ? \WP_CLI::success("Test email to $an accepted.") : \WP_CLI::error('Rejected: ' . (string) ($fehler['text'] ?? '')); } /** * Sync bounces, complaints and delivery status now. * * @when after_wp_load */ public function abgleich(): void { $r = Abgleich::laufen(); $r['ok'] ? \WP_CLI::success(sprintf('%d new events.', $r['neu'])) : \WP_CLI::error($r['fehler']); } /** * Show the queue or send due emails now. * * ## OPTIONS * * [--senden] * : retry due emails now * * @when after_wp_load */ public function warteschlange(array $args, array $assoc): void { if (!empty($assoc['senden'])) { $r = Warteschlange::abarbeiten(); \WP_CLI::success(sprintf('%d sent, %d waiting, %d given up.', $r['gesendet'], $r['wartet'], $r['aufgegeben'])); return; } $liste = array_map(static fn($z) => ['id' => $z['id'], 'erstellt' => $z['erstellt'], 'status' => $z['status'], 'versuche' => $z['versuche'], 'an' => $z['an'], 'betreff' => $z['betreff']], Warteschlange::liste(50)); \WP_CLI\Utils\format_items('table', $liste, ['id', 'erstellt', 'status', 'versuche', 'an', 'betreff']); } /** * Latest entries of the email log. * * ## OPTIONS * * [--anzahl=] * : how many (default 20) * * [--suche=] * : recipient or subject * * [--format=] * : table, csv or json * --- * default: table * --- * * @when after_wp_load */ public function protokoll(array $args, array $assoc): void { $r = Protokoll::liste(['suche' => (string) ($assoc['suche'] ?? '')], 1, max(1, min(500, (int) ($assoc['anzahl'] ?? 20)))); $liste = array_map(static fn($z) => ['zeit' => $z['zeit'], 'quelle' => $z['quelle'], 'an' => $z['an'] !== '' ? $z['an'] : '…@' . $z['domain'], 'betreff' => $z['betreff'], 'status' => $z['status'], 'zustellung' => $z['zustellung']], $r['zeilen']); \WP_CLI\Utils\format_items((string) ($assoc['format'] ?? 'table'), $liste, ['zeit', 'quelle', 'an', 'betreff', 'status', 'zustellung']); } /** * List held sources (protection against mass sending) and decide. * * ## OPTIONS * * [] * : freigeben (send), vertrauen (send and trust) or verwerfen (discard) * * [] * : source, e.g. contact-form-7 * * @when after_wp_load */ public function bremse(array $args): void { [$aktion, $quelle] = array_pad($args, 2, ''); if ($aktion === '') { $liste = array_map(static fn($b) => ['quelle' => $b['quelle'], 'mails' => $b['mails'], 'seit' => $b['erste'], 'stunde' => $b['stunde'] ?? 0, 'grenze' => $b['grenze'] ?? 0], array_values(Bremse::angehalten())); $liste ? \WP_CLI\Utils\format_items('table', $liste, ['quelle', 'mails', 'seit', 'stunde', 'grenze']) : \WP_CLI::log('No held emails.'); return; } if (!in_array($aktion, ['freigeben', 'vertrauen', 'verwerfen'], true) || $quelle === '') { \WP_CLI::error('Usage: wp sendmails bremse '); } $n = Bremse::entscheiden($quelle, $aktion); if ($aktion !== 'verwerfen') { Warteschlange::abarbeiten(); } \WP_CLI::success(sprintf('%d emails from %s: %s.', $n, $quelle, $aktion)); } }