Plugin Directory

Changeset 3733698


Ignore:
Timestamp:
10/08/2026 05:26:03 AM (2 weeks ago)
Author:
rahul1099
Message:

Release 1.0.7: delivery statuses in the email log (Delivered, Deferred, Bounced, Spam complaint); accepted mail labelled Sent

Location:
cybexsoft-smtp
Files:
30 edited
1 copied

Legend:

Unmodified
Added
Removed
  • cybexsoft-smtp/tags/1.0.7/admin/css/admin.css

    r3732590 r3733698  
    818818        background: var(--cybex-red-bg-2);
    819819}
     820/* Confirmed by the provider: the one status that is more than "it was taken". */
     821.cybex-status-pill.is-delivered {
     822        color: var(--cybex-green-dark);
     823        background: var(--cybex-green-bg);
     824        box-shadow: inset 0 0 0 1px var(--cybex-green-line);
     825}
     826/* Still the provider's to deliver: not good yet, not a failure either. */
     827.cybex-status-pill.is-deferred {
     828        color: var(--cybex-amber);
     829        background: var(--cybex-amber-bg);
     830}
    820831/* Deliberately not red: nothing went wrong, the site chose not to send. */
    821832.cybex-status-pill.is-blocked {
    … …  
    42024213        height: 17px;
    42034214}
     4215
     4216/* Pro: the provider's reports about one message, in the log viewer. */
     4217.cybex-delivery-timeline ol {
     4218        margin: 0;
     4219        padding: 0;
     4220        list-style: none;
     4221}
     4222.cybex-delivery-timeline li {
     4223        padding: 4px 0;
     4224}
     4225.cybex-delivery-timeline li + li {
     4226        border-top: 1px solid var(--cybex-neutral-bg);
     4227}
     4228.cybex-timeline-time,
     4229.cybex-timeline-detail {
     4230        color: var(--cybex-muted-2);
     4231        font-size: var(--cybex-fs-sm);
     4232}
     4233.cybex-timeline-detail {
     4234        margin-top: 2px;
     4235        word-break: break-word;
     4236}
     4237.cybex-delivery-rates {
     4238        margin-top: 4px;
     4239}
  • cybexsoft-smtp/tags/1.0.7/admin/views/tab-dashboard.php

    r3727515 r3733698  
    241241                        <?php
    242242                        printf(
    243                                 /* translators: 1: delivered count, 2: failed count */
    244                                 esc_html__( '%1$s delivered · %2$s failed', 'cybexsoft-smtp' ),
     243                                /* translators: 1: count of messages the provider accepted, 2: failed count */
     244                                esc_html__( '%1$s sent · %2$s failed', 'cybexsoft-smtp' ),
    245245                                esc_html( number_format_i18n( $summary['sent'] ) ),
    246246                                esc_html( number_format_i18n( $summary['failed'] ) )
    … …  
    250250        </div>
    251251        <div class="cybex-card cybex-stat">
    252                 <div class="cybex-stat-top"><span><?php esc_html_e( 'Delivered · 30d', 'cybexsoft-smtp' ); ?></span></div>
     252                <div class="cybex-stat-top"><span><?php esc_html_e( 'Accepted · 30d', 'cybexsoft-smtp' ); ?></span></div>
    253253                <div class="cybex-stat-value"><?php echo $summary['total'] ? esc_html( number_format_i18n( $summary['delivered_pct'], 1 ) . '%' ) : '—'; ?></div>
    254254                <?php if ( ! $summary['has_prior'] ) : ?>
    … …  
    257257                        <div class="cybex-stat-delta <?php echo $summary['delivered_delta'] >= 0 ? 'is-good' : 'is-bad'; ?>"><?php echo esc_html( $delta_arrow( $summary['delivered_delta'] ) . ' ' . __( 'pts vs previous 30 days', 'cybexsoft-smtp' ) ); ?></div>
    258258                <?php endif; ?>
     259                <?php
     260                /**
     261                 * Below the acceptance rate: room for what happened after acceptance,
     262                 * which an add-on receiving the provider's reports can say.
     263                 */
     264                do_action( 'cybex_smtp/dashboard/accepted_stat_after' );
     265                ?>
    259266        </div>
    260267        <div class="cybex-card cybex-stat">
    … …  
    289296                        <div class="cybex-card-title"><?php esc_html_e( 'Email volume · last 14 days', 'cybexsoft-smtp' ); ?></div>
    290297                        <div class="cybex-chart-legend">
    291                                 <span><span class="cybex-swatch is-ok"></span><?php esc_html_e( 'Delivered', 'cybexsoft-smtp' ); ?></span>
     298                                <span><span class="cybex-swatch is-ok"></span><?php esc_html_e( 'Sent', 'cybexsoft-smtp' ); ?></span>
    292299                                <span><span class="cybex-swatch is-fail"></span><?php esc_html_e( 'Failed', 'cybexsoft-smtp' ); ?></span>
    293300                        </div>
    … …  
    299306                                        data-ok="<?php echo esc_attr( $d['ok'] ); ?>"
    300307                                        data-fail="<?php echo esc_attr( $d['fail'] ); ?>"
    301                                         aria-label="<?php echo esc_attr( $d['date'] . ': ' . $d['ok'] . ' delivered, ' . $d['fail'] . ' failed' ); ?>">
     308                                        aria-label="<?php echo esc_attr( $d['date'] . ': ' . $d['ok'] . ' sent, ' . $d['fail'] . ' failed' ); ?>">
    302309                                        <div class="cybex-bar-fail" style="height:<?php echo esc_attr( round( $d['fail'] * $scale ) ); ?>px"></div>
    303310                                        <div class="cybex-bar-ok" style="height:<?php echo esc_attr( max( 1, round( $d['ok'] * $scale ) ) ); ?>px"></div>
  • cybexsoft-smtp/tags/1.0.7/admin/views/tab-log.php

    r3726993 r3733698  
    3131$filters = array(
    3232        'all'    => __( 'All', 'cybexsoft-smtp' ),
    33         'sent'   => __( 'Delivered', 'cybexsoft-smtp' ),
     33        'sent'   => __( 'Sent', 'cybexsoft-smtp' ),
    3434        'failed' => __( 'Failed', 'cybexsoft-smtp' ),
    3535);
    3636
    37 // Nothing writes this status until an add-on suppresses a message, so the
    38 // filter only appears on sites where there is something behind it.
    39 if ( $counts['blocked'] > 0 ) {
    40         $filters['blocked'] = __( 'Blocked', 'cybexsoft-smtp' );
     37/*
     38 * The rest only appear on sites with something behind them: the delivery
     39 * statuses need a provider reporting back, and blocked needs the block list.
     40 * Labels come from the logger, so a filter reads the same as the pills.
     41 */
     42foreach ( array( 'delivered', 'deferred', 'bounced', 'complained', 'blocked' ) as $optional_status ) {
     43        if ( ! empty( $counts[ $optional_status ] ) ) {
     44                $filters[ $optional_status ] = Cybex_SMTP_Logger::status_label( $optional_status );
     45        }
    4146}
    4247
  • cybexsoft-smtp/tags/1.0.7/admin/views/tab-settings.php

    r3696103 r3733698  
    311311                                <?php esc_html_e( 'Delete failed only', 'cybexsoft-smtp' ); ?>
    312312                        </button>
    313                         <button type="submit" name="scope" value="sent" class="button" onclick="return confirm('<?php echo esc_js( __( 'Delete all delivered log entries?', 'cybexsoft-smtp' ) ); ?>');">
    314                                 <?php esc_html_e( 'Delete delivered only', 'cybexsoft-smtp' ); ?>
     313                        <button type="submit" name="scope" value="sent" class="button" onclick="return confirm('<?php echo esc_js( __( 'Delete all sent log entries?', 'cybexsoft-smtp' ) ); ?>');">
     314                                <?php esc_html_e( 'Delete sent only', 'cybexsoft-smtp' ); ?>
    315315                        </button>
    316316                </form>
  • cybexsoft-smtp/tags/1.0.7/cybexsoft-smtp.php

    r3732590 r3733698  
    44 * Plugin URI:        https://cybexsoft.com/products/wordpress/plugins/cybexsoft-smtp
    55 * Description:       Reliable transactional email for WordPress. Connect a real mailer, log every message, retry what fails, and diagnose deliverability issues.
    6  * Version:           1.0.6
     6 * Version:           1.0.7
    77 * Requires at least: 5.5
    88 * Requires PHP:      7.4
    … …  
    1919}
    2020
    21 define( 'CYBEX_SMTP_VERSION', '1.0.6' );
     21define( 'CYBEX_SMTP_VERSION', '1.0.7' );
    2222/*
    2323 * The shipped schema, versioned separately from the plugin: a release that
  • cybexsoft-smtp/tags/1.0.7/includes/class-cybex-smtp-admin.php

    r3732590 r3733698  
    259259                                'invalidDomain'    => __( 'That does not look like a domain name. Enter just the domain, e.g. example.com.', 'cybexsoft-smtp' ),
    260260                                'genericError'     => __( 'Something went wrong. Please try again.', 'cybexsoft-smtp' ),
    261                                 'delivered'        => __( 'delivered', 'cybexsoft-smtp' ),
     261                                'delivered'        => __( 'sent', 'cybexsoft-smtp' ),
    262262                                'failed'           => __( 'failed', 'cybexsoft-smtp' ),
    263263                                'sendingRequest'   => __( 'Sending request…', 'cybexsoft-smtp' ),
  • cybexsoft-smtp/tags/1.0.7/includes/class-cybex-smtp-ajax.php

    r3696103 r3733698  
    313313                }
    314314
     315                /**
     316                 * Extra markup for the metadata panel, after the status and error.
     317                 * Cybexsoft SMTP Pro uses it for the provider's delivery timeline.
     318                 * Returned as HTML and printed as-is: escape everything in it.
     319                 *
     320                 * @param string $html
     321                 * @param array  $row The log row.
     322                 */
     323                $html .= (string) apply_filters( 'cybex_smtp/log/email_meta_after', '', $row );
     324
    315325                if ( ! empty( $row['headers'] ) ) {
    316326                        $html .= sprintf(
  • cybexsoft-smtp/tags/1.0.7/includes/class-cybex-smtp-logger.php

    r3727515 r3733698  
    3333        public static function statuses() {
    3434                $statuses = array(
    35                         'sent'    => array(
     35                        /*
     36                         * "Sent", not "Delivered": all a send can know is that the provider
     37                         * took the message. Whether it reached the mailbox is what the
     38                         * delivery statuses below say, once a provider reports back.
     39                         */
     40                        'sent'       => array(
     41                                'label' => __( 'Sent', 'cybexsoft-smtp' ),
     42                                'class' => 'is-sent',
     43                        ),
     44                        'delivered'  => array(
    3645                                'label' => __( 'Delivered', 'cybexsoft-smtp' ),
    37                                 'class' => 'is-sent',
    38                         ),
    39                         'failed'  => array(
     46                                'class' => 'is-delivered',
     47                        ),
     48                        'deferred'   => array(
     49                                'label' => __( 'Deferred', 'cybexsoft-smtp' ),
     50                                'class' => 'is-deferred',
     51                        ),
     52                        'bounced'    => array(
     53                                'label' => __( 'Bounced', 'cybexsoft-smtp' ),
     54                                'class' => 'is-failed',
     55                        ),
     56                        'complained' => array(
     57                                'label' => __( 'Spam complaint', 'cybexsoft-smtp' ),
     58                                'class' => 'is-failed',
     59                        ),
     60                        'failed'     => array(
    4061                                'label' => __( 'Failed', 'cybexsoft-smtp' ),
    4162                                'class' => 'is-failed',
    4263                        ),
    43                         'blocked' => array(
     64                        'blocked'    => array(
    4465                                'label' => __( 'Blocked', 'cybexsoft-smtp' ),
    4566                                'class' => 'is-blocked',
    … …  
    5677
    5778        /**
     79         * Statuses of a message the provider took.
     80         *
     81         * `deferred` is still in the provider's hands and `complained` reached the
     82         * mailbox -- the recipient had to read it to complain -- so both count as
     83         * accepted. `bounced` is in neither list on its own: it was accepted, then
     84         * failed, and each count below says which side it lands on.
     85         *
     86         * @return string[]
     87         */
     88        public static function accepted_statuses() {
     89                return array( 'sent', 'delivered', 'deferred', 'complained' );
     90        }
     91
     92        /**
     93         * What a provider's report about a message may change its status to, or
     94         * null to leave it alone.
     95         *
     96         * Reports arrive out of order and more than once, so the status only ever
     97         * moves forward: a late "deferred" must not undo "delivered", and nothing
     98         * undoes a bounce or a complaint. A message the provider never took --
     99         * failed or blocked -- has nothing to report about and stays as it is.
     100         *
     101         * @param string $current  The stored status.
     102         * @param string $incoming delivered|deferred|bounced|complained.
     103         * @return string|null
     104         */
     105        public static function next_status( $current, $incoming ) {
     106                $rank = array(
     107                        'sent'       => 1,
     108                        'deferred'   => 2,
     109                        'delivered'  => 3,
     110                        'bounced'    => 4,
     111                        'complained' => 5,
     112                );
     113
     114                if ( ! isset( $rank[ $current ], $rank[ $incoming ] ) || 'sent' === $incoming ) {
     115                        return null;
     116                }
     117
     118                return $rank[ $incoming ] > $rank[ $current ] ? $incoming : null;
     119        }
     120
     121        /**
     122         * The given statuses as a quoted SQL list. Only ever called with the
     123         * literal lists above, never with anything a request supplied.
     124         *
     125         * @param string[] $statuses
     126         * @return string
     127         */
     128        private static function sql_list( array $statuses ) {
     129                return "'" . implode( "','", array_map( 'sanitize_key', $statuses ) ) . "'";
     130        }
     131
     132        /**
    58133         * Human label for a stored status. Anything unrecognised is reported as a
    59134         * failure, which is what an unknown status meant before this map existed.
    … …  
    78153         *   @type string $from
    79154         *   @type string $subject
    80          *   @type string $status  'sent'|'failed'
     155         *   @type string $status  'sent'|'failed'|'blocked'; the delivery statuses are only ever set later, by apply_delivery_status()
    81156         *   @type string $mailer
    82157         *   @type string $error
    … …  
    232307
    233308        /**
     309         * The log row a provider's report is about, or null.
     310         *
     311         * The provider id is tried first: it is what every report carries. The
     312         * token is the fallback for a report that only quotes our own tag or
     313         * Message-ID. Latest row first, should more than one carry it: a failover
     314         * can log the same message twice, and the report is about the send that
     315         * the provider took.
     316         *
     317         * @param string $provider_id
     318         * @param string $token
     319         * @return array|null { id, status }
     320         */
     321        public function find_for_event( $provider_id, $token ) {
     322                global $wpdb;
     323
     324                $provider_id = Cybex_SMTP_Send_Context::clean_provider_id( $provider_id );
     325                $token       = preg_match( '/^[a-f0-9]{32}$/', (string) $token ) ? (string) $token : '';
     326                $table       = Cybex_SMTP_DB::table_name();
     327
     328                if ( '' !== $provider_id ) {
     329                        $row = $wpdb->get_row(
     330                                $wpdb->prepare( "SELECT id, status FROM {$table} WHERE provider_id = %s ORDER BY id DESC LIMIT 1", $provider_id ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     331                                ARRAY_A
     332                        );
     333
     334                        if ( $row ) {
     335                                return $row;
     336                        }
     337                }
     338
     339                if ( '' !== $token ) {
     340                        $row = $wpdb->get_row(
     341                                $wpdb->prepare( "SELECT id, status FROM {$table} WHERE token = %s ORDER BY id DESC LIMIT 1", $token ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     342                                ARRAY_A
     343                        );
     344
     345                        if ( $row ) {
     346                                return $row;
     347                        }
     348                }
     349
     350                return null;
     351        }
     352
     353        /**
     354         * Moves a row to what a provider reported about it, if that is a step
     355         * forward -- see next_status().
     356         *
     357         * @param int    $id
     358         * @param string $current The row's stored status, as find_for_event() read it.
     359         * @param string $status  delivered|deferred|bounced|complained.
     360         * @param string $detail  The provider's reason, kept as the row's error.
     361         * @return string|null The status written, or null when nothing changed.
     362         */
     363        public function apply_delivery_status( $id, $current, $status, $detail = '' ) {
     364                global $wpdb;
     365
     366                $next = self::next_status( (string) $current, (string) $status );
     367
     368                if ( null === $next ) {
     369                        return null;
     370                }
     371
     372                $values  = array( 'status' => $next );
     373                $formats = array( '%s' );
     374
     375                // Delivery says nothing went wrong, so it keeps whatever is there.
     376                if ( 'delivered' !== $next && '' !== (string) $detail ) {
     377                        $values['error_message'] = substr( wp_strip_all_tags( (string) $detail ), 0, 1000 );
     378                        $formats[]               = '%s';
     379                }
     380
     381                $wpdb->update( Cybex_SMTP_DB::table_name(), $values, array( 'id' => (int) $id ), $formats, array( '%d' ) );
     382
     383                return $next;
     384        }
     385
     386        /**
    234387         * Every row matching the current filters, uncapped except for a hard
    235388         * safety ceiling -- used for CSV export.
    … …  
    250403
    251404                $counts = array(
    252                         'all'     => 0,
    253                         'sent'    => 0,
    254                         'failed'  => 0,
    255                         'blocked' => 0,
    256                         'pending' => 0,
     405                        'all'        => 0,
     406                        'sent'       => 0,
     407                        'delivered'  => 0,
     408                        'deferred'   => 0,
     409                        'bounced'    => 0,
     410                        'complained' => 0,
     411                        'failed'     => 0,
     412                        'blocked'    => 0,
     413                        'pending'    => 0,
    257414                );
    258415
    … …  
    334491         * memory.
    335492         *
     493         * A bounce reported later by the provider is the same kind of failure, the
     494         * recipient's, and is left out of both halves for the same reason.
     495         *
    336496         * @param int $days
    337497         * @return array[] Keyed by mailer id: accepted, refused, total, rate|null.
    … …  
    365525                $params[] = $since;
    366526
     527                $accepted = self::sql_list( self::accepted_statuses() );
     528
    367529                $rows = (array) $wpdb->get_results(
    368530                        $wpdb->prepare(
    … …  
    370532                                "SELECT
    371533                                        mailer,
    372                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) AS accepted,
     534                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) AS accepted,
    373535                                        SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS refused,
    374536                                        SUM(CASE WHEN status = 'failed' AND ( {$fault_sql} ) THEN 1 ELSE 0 END) AS recipient_faults
    … …  
    408570                $start = gmdate( 'Y-m-d H:i:s', strtotime( $end_datetime ) - ( $days * DAY_IN_SECONDS ) );
    409571
     572                $accepted = self::sql_list( self::accepted_statuses() );
     573
    410574                // Blocked messages were never handed to a mailer, so counting them would
    411575                // drag the delivery rate down for mail the site deliberately suppressed.
     576                // A bounce was accepted and then failed; the failure is what counts.
    412577                $row = $wpdb->get_row(
    413578                        $wpdb->prepare(
    414579                                "SELECT
    415580                                        COUNT(*) as total,
    416                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as sent,
    417                                         SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed
     581                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) as sent,
     582                                        SUM(CASE WHEN status IN ('failed','bounced') THEN 1 ELSE 0 END) as failed
    418583                                FROM {$table} WHERE status <> 'blocked' AND time_sent BETWEEN %s AND %s",
    419584                                $start,
    … …  
    447612                $since = gmdate( 'Y-m-d', current_time( 'timestamp' ) - ( ( $days - 1 ) * DAY_IN_SECONDS ) );
    448613
     614                $accepted = self::sql_list( self::accepted_statuses() );
     615
    449616                $results = $wpdb->get_results(
    450617                        $wpdb->prepare(
    451618                                "SELECT DATE(time_sent) as d,
    452                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as ok,
    453                                         SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as fail
     619                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) as ok,
     620                                        SUM(CASE WHEN status IN ('failed','bounced') THEN 1 ELSE 0 END) as fail
    454621                                FROM {$table}
    455622                                WHERE time_sent >= %s
    … …  
    505672
    506673        /**
    507          * Deletes only the log rows matching the given status ('sent' or
    508          * 'failed'). Returns the number of rows removed, or false on an
     674         * Deletes only the log rows matching the given status (any of
     675         * statuses()). Returns the number of rows removed, or false on an
    509676         * invalid status.
    510677         */
  • cybexsoft-smtp/tags/1.0.7/includes/class-cybex-smtp-privacy.php

    r3696103 r3733698  
    224224
    225225        /**
    226          * Erases Pro's archived messages for the address, and the open/click
    227          * event rows attached to them.
     226         * Erases Pro's archived messages for the address, the open/click event
     227         * rows attached to them, and the delivery events reported for it.
    228228         *
    229229         * @param string $like Prepared LIKE pattern.
    … …  
    250250                );
    251251
     252                // What providers reported per recipient. Checked for, because the
     253                // add-on is updated separately and an older one has no such table.
     254                if ( method_exists( 'Cybex_SMTP_Pro_DB', 'delivery_table' ) ) {
     255                        $delivery = Cybex_SMTP_Pro_DB::delivery_table();
     256
     257                        $removed += (int) $wpdb->query(
     258                                $wpdb->prepare( "DELETE FROM {$delivery} WHERE recipient LIKE %s", $like ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     259                        );
     260                }
     261
    252262                return $removed;
    253263        }
  • cybexsoft-smtp/tags/1.0.7/includes/class-cybex-smtp-send-context.php

    r3726993 r3733698  
    3434
    3535        /**
     36         * The name the token goes under in a provider's own tagging field --
     37         * SendGrid's `custom_args`, Mailgun's `v:` variables -- for the API
     38         * mailers, which do not send our Message-ID. Some providers copy these
     39         * into a header the recipient can read, so it names nothing but itself.
     40         */
     41        const PROVIDER_TAG = 'message_token';
     42
     43        /**
    3644         * Nesting depth of internal sends. A counter rather than a flag because
    3745         * these do nest: an alert about a failure can itself fail.
  • cybexsoft-smtp/tags/1.0.7/includes/mailers/class-mailer-brevo.php

    r3726993 r3733698  
    6969
    7070                $headers = $this->custom_header_map();
     71
     72                // Brevo returns this header's value as `X-Mailin-custom` on every
     73                // webhook about the message.
     74                $token = Cybex_SMTP_Send_Context::token();
     75                if ( '' !== $token ) {
     76                        $headers['X-Mailin-custom'] = $token;
     77                }
     78
    7179                if ( $headers ) {
    7280                        $payload['headers'] = $headers;
  • cybexsoft-smtp/tags/1.0.7/includes/mailers/class-mailer-mailgun.php

    r3726993 r3733698  
    8282                }
    8383
     84                // Comes back as `user-variables` on every event Mailgun reports.
     85                $token = Cybex_SMTP_Send_Context::token();
     86
     87                if ( '' !== $token ) {
     88                        $fields[ 'v:' . Cybex_SMTP_Send_Context::PROVIDER_TAG ] = $token;
     89                }
     90
    8491                $files = array();
    8592                foreach ( $this->attachments as $i => $path ) {
  • cybexsoft-smtp/tags/1.0.7/includes/mailers/class-mailer-sendgrid.php

    r3726993 r3733698  
    8888                }
    8989
     90                // Comes back on every event SendGrid reports about the message.
     91                $token = Cybex_SMTP_Send_Context::token();
     92
     93                if ( '' !== $token ) {
     94                        $payload['custom_args'] = array( Cybex_SMTP_Send_Context::PROVIDER_TAG => $token );
     95                }
     96
    9097                if ( ! empty( $this->custom_headers ) ) {
    9198                        $headers = array();
  • cybexsoft-smtp/tags/1.0.7/languages/cybexsoft-smtp.pot

    r3732590 r3733698  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Cybexsoft SMTP 1.0.6\n"
     5"Project-Id-Version: Cybexsoft SMTP 1.0.7\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/cybexsoft-smtp\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-07T12:30:54+00:00\n"
     12"POT-Creation-Date: 2026-10-08T05:04:44+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"Plural-Forms: nplurals=2; plural=(n != 1);\n"
    … …  
    5050#: admin/views/partial-lists-manage.php:259
    5151#: admin/views/partial-mailer-list.php:81
    52 #: admin/views/tab-dashboard.php:279
    53 #: admin/views/tab-dashboard.php:377
    54 #: admin/views/tab-dashboard.php:395
    55 #: admin/views/tab-dashboard.php:396
     52#: admin/views/tab-dashboard.php:286
     53#: admin/views/tab-dashboard.php:384
     54#: admin/views/tab-dashboard.php:402
     55#: admin/views/tab-dashboard.php:403
    5656#: admin/views/tab-deliver.php:354
    57 #: admin/views/tab-log.php:129
    58 #: admin/views/tab-log.php:130
     57#: admin/views/tab-log.php:134
     58#: admin/views/tab-log.php:135
    5959#: admin/views/tab-settings.php:76
    6060#: admin/views/tab-settings.php:164
    … …  
    9898
    9999#: admin/views/header.php:50
    100 #: admin/views/tab-dashboard.php:432
     100#: admin/views/tab-dashboard.php:439
    101101#: includes/class-cybex-smtp-plugins-screen.php:79
    102102msgid "Get Pro for Free"
    … …  
    207207
    208208#: admin/views/header.php:173
    209 #: pro/includes/class-cybex-smtp-pro-admin.php:169
     209#: pro/includes/class-cybex-smtp-pro-admin.php:171
    210210msgid "License activated."
    211211msgstr ""
    … …  
    303303#: admin/views/modal-email-content.php:28
    304304#: includes/class-cybex-smtp-admin.php:267
    305 #: pro/includes/class-cybex-smtp-pro-admin.php:319
     305#: pro/includes/class-cybex-smtp-pro-admin.php:321
    306306msgid "Loading…"
    307307msgstr ""
    308308
    309309#: admin/views/modal-get-pro.php:23
    310 #: admin/views/tab-dashboard.php:429
     310#: admin/views/tab-dashboard.php:436
    311311msgid "Get Cybexsoft SMTP Pro — free"
    312312msgstr ""
    … …  
    483483
    484484#: admin/views/modal-wizard.php:301
    485 #: admin/views/tab-dashboard.php:337
     485#: admin/views/tab-dashboard.php:344
    486486#: includes/class-cybex-smtp-notices.php:185
    487487msgid "Send a test email"
    … …  
    788788
    789789#: admin/views/partial-lists-manage.php:462
    790 #: admin/views/tab-log.php:112
     790#: admin/views/tab-log.php:117
    791791msgid "Clear selection"
    792792msgstr ""
    … …  
    817817
    818818#: admin/views/partial-lists-manage.php:478
    819 #: admin/views/tab-log.php:132
     819#: admin/views/tab-log.php:137
    820820msgid "Actions"
    821821msgstr ""
    … …  
    841841#. translators: %s: email subject
    842842#: admin/views/partial-lists-manage.php:514
    843 #: admin/views/tab-log.php:168
     843#: admin/views/tab-log.php:173
    844844msgid "Select %s"
    845845msgstr ""
    … …  
    871871
    872872#: admin/views/partial-lists-manage.php:580
    873 #: admin/views/tab-log.php:270
     873#: admin/views/tab-log.php:275
    874874msgid "Prev"
    875875msgstr ""
    876876
    877877#: admin/views/partial-lists-manage.php:586
    878 #: admin/views/tab-log.php:280
     878#: admin/views/tab-log.php:285
    879879msgid "Next"
    880880msgstr ""
    … …  
    933933
    934934#: admin/views/partial-lists-manage.php:664
    935 #: admin/views/tab-log.php:92
     935#: admin/views/tab-log.php:97
    936936msgid "Export CSV"
    937937msgstr ""
    … …  
    11751175#: admin/views/tab-dashboard.php:39
    11761176#: admin/views/tab-deliver.php:88
    1177 #: includes/class-cybex-smtp-ajax.php:478
     1177#: includes/class-cybex-smtp-ajax.php:488
    11781178msgid "Pass"
    11791179msgstr ""
    11801180
    11811181#: admin/views/tab-dashboard.php:40
    1182 #: includes/class-cybex-smtp-ajax.php:479
     1182#: includes/class-cybex-smtp-ajax.php:489
    11831183msgid "Monitor"
    11841184msgstr ""
    … …  
    11871187#: admin/views/tab-deliver.php:90
    11881188#: admin/views/tab-deliver.php:318
    1189 #: includes/class-cybex-smtp-ajax.php:480
     1189#: includes/class-cybex-smtp-ajax.php:490
    11901190msgid "Missing"
    11911191msgstr ""
    … …  
    11931193#: admin/views/tab-dashboard.php:42
    11941194#: admin/views/tab-deliver.php:91
    1195 #: includes/class-cybex-smtp-ajax.php:481
     1195#: includes/class-cybex-smtp-ajax.php:491
    11961196msgid "Not set up"
    11971197msgstr ""
    … …  
    12441244
    12451245#: admin/views/tab-dashboard.php:143
    1246 #: admin/views/tab-log.php:145
     1246#: admin/views/tab-log.php:150
    12471247#: admin/views/tab-tools.php:96
    12481248#: includes/class-cybex-smtp-ajax.php:261
    … …  
    13121312msgstr ""
    13131313
    1314 #. translators: 1: delivered count, 2: failed count
     1314#. translators: 1: count of messages the provider accepted, 2: failed count
    13151315#: admin/views/tab-dashboard.php:244
    1316 msgid "%1$s delivered · %2$s failed"
     1316msgid "%1$s sent · %2$s failed"
    13171317msgstr ""
    13181318
    13191319#: admin/views/tab-dashboard.php:252
    1320 msgid "Delivered · 30d"
     1320msgid "Accepted · 30d"
    13211321msgstr ""
    13221322
    … …  
    13251325msgstr ""
    13261326
    1327 #: admin/views/tab-dashboard.php:261
     1327#: admin/views/tab-dashboard.php:268
    13281328msgid "Failed · 30d"
    13291329msgstr ""
    13301330
    1331 #: admin/views/tab-dashboard.php:266
     1331#: admin/views/tab-dashboard.php:273
    13321332msgid "vs previous 30 days"
    13331333msgstr ""
    13341334
    1335 #: admin/views/tab-dashboard.php:279
    1336 #: pro/includes/class-cybex-smtp-pro-reports.php:135
     1335#: admin/views/tab-dashboard.php:286
     1336#: pro/includes/class-cybex-smtp-pro-reports.php:151
    13371337msgid "Open rate"
    13381338msgstr ""
    13391339
    1340 #: admin/views/tab-dashboard.php:281
     1340#: admin/views/tab-dashboard.php:288
    13411341msgid "Install & activate Pro"
    13421342msgstr ""
    13431343
    1344 #: admin/views/tab-dashboard.php:289
     1344#: admin/views/tab-dashboard.php:296
    13451345msgid "Email volume · last 14 days"
    13461346msgstr ""
    13471347
    1348 #: admin/views/tab-dashboard.php:291
    1349 #: admin/views/tab-dashboard.php:338
     1348#: admin/views/tab-dashboard.php:298
     1349#: admin/views/tab-dashboard.php:401
    13501350#: admin/views/tab-log.php:33
    1351 #: includes/class-cybex-smtp-logger.php:36
    1352 #: pro/admin/views/view-message.php:52
    1353 #: pro/includes/class-cybex-smtp-pro-reports.php:133
     1351#: includes/class-cybex-smtp-logger.php:41
     1352#: pro/admin/views/view-message.php:42
     1353#: pro/includes/class-cybex-smtp-pro-reports.php:134
     1354msgid "Sent"
     1355msgstr ""
     1356
     1357#: admin/views/tab-dashboard.php:299
     1358#: admin/views/tab-log.php:34
     1359#: includes/class-cybex-smtp-logger.php:61
     1360#: pro/includes/class-cybex-smtp-pro-reports.php:136
     1361msgid "Failed"
     1362msgstr ""
     1363
     1364#: admin/views/tab-dashboard.php:323
     1365msgid "Setup checklist"
     1366msgstr ""
     1367
     1368#: admin/views/tab-dashboard.php:328
     1369msgid "Connect a mailer"
     1370msgstr ""
     1371
     1372#: admin/views/tab-dashboard.php:329
     1373msgid "configured"
     1374msgstr ""
     1375
     1376#: admin/views/tab-dashboard.php:329
     1377msgid "Choose a mailer in Settings"
     1378msgstr ""
     1379
     1380#: admin/views/tab-dashboard.php:331
     1381#: admin/views/tab-dashboard.php:339
     1382#: admin/views/tab-dashboard.php:347
     1383#: admin/views/tab-dashboard.php:375
     1384msgid "Done"
     1385msgstr ""
     1386
     1387#: admin/views/tab-dashboard.php:336
     1388msgid "Verify sending domain"
     1389msgstr ""
     1390
     1391#: admin/views/tab-dashboard.php:337
     1392msgid "SPF record found"
     1393msgstr ""
     1394
     1395#: admin/views/tab-dashboard.php:337
     1396msgid "No SPF record found"
     1397msgstr ""
     1398
     1399#: admin/views/tab-dashboard.php:345
     1400#: includes/class-cybex-smtp-logger.php:45
    13541401msgid "Delivered"
    13551402msgstr ""
    13561403
    1357 #: admin/views/tab-dashboard.php:292
    1358 #: admin/views/tab-log.php:34
    1359 #: includes/class-cybex-smtp-logger.php:40
    1360 #: pro/admin/views/view-message.php:52
    1361 #: pro/includes/class-cybex-smtp-pro-reports.php:134
    1362 msgid "Failed"
    1363 msgstr ""
    1364 
    1365 #: admin/views/tab-dashboard.php:316
    1366 msgid "Setup checklist"
    1367 msgstr ""
    1368 
    1369 #: admin/views/tab-dashboard.php:321
    1370 msgid "Connect a mailer"
    1371 msgstr ""
    1372 
    1373 #: admin/views/tab-dashboard.php:322
    1374 msgid "configured"
    1375 msgstr ""
    1376 
    1377 #: admin/views/tab-dashboard.php:322
    1378 msgid "Choose a mailer in Settings"
    1379 msgstr ""
    1380 
    1381 #: admin/views/tab-dashboard.php:324
    1382 #: admin/views/tab-dashboard.php:332
    1383 #: admin/views/tab-dashboard.php:340
    1384 #: admin/views/tab-dashboard.php:368
    1385 msgid "Done"
    1386 msgstr ""
    1387 
    1388 #: admin/views/tab-dashboard.php:329
    1389 msgid "Verify sending domain"
    1390 msgstr ""
    1391 
    1392 #: admin/views/tab-dashboard.php:330
    1393 msgid "SPF record found"
    1394 msgstr ""
    1395 
    1396 #: admin/views/tab-dashboard.php:330
    1397 msgid "No SPF record found"
    1398 msgstr ""
    1399 
    1400 #: admin/views/tab-dashboard.php:338
     1404#: admin/views/tab-dashboard.php:345
    14011405msgid "Not sent yet"
    14021406msgstr ""
    14031407
    1404 #: admin/views/tab-dashboard.php:365
    1405 #: admin/views/tab-dashboard.php:374
     1408#: admin/views/tab-dashboard.php:372
     1409#: admin/views/tab-dashboard.php:381
    14061410msgid "Enable open & click tracking"
    14071411msgstr ""
    14081412
    1409 #: admin/views/tab-dashboard.php:366
     1413#: admin/views/tab-dashboard.php:373
    14101414msgid "Tracking active"
    14111415msgstr ""
    14121416
    1413 #: admin/views/tab-dashboard.php:366
     1417#: admin/views/tab-dashboard.php:373
    14141418msgid "Turn it on in Settings → Email controls"
    14151419msgstr ""
    14161420
    1417 #: admin/views/tab-dashboard.php:375
     1421#: admin/views/tab-dashboard.php:382
    14181422msgid "Install and activate Cybexsoft SMTP Pro"
    14191423msgstr ""
    14201424
    1421 #: admin/views/tab-dashboard.php:386
     1425#: admin/views/tab-dashboard.php:393
    14221426msgid "Recent emails"
    14231427msgstr ""
    14241428
    1425 #: admin/views/tab-dashboard.php:387
     1429#: admin/views/tab-dashboard.php:394
    14261430msgid "View full log →"
    14271431msgstr ""
    14281432
    1429 #: admin/views/tab-dashboard.php:391
    1430 #: admin/views/tab-log.php:125
     1433#: admin/views/tab-dashboard.php:398
     1434#: admin/views/tab-log.php:130
    14311435#: includes/class-cybex-smtp-privacy.php:101
    14321436msgid "Subject"
    14331437msgstr ""
    14341438
    1435 #: admin/views/tab-dashboard.php:392
    1436 #: admin/views/tab-log.php:126
     1439#: admin/views/tab-dashboard.php:399
     1440#: admin/views/tab-log.php:131
    14371441#: includes/class-cybex-smtp-privacy.php:105
    14381442msgid "Recipient"
    14391443msgstr ""
    14401444
    1441 #: admin/views/tab-dashboard.php:393
    1442 #: admin/views/tab-log.php:127
     1445#: admin/views/tab-dashboard.php:400
     1446#: admin/views/tab-log.php:132
    14431447#: includes/class-cybex-smtp-ajax.php:302
    14441448#: includes/class-cybex-smtp-privacy.php:113
    … …  
    14481452msgstr ""
    14491453
    1450 #: admin/views/tab-dashboard.php:394
    1451 #: pro/admin/views/view-message.php:42
    1452 #: pro/includes/class-cybex-smtp-pro-reports.php:132
    1453 msgid "Sent"
    1454 msgstr ""
    1455 
    1456 #: admin/views/tab-dashboard.php:395
    1457 #: admin/views/tab-log.php:129
     1454#: admin/views/tab-dashboard.php:402
     1455#: admin/views/tab-log.php:134
    14581456#: pro/admin/views/view-message.php:96
    14591457msgid "Opens"
    14601458msgstr ""
    14611459
    1462 #: admin/views/tab-dashboard.php:396
    1463 #: admin/views/tab-log.php:130
     1460#: admin/views/tab-dashboard.php:403
     1461#: admin/views/tab-log.php:135
    14641462#: pro/admin/views/view-message.php:102
    14651463msgid "Clicks"
    14661464msgstr ""
    14671465
    1468 #: admin/views/tab-dashboard.php:399
     1466#: admin/views/tab-dashboard.php:406
    14691467msgid "No emails sent yet."
    14701468msgstr ""
    14711469
    1472 #: admin/views/tab-dashboard.php:406
     1470#: admin/views/tab-dashboard.php:413
    14731471#: pro/admin/views/part-bounce-handling.php:146
    14741472msgid "ago"
    14751473msgstr ""
    14761474
    1477 #: admin/views/tab-dashboard.php:420
     1475#: admin/views/tab-dashboard.php:427
    14781476msgid "Cybexsoft SMTP Pro is active"
    14791477msgstr ""
    14801478
    1481 #: admin/views/tab-dashboard.php:421
     1479#: admin/views/tab-dashboard.php:428
    14821480msgid "Open & click tracking, content archiving, backup failover and weekly reports are all enabled."
    14831481msgstr ""
    14841482
    1485 #: admin/views/tab-dashboard.php:423
     1483#: admin/views/tab-dashboard.php:430
    14861484msgid "Manage Pro features →"
    14871485msgstr ""
    14881486
    1489 #: admin/views/tab-dashboard.php:430
     1487#: admin/views/tab-dashboard.php:437
    14901488msgid "Open & click tracking, content archiving, backup failover, weekly reports and four more mailers. Ask us and we will email you a copy."
    14911489msgstr ""
    14921490
    14931491#: admin/views/tab-deliver.php:45
    1494 #: includes/class-cybex-smtp-ajax.php:485
     1492#: includes/class-cybex-smtp-ajax.php:495
    14951493msgid "SPF"
    14961494msgstr ""
    … …  
    15111509
    15121510#: admin/views/tab-deliver.php:56
    1513 #: includes/class-cybex-smtp-ajax.php:486
     1511#: includes/class-cybex-smtp-ajax.php:496
    15141512msgid "DKIM"
    15151513msgstr ""
    … …  
    15281526
    15291527#: admin/views/tab-deliver.php:68
    1530 #: includes/class-cybex-smtp-ajax.php:487
     1528#: includes/class-cybex-smtp-ajax.php:497
    15311529msgid "DMARC"
    15321530msgstr ""
    … …  
    17081706msgstr ""
    17091707
    1710 #: admin/views/tab-log.php:40
    1711 #: includes/class-cybex-smtp-ajax.php:370
    1712 #: includes/class-cybex-smtp-logger.php:44
    1713 msgid "Blocked"
    1714 msgstr ""
    1715 
    1716 #: admin/views/tab-log.php:71
     1708#: admin/views/tab-log.php:76
    17171709msgid "Search by subject or recipient…"
    17181710msgstr ""
    17191711
    1720 #: admin/views/tab-log.php:109
     1712#: admin/views/tab-log.php:114
    17211713msgid "Delete selected"
    17221714msgstr ""
    17231715
    1724 #: admin/views/tab-log.php:122
     1716#: admin/views/tab-log.php:127
    17251717msgid "Select all emails on this page"
    17261718msgstr ""
    17271719
    1728 #: admin/views/tab-log.php:128
     1720#: admin/views/tab-log.php:133
    17291721#: includes/class-cybex-smtp-ajax.php:282
    17301722#: includes/class-cybex-smtp-privacy.php:97
    … …  
    17321724msgstr ""
    17331725
    1734 #: admin/views/tab-log.php:137
     1726#: admin/views/tab-log.php:142
    17351727msgid "No emails found."
    17361728msgstr ""
    17371729
    17381730#. translators: %s: the plugin, theme or "WordPress" that sent the email
    1739 #: admin/views/tab-log.php:194
     1731#: admin/views/tab-log.php:199
    17401732msgid "from %s"
    17411733msgstr ""
    17421734
    1743 #: admin/views/tab-log.php:227
     1735#: admin/views/tab-log.php:232
    17441736msgid "View email content"
    17451737msgstr ""
    17461738
    17471739#. translators: %s: email subject
    1748 #: admin/views/tab-log.php:233
     1740#: admin/views/tab-log.php:238
    17491741msgid "View content of %s"
    17501742msgstr ""
    17511743
    17521744#. translators: 1: first row on this page, 2: last row on this page, 3: total rows
    1753 #: admin/views/tab-log.php:260
     1745#: admin/views/tab-log.php:265
    17541746msgid "Showing %1$s–%2$s of %3$s emails"
    17551747msgstr ""
    17561748
    1757 #: admin/views/tab-log.php:299
     1749#: admin/views/tab-log.php:304
    17581750msgid "Open & click tracking is a Pro feature"
    17591751msgstr ""
    17601752
    1761 #: admin/views/tab-log.php:300
     1753#: admin/views/tab-log.php:305
    17621754msgid "Install and activate Cybexsoft SMTP Pro to see engagement per email and per link, plus full HTML content archiving."
    17631755msgstr ""
    … …  
    18911883
    18921884#: admin/views/tab-settings.php:313
    1893 msgid "Delete all delivered log entries?"
     1885msgid "Delete all sent log entries?"
    18941886msgstr ""
    18951887
    18961888#: admin/views/tab-settings.php:314
    1897 msgid "Delete delivered only"
     1889msgid "Delete sent only"
    18981890msgstr ""
    18991891
    … …  
    19821974
    19831975#: admin/views/tab-tools.php:73
    1984 #: includes/class-cybex-smtp-ajax.php:368
     1976#: includes/class-cybex-smtp-ajax.php:378
    19851977msgid "Connection trace"
    19861978msgstr ""
    … …  
    23502342#: includes/class-cybex-smtp-admin.php:260
    23512343#: includes/class-cybex-smtp-plugins-screen.php:211
    2352 #: pro/includes/class-cybex-smtp-pro-admin.php:318
     2344#: pro/includes/class-cybex-smtp-pro-admin.php:320
    23532345msgid "Something went wrong. Please try again."
    23542346msgstr ""
    23552347
    23562348#: includes/class-cybex-smtp-admin.php:261
    2357 msgid "delivered"
     2349msgid "sent"
    23582350msgstr ""
    23592351
    … …  
    25332525#: includes/class-cybex-smtp-ajax.php:39
    25342526#: includes/class-cybex-smtp-notices.php:536
    2535 #: pro/includes/class-cybex-smtp-pro-admin.php:547
    2536 #: pro/includes/class-cybex-smtp-pro-admin.php:559
    2537 #: pro/includes/class-cybex-smtp-pro-admin.php:595
     2527#: pro/includes/class-cybex-smtp-pro-admin.php:637
     2528#: pro/includes/class-cybex-smtp-pro-admin.php:649
     2529#: pro/includes/class-cybex-smtp-pro-admin.php:685
    25382530#: pro/includes/class-cybex-smtp-pro-ajax.php:38
    25392531#: pro/includes/class-cybex-smtp-pro-promotion.php:393
    … …  
    25602552
    25612553#: includes/class-cybex-smtp-ajax.php:68
    2562 #: includes/class-cybex-smtp-ajax.php:339
     2554#: includes/class-cybex-smtp-ajax.php:349
    25632555msgid "That is not a valid email address to test with."
    25642556msgstr ""
    … …  
    26392631msgstr ""
    26402632
    2641 #: includes/class-cybex-smtp-ajax.php:318
     2633#: includes/class-cybex-smtp-ajax.php:328
    26422634msgid "Headers"
    26432635msgstr ""
    26442636
    2645 #: includes/class-cybex-smtp-ajax.php:370
     2637#: includes/class-cybex-smtp-ajax.php:380
    26462638msgid "Reachable"
    26472639msgstr ""
    26482640
     2641#: includes/class-cybex-smtp-ajax.php:380
     2642#: includes/class-cybex-smtp-logger.php:65
     2643msgid "Blocked"
     2644msgstr ""
     2645
    26492646#. translators: %s: total milliseconds
    2650 #: includes/class-cybex-smtp-ajax.php:375
     2647#: includes/class-cybex-smtp-ajax.php:385
    26512648msgid "%s ms total"
    26522649msgstr ""
    26532650
    26542651#. translators: %s: milliseconds
    2655 #: includes/class-cybex-smtp-ajax.php:387
     2652#: includes/class-cybex-smtp-ajax.php:397
    26562653#: pro/includes/class-cybex-smtp-pro-ajax.php:155
    26572654msgid "%s ms"
    26582655msgstr ""
    26592656
    2660 #: includes/class-cybex-smtp-ajax.php:452
     2657#: includes/class-cybex-smtp-ajax.php:462
    26612658msgid "Please enter a domain to check."
    26622659msgstr ""
    26632660
    2664 #: includes/class-cybex-smtp-ajax.php:465
     2661#: includes/class-cybex-smtp-ajax.php:475
    26652662msgid "That does not look like a domain name. Enter just the domain you send from, e.g. example.com."
    26662663msgstr ""
    26672664
    2668 #: includes/class-cybex-smtp-ajax.php:474
     2665#: includes/class-cybex-smtp-ajax.php:484
    26692666msgid "This server does not support DNS lookups (dns_get_record is unavailable)."
    26702667msgstr ""
    … …  
    29752972msgstr ""
    29762973
     2974#: includes/class-cybex-smtp-logger.php:49
     2975msgid "Deferred"
     2976msgstr ""
     2977
     2978#: includes/class-cybex-smtp-logger.php:53
     2979#: pro/includes/class-cybex-smtp-pro-reports.php:147
     2980msgid "Bounced"
     2981msgstr ""
     2982
     2983#: includes/class-cybex-smtp-logger.php:57
     2984#: pro/includes/class-cybex-smtp-pro-failures.php:150
     2985msgid "Spam complaint"
     2986msgstr ""
     2987
    29772988#: includes/class-cybex-smtp-mailers.php:56
    29782989msgid "Default (PHP mail)"
    … …  
    35293540
    35303541#: pro/admin/views/part-alerts-card.php:64
     3542msgid "Also alert when the bounce rate passes (%)"
     3543msgstr ""
     3544
     3545#. translators: %d: minimum number of messages
     3546#: pro/admin/views/part-alerts-card.php:70
     3547msgid "Over the last 24 hours, from providers that report bounces back (set up under Delivery events on the mailer). Needs at least %d messages, at most one alert a day. 0 turns it off; 2–5 is a sensible line."
     3548msgstr ""
     3549
     3550#: pro/admin/views/part-alerts-card.php:78
    35313551msgid "A message that fails on your primary mailer but is rescued by the backup does not raise an alert — only final failures do. Alerts go out through your configured mailer, so if that is the thing that is broken the alert will not arrive: pair alerts with a backup mailer on a different provider."
    35323552msgstr ""
    … …  
    36803700
    36813701#: pro/admin/views/part-danger-engagement.php:28
    3682 #: pro/includes/class-cybex-smtp-pro-admin.php:320
     3702#: pro/includes/class-cybex-smtp-pro-admin.php:322
    36833703msgid "Delete all engagement data and archived content? This cannot be undone."
     3704msgstr ""
     3705
     3706#: pro/admin/views/part-delivery-events.php:25
     3707msgid "In Amazon SNS, create a topic and add an HTTPS subscription with the URL below. This site confirms the subscription by itself. Then, in SES, send Bounce, Complaint, Delivery and Delivery delay notifications for your sending identity (or a configuration set) to that topic."
     3708msgstr ""
     3709
     3710#: pro/admin/views/part-delivery-events.php:28
     3711msgid "In SendGrid, go to Settings → Mail Settings → Event Webhook, paste the URL below, tick Delivered, Deferred, Bounced, Dropped and Spam Reports, and turn on Signed Event Webhook. Copy the verification key it shows into the field here."
     3712msgstr ""
     3713
     3714#: pro/admin/views/part-delivery-events.php:29
     3715msgid "Verification key"
     3716msgstr ""
     3717
     3718#: pro/admin/views/part-delivery-events.php:32
     3719msgid "In Mailgun, go to Sending → Webhooks for your domain and add the URL below for Delivered, Permanent failure, Temporary failure and Spam complaints. Copy the HTTP webhook signing key from the same page into the field here."
     3720msgstr ""
     3721
     3722#: pro/admin/views/part-delivery-events.php:33
     3723msgid "HTTP webhook signing key"
     3724msgstr ""
     3725
     3726#: pro/admin/views/part-delivery-events.php:36
     3727msgid "In Postmark, open your server, choose the message stream, then Webhooks → Add webhook. Paste the URL below and tick Delivery, Bounce and Spam Complaint. Leave Basic auth credentials empty: the key in the URL does that job."
     3728msgstr ""
     3729
     3730#: pro/admin/views/part-delivery-events.php:39
     3731msgid "In Brevo, go to Transactional → Settings → Webhook, add a webhook with the URL below, and tick Delivered, Deferred, Soft bounce, Hard bounce, Invalid email, Blocked and Complaint."
     3732msgstr ""
     3733
     3734#: pro/admin/views/part-delivery-events.php:42
     3735msgid "In SMTP2GO, go to Settings → Webhooks, add the URL below, and tick Delivered, Bounce, Spam and Reject. Either output type works."
     3736msgstr ""
     3737
     3738#: pro/admin/views/part-delivery-events.php:45
     3739msgid "In Resend, go to Webhooks → Add endpoint, paste the URL below and choose email.delivered, email.delivery_delayed, email.bounced, email.complained and email.suppressed. Copy the endpoint’s signing secret (it starts whsec_) into the field here."
     3740msgstr ""
     3741
     3742#: pro/admin/views/part-delivery-events.php:46
     3743#: pro/admin/views/part-delivery-events.php:50
     3744msgid "Signing secret"
     3745msgstr ""
     3746
     3747#: pro/admin/views/part-delivery-events.php:49
     3748msgid "In MailerSend, go to Domains → your domain → Webhooks → Add webhook, paste the URL below and choose activity.delivered, activity.deferred, activity.soft_bounced, activity.hard_bounced and activity.spam_complaint. Copy its signing secret into the field here."
     3749msgstr ""
     3750
     3751#: pro/admin/views/part-delivery-events.php:53
     3752msgid "In Mailjet, go to Account settings → Event notifications (webhooks) and paste the URL below against Sent, Bounce, Blocked and Spam."
     3753msgstr ""
     3754
     3755#: pro/admin/views/part-delivery-events.php:56
     3756msgid "In Elastic Email, go to Settings → Notifications (Webhooks), add the URL below and tick Sent, Bounce/Error and Complaints. Elastic Email checks the URL when you save it; this site answers that check."
     3757msgstr ""
     3758
     3759#: pro/admin/views/part-delivery-events.php:59
     3760msgid "In ZeptoMail, open the Mail Agent → Webhooks → Add webhook, paste the URL below and choose Hard bounce, Soft bounce and Feedback loop. ZeptoMail does not report deliveries, so messages stay \"Sent\" unless they bounce or draw a complaint."
     3761msgstr ""
     3762
     3763#: pro/admin/views/part-delivery-events.php:73
     3764#: pro/admin/views/part-delivery-events.php:127
     3765msgid "Delivery events"
     3766msgstr ""
     3767
     3768#: pro/admin/views/part-delivery-events.php:74
     3769msgid "Lets the provider tell this site what happened after it took a message: delivered, delayed, bounced or reported as spam. The email log shows it, and addresses that hard-bounce or complain are blocked automatically."
     3770msgstr ""
     3771
     3772#: pro/admin/views/part-delivery-events.php:79
     3773msgid "Webhook URL"
     3774msgstr ""
     3775
     3776#: pro/admin/views/part-delivery-events.php:82
     3777msgid "The key at the end is what tells this site the request is genuine. Keep the URL private."
     3778msgstr ""
     3779
     3780#: pro/admin/views/part-delivery-events.php:85
     3781msgid "Make new keys when I save (every provider’s URL with a key changes and must be pasted again)"
     3782msgstr ""
     3783
     3784#. translators: %s: how long ago, e.g. "3 minutes"
     3785#: pro/admin/views/part-delivery-events.php:107
     3786msgid "Last event received %s ago."
     3787msgstr ""
     3788
     3789#: pro/admin/views/part-delivery-events.php:111
     3790msgid "Nothing received yet."
     3791msgstr ""
     3792
     3793#: pro/admin/views/part-delivery-events.php:128
     3794msgid "Not available for this mailer. Gmail and Outlook do not report deliveries, bounces or complaints to the apps that send through them; a bounce arrives as an email in the sending mailbox instead. Messages sent this way stay \"Sent\" in the log."
    36843795msgstr ""
    36853796
    … …  
    42314342msgstr ""
    42324343
    4233 #: pro/includes/class-cybex-smtp-pro-admin.php:170
     4344#: pro/includes/class-cybex-smtp-pro-admin.php:172
    42344345msgid "The license could not be activated."
    42354346msgstr ""
    42364347
    4237 #: pro/includes/class-cybex-smtp-pro-admin.php:171
     4348#: pro/includes/class-cybex-smtp-pro-admin.php:173
    42384349msgid "Message re-sent."
    42394350msgstr ""
    42404351
    4241 #: pro/includes/class-cybex-smtp-pro-admin.php:172
     4352#: pro/includes/class-cybex-smtp-pro-admin.php:174
    42424353msgid "The message could not be re-sent. Check the debug log in Tools."
    42434354msgstr ""
    42444355
    4245 #: pro/includes/class-cybex-smtp-pro-admin.php:173
     4356#: pro/includes/class-cybex-smtp-pro-admin.php:175
    42464357msgid "That message has no archived content to re-send."
    42474358msgstr ""
    42484359
    4249 #: pro/includes/class-cybex-smtp-pro-admin.php:174
     4360#: pro/includes/class-cybex-smtp-pro-admin.php:176
    42504361msgid "Engagement data and archived content deleted."
    42514362msgstr ""
    42524363
    4253 #: pro/includes/class-cybex-smtp-pro-admin.php:175
     4364#: pro/includes/class-cybex-smtp-pro-admin.php:177
    42544365msgid "Your backup mailer is now the primary. The one it replaced is standing by."
    42554366msgstr ""
    42564367
    4257 #: pro/includes/class-cybex-smtp-pro-admin.php:176
     4368#: pro/includes/class-cybex-smtp-pro-admin.php:178
    42584369msgid "The mailers were not swapped. The reasons are listed on the notice that offered it."
    42594370msgstr ""
    42604371
    4261 #: pro/includes/class-cybex-smtp-pro-admin.php:178
     4372#: pro/includes/class-cybex-smtp-pro-admin.php:180
    42624373msgid "Blocklists checked."
    42634374msgstr ""
    42644375
    4265 #: pro/includes/class-cybex-smtp-pro-admin.php:179
     4376#: pro/includes/class-cybex-smtp-pro-admin.php:181
    42664377msgid "There is no sending IP to check with your current mailer. See the card below."
    42674378msgstr ""
    42684379
    4269 #: pro/includes/class-cybex-smtp-pro-admin.php:181
     4380#: pro/includes/class-cybex-smtp-pro-admin.php:183
    42704381msgid "Weekly report sent."
    42714382msgstr ""
    42724383
    4273 #: pro/includes/class-cybex-smtp-pro-admin.php:182
     4384#: pro/includes/class-cybex-smtp-pro-admin.php:184
    42744385msgid "The weekly report could not be sent. Check the debug log below."
    42754386msgstr ""
    42764387
    4277 #: pro/includes/class-cybex-smtp-pro-admin.php:183
     4388#: pro/includes/class-cybex-smtp-pro-admin.php:185
    42784389msgid "Account connected."
    42794390msgstr ""
    42804391
    4281 #: pro/includes/class-cybex-smtp-pro-admin.php:184
     4392#: pro/includes/class-cybex-smtp-pro-admin.php:186
    42824393msgid "The account could not be connected."
    42834394msgstr ""
    42844395
    4285 #: pro/includes/class-cybex-smtp-pro-admin.php:185
     4396#: pro/includes/class-cybex-smtp-pro-admin.php:187
    42864397msgid "Account disconnected."
    42874398msgstr ""
    42884399
    4289 #: pro/includes/class-cybex-smtp-pro-admin.php:206
     4400#: pro/includes/class-cybex-smtp-pro-admin.php:208
    42904401msgid "Pro settings"
    42914402msgstr ""
    42924403
    4293 #: pro/includes/class-cybex-smtp-pro-admin.php:321
     4404#: pro/includes/class-cybex-smtp-pro-admin.php:323
    42944405msgid "This sends a real message through your backup mailer, to your From address. Continue?"
    42954406msgstr ""
    42964407
    4297 #: pro/includes/class-cybex-smtp-pro-admin.php:375
     4408#: pro/includes/class-cybex-smtp-pro-admin.php:377
    42984409msgid "The watchlist (bounce history only)"
    42994410msgstr ""
    43004411
    4301 #: pro/includes/class-cybex-smtp-pro-admin.php:512
     4412#. translators: 1: number of messages, 2: provider names
     4413#: pro/includes/class-cybex-smtp-pro-admin.php:520
     4414msgid "Delivery reports: %1$s message so far, from %2$s"
     4415msgid_plural "Delivery reports: %1$s messages so far, from %2$s"
     4416msgstr[0] ""
     4417msgstr[1] ""
     4418
     4419#. translators: 1: delivered rate, 2: bounce rate, 3: complaint rate, 4: provider names
     4420#: pro/includes/class-cybex-smtp-pro-admin.php:527
     4421msgid "%1$s%% delivered · %2$s%% bounced · %3$s%% complaints (%4$s)"
     4422msgstr ""
     4423
     4424#: pro/includes/class-cybex-smtp-pro-admin.php:558
     4425msgid "hard"
     4426msgstr ""
     4427
     4428#: pro/includes/class-cybex-smtp-pro-admin.php:558
     4429msgid "soft"
     4430msgstr ""
     4431
     4432#: pro/includes/class-cybex-smtp-pro-admin.php:573
     4433msgid "Provider reports"
     4434msgstr ""
     4435
     4436#: pro/includes/class-cybex-smtp-pro-admin.php:602
    43024437msgid "Not tracked — plain-text message, or this kind of tracking was off when it was sent."
    43034438msgstr ""
    … …  
    44324567msgstr ""
    44334568
     4569#. translators: 1: bounce rate as a percentage, 2: site name
     4570#: pro/includes/class-cybex-smtp-pro-alerts.php:109
     4571msgid "[Bounce rate %1$s%%] %2$s"
     4572msgstr ""
     4573
     4574#: pro/includes/class-cybex-smtp-pro-alerts.php:115
     4575msgid "Too much of your mail is bouncing"
     4576msgstr ""
     4577
     4578#. translators: 1: number bounced, 2: number sent, 3: bounce rate, 4: the alert threshold
     4579#: pro/includes/class-cybex-smtp-pro-alerts.php:120
     4580msgid "%1$s of %2$s messages sent in the last 24 hours bounced (%3$s%%). The alert is set at %4$s%%."
     4581msgstr ""
     4582
     4583#: pro/includes/class-cybex-smtp-pro-alerts.php:127
     4584msgid "Mailbox providers start filtering or refusing a sender whose bounce rate stays high. Usual causes: an old or bought address list, a sign-up form without confirmation, or a typo-prone checkout field."
     4585msgstr ""
     4586
     4587#: pro/includes/class-cybex-smtp-pro-alerts.php:128
     4588msgid "See the bounced messages"
     4589msgstr ""
     4590
    44344591#. translators: 1: number of failures, 2: site name
    4435 #: pro/includes/class-cybex-smtp-pro-alerts.php:107
     4592#: pro/includes/class-cybex-smtp-pro-alerts.php:199
    44364593msgid "[%1$d email failed] %2$s"
    44374594msgid_plural "[%1$d emails failed] %2$s"
    … …  
    44394596msgstr[1] ""
    44404597
    4441 #: pro/includes/class-cybex-smtp-pro-alerts.php:175
     4598#: pro/includes/class-cybex-smtp-pro-alerts.php:267
    44424599msgid "Email delivery is failing"
    44434600msgstr ""
    44444601
    44454602#. translators: 1: number of failures, 2: window in minutes
    4446 #: pro/includes/class-cybex-smtp-pro-alerts.php:181
     4603#: pro/includes/class-cybex-smtp-pro-alerts.php:273
    44474604msgid "%1$d message failed to send in the last %2$d minutes."
    44484605msgid_plural "%1$d messages failed to send in the last %2$d minutes."
    … …  
    44504607msgstr[1] ""
    44514608
    4452 #: pro/includes/class-cybex-smtp-pro-alerts.php:187
     4609#: pro/includes/class-cybex-smtp-pro-alerts.php:279
    44534610msgid "Latest error"
    44544611msgstr ""
    44554612
    4456 #: pro/includes/class-cybex-smtp-pro-alerts.php:191
     4613#: pro/includes/class-cybex-smtp-pro-alerts.php:283
    44574614msgid "Recent failures"
    44584615msgstr ""
    44594616
    4460 #: pro/includes/class-cybex-smtp-pro-alerts.php:195
     4617#: pro/includes/class-cybex-smtp-pro-alerts.php:287
    44614618msgid "Open the email log"
    44624619msgstr ""
    … …  
    44644621#: pro/includes/class-cybex-smtp-pro-cron.php:63
    44654622msgid "Every six hours (Cybexsoft SMTP blocklist check)"
     4623msgstr ""
     4624
     4625#. translators: %s: mailer name, e.g. sendgrid
     4626#: pro/includes/class-cybex-smtp-pro-events.php:744
     4627msgid "Delivery event refused (%s)"
    44664628msgstr ""
    44674629
    … …  
    45784740msgstr ""
    45794741
     4742#: pro/includes/class-cybex-smtp-pro-failures.php:123
     4743msgid "Hard bounce reported by the provider"
     4744msgstr ""
     4745
     4746#: pro/includes/class-cybex-smtp-pro-failures.php:147
     4747msgid "spam complaint"
     4748msgstr ""
     4749
     4750#: pro/includes/class-cybex-smtp-pro-failures.php:149
     4751msgid "Blocked automatically after a spam complaint."
     4752msgstr ""
     4753
    45804754#. translators: 1: number of failures, 2: the last error reported
    4581 #: pro/includes/class-cybex-smtp-pro-failures.php:169
     4755#: pro/includes/class-cybex-smtp-pro-failures.php:249
    45824756msgid "Blocked automatically after %1$d failed deliveries. Last error: %2$s"
    45834757msgstr ""
    45844758
    45854759#. translators: %d: number of failed deliveries
    4586 #: pro/includes/class-cybex-smtp-pro-failures.php:182
     4760#: pro/includes/class-cybex-smtp-pro-failures.php:262
    45874761msgid "Auto-blocked after %d bounces"
    45884762msgstr ""
    … …  
    46244798msgstr ""
    46254799
    4626 #: pro/includes/class-cybex-smtp-pro-modules.php:333
     4800#: pro/includes/class-cybex-smtp-pro-modules.php:343
    46274801msgid "Postmark gives you the DKIM record under Sender Signatures once you add the domain."
    46284802msgstr ""
    46294803
    4630 #: pro/includes/class-cybex-smtp-pro-modules.php:337
     4804#: pro/includes/class-cybex-smtp-pro-modules.php:347
    46314805msgid "Resend shows the DKIM and SPF records to publish when you add the domain under Domains."
    46324806msgstr ""
    46334807
    4634 #: pro/includes/class-cybex-smtp-pro-modules.php:341
     4808#: pro/includes/class-cybex-smtp-pro-modules.php:351
    46354809msgid "MailerSend lists the DKIM record on the domain's page under Domains once it is added."
    46364810msgstr ""
    46374811
    4638 #: pro/includes/class-cybex-smtp-pro-modules.php:345
     4812#: pro/includes/class-cybex-smtp-pro-modules.php:355
    46394813msgid "Mailjet publishes the DKIM record under Account settings → Sender domains & addresses."
    46404814msgstr ""
    46414815
    4642 #: pro/includes/class-cybex-smtp-pro-modules.php:349
     4816#: pro/includes/class-cybex-smtp-pro-modules.php:359
    46434817msgid "Elastic Email gives you the DKIM record under Settings → Domains after you add the domain."
    46444818msgstr ""
    46454819
    4646 #: pro/includes/class-cybex-smtp-pro-modules.php:353
     4820#: pro/includes/class-cybex-smtp-pro-modules.php:363
    46474821msgid "ZeptoMail issues the DKIM selector under Domains when you verify the domain. The record differs by data centre."
    46484822msgstr ""
    46494823
    4650 #: pro/includes/class-cybex-smtp-pro-modules.php:357
     4824#: pro/includes/class-cybex-smtp-pro-modules.php:367
    46514825msgid "Google Workspace generates the DKIM key under Apps → Google Workspace → Gmail → Authenticate email."
    46524826msgstr ""
    46534827
    4654 #: pro/includes/class-cybex-smtp-pro-modules.php:361
     4828#: pro/includes/class-cybex-smtp-pro-modules.php:371
    46554829msgid "Microsoft 365 publishes two DKIM CNAMEs; enable them in the Defender portal under Email authentication settings."
    46564830msgstr ""
    46574831
    4658 #: pro/includes/class-cybex-smtp-pro-modules.php:373
     4832#: pro/includes/class-cybex-smtp-pro-modules.php:383
    46594833msgid "Outlook / Microsoft 365"
    46604834msgstr ""
    … …  
    48625036msgstr ""
    48635037
    4864 #: pro/includes/class-cybex-smtp-pro-reports.php:128
     5038#: pro/includes/class-cybex-smtp-pro-reports.php:130
    48655039msgid "not tracked"
    48665040msgstr ""
    48675041
    4868 #: pro/includes/class-cybex-smtp-pro-reports.php:136
     5042#: pro/includes/class-cybex-smtp-pro-reports.php:135
     5043msgid "Accepted by your provider"
     5044msgstr ""
     5045
     5046#: pro/includes/class-cybex-smtp-pro-reports.php:146
     5047msgid "Delivered (confirmed by the provider)"
     5048msgstr ""
     5049
     5050#: pro/includes/class-cybex-smtp-pro-reports.php:148
     5051msgid "Spam complaints"
     5052msgstr ""
     5053
     5054#: pro/includes/class-cybex-smtp-pro-reports.php:152
    48695055msgid "Click rate"
    48705056msgstr ""
    48715057
    4872 #: pro/includes/class-cybex-smtp-pro-reports.php:140
     5058#: pro/includes/class-cybex-smtp-pro-reports.php:155
    48735059msgid "Your week in email"
    48745060msgstr ""
    48755061
    48765062#. translators: 1: site name, 2: start date, 3: end date
    4877 #: pro/includes/class-cybex-smtp-pro-reports.php:144
     5063#: pro/includes/class-cybex-smtp-pro-reports.php:159
    48785064msgid "%1$s · %2$s to %3$s"
    48795065msgstr ""
    48805066
    4881 #: pro/includes/class-cybex-smtp-pro-reports.php:162
     5067#: pro/includes/class-cybex-smtp-pro-reports.php:177
    48825068msgid "Most clicked links"
    48835069msgstr ""
    48845070
    48855071#. translators: %s: number of clicks
    4886 #: pro/includes/class-cybex-smtp-pro-reports.php:171
     5072#: pro/includes/class-cybex-smtp-pro-reports.php:186
    48875073msgid "%s click"
    48885074msgid_plural "%s clicks"
    … …  
    48905076msgstr[1] ""
    48915077
    4892 #: pro/includes/class-cybex-smtp-pro-reports.php:181
     5078#: pro/includes/class-cybex-smtp-pro-reports.php:196
    48935079msgid "Most common errors"
    48945080msgstr ""
    48955081
    4896 #: pro/includes/class-cybex-smtp-pro-reports.php:194
     5082#: pro/includes/class-cybex-smtp-pro-reports.php:209
    48975083msgid "Addresses blocked automatically"
    48985084msgstr ""
    48995085
    4900 #: pro/includes/class-cybex-smtp-pro-reports.php:195
     5086#: pro/includes/class-cybex-smtp-pro-reports.php:210
    49015087msgid "These kept bouncing, so this site has stopped emailing them. Remove any that should not be there under Cybexsoft SMTP → Pro → Recipients."
    49025088msgstr ""
    49035089
    4904 #: pro/includes/class-cybex-smtp-pro-reports.php:207
     5090#: pro/includes/class-cybex-smtp-pro-reports.php:222
    49055091msgid "Open the dashboard"
    49065092msgstr ""
    49075093
    4908 #: pro/includes/class-cybex-smtp-pro-reports.php:208
     5094#: pro/includes/class-cybex-smtp-pro-reports.php:223
    49095095msgid "Sent by Cybexsoft SMTP Pro. Change the schedule or turn this off under Cybexsoft SMTP → Pro."
    49105096msgstr ""
  • cybexsoft-smtp/tags/1.0.7/readme.txt

    r3732590 r3733698  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 1.0.6
     7Stable tag: 1.0.7
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    200200== Changelog ==
    201201
     202= 1.0.7 =
     203* New: the email log has delivery statuses — Delivered, Deferred, Bounced and Spam complaint — for messages your provider reports on after accepting them. Reports are received by Cybexsoft SMTP Pro's delivery events, from Amazon SES, SendGrid, Mailgun, Brevo, SMTP2GO, Postmark, Resend, MailerSend, Mailjet, Elastic Email and ZeptoMail; the log filters for these statuses appear once there is mail to show.
     204* Change: a message your provider accepted is now labelled "Sent" instead of "Delivered". Acceptance is all a send can confirm; "Delivered" is kept for mail the provider says reached the mailbox. The dashboard's 30-day rate card now reads "Accepted".
     205* Change: messages sent through SendGrid, Mailgun and Brevo carry their log token in the provider's own tag field, so the provider's reports can be matched to the right log entry.
     206* Developers: two new hooks, `cybex_smtp/dashboard/accepted_stat_after` and the `cybex_smtp/log/email_meta_after` filter, for add-ons to show delivery information on the dashboard and in the message viewer.
     207
    202208= 1.0.6 =
    203209* New: a "Rate ★★★★★" link under the plugin's description on the Plugins screen, and one line at the foot of the plugin's own pages linking to the WordPress.org review form. No pop-ups or admin notices.
    … …  
    240246== Upgrade Notice ==
    241247
     248= 1.0.7 =
     249Mail your provider accepted is now labelled "Sent"; "Delivered", "Bounced" and "Spam complaint" appear when your provider reports back.
     250
    242251= 1.0.6 =
    243252Adds a link to rate the plugin on WordPress.org. No other changes.
  • cybexsoft-smtp/trunk/admin/css/admin.css

    r3732590 r3733698  
    818818        background: var(--cybex-red-bg-2);
    819819}
     820/* Confirmed by the provider: the one status that is more than "it was taken". */
     821.cybex-status-pill.is-delivered {
     822        color: var(--cybex-green-dark);
     823        background: var(--cybex-green-bg);
     824        box-shadow: inset 0 0 0 1px var(--cybex-green-line);
     825}
     826/* Still the provider's to deliver: not good yet, not a failure either. */
     827.cybex-status-pill.is-deferred {
     828        color: var(--cybex-amber);
     829        background: var(--cybex-amber-bg);
     830}
    820831/* Deliberately not red: nothing went wrong, the site chose not to send. */
    821832.cybex-status-pill.is-blocked {
    … …  
    42024213        height: 17px;
    42034214}
     4215
     4216/* Pro: the provider's reports about one message, in the log viewer. */
     4217.cybex-delivery-timeline ol {
     4218        margin: 0;
     4219        padding: 0;
     4220        list-style: none;
     4221}
     4222.cybex-delivery-timeline li {
     4223        padding: 4px 0;
     4224}
     4225.cybex-delivery-timeline li + li {
     4226        border-top: 1px solid var(--cybex-neutral-bg);
     4227}
     4228.cybex-timeline-time,
     4229.cybex-timeline-detail {
     4230        color: var(--cybex-muted-2);
     4231        font-size: var(--cybex-fs-sm);
     4232}
     4233.cybex-timeline-detail {
     4234        margin-top: 2px;
     4235        word-break: break-word;
     4236}
     4237.cybex-delivery-rates {
     4238        margin-top: 4px;
     4239}
  • cybexsoft-smtp/trunk/admin/views/tab-dashboard.php

    r3727515 r3733698  
    241241                        <?php
    242242                        printf(
    243                                 /* translators: 1: delivered count, 2: failed count */
    244                                 esc_html__( '%1$s delivered · %2$s failed', 'cybexsoft-smtp' ),
     243                                /* translators: 1: count of messages the provider accepted, 2: failed count */
     244                                esc_html__( '%1$s sent · %2$s failed', 'cybexsoft-smtp' ),
    245245                                esc_html( number_format_i18n( $summary['sent'] ) ),
    246246                                esc_html( number_format_i18n( $summary['failed'] ) )
    … …  
    250250        </div>
    251251        <div class="cybex-card cybex-stat">
    252                 <div class="cybex-stat-top"><span><?php esc_html_e( 'Delivered · 30d', 'cybexsoft-smtp' ); ?></span></div>
     252                <div class="cybex-stat-top"><span><?php esc_html_e( 'Accepted · 30d', 'cybexsoft-smtp' ); ?></span></div>
    253253                <div class="cybex-stat-value"><?php echo $summary['total'] ? esc_html( number_format_i18n( $summary['delivered_pct'], 1 ) . '%' ) : '—'; ?></div>
    254254                <?php if ( ! $summary['has_prior'] ) : ?>
    … …  
    257257                        <div class="cybex-stat-delta <?php echo $summary['delivered_delta'] >= 0 ? 'is-good' : 'is-bad'; ?>"><?php echo esc_html( $delta_arrow( $summary['delivered_delta'] ) . ' ' . __( 'pts vs previous 30 days', 'cybexsoft-smtp' ) ); ?></div>
    258258                <?php endif; ?>
     259                <?php
     260                /**
     261                 * Below the acceptance rate: room for what happened after acceptance,
     262                 * which an add-on receiving the provider's reports can say.
     263                 */
     264                do_action( 'cybex_smtp/dashboard/accepted_stat_after' );
     265                ?>
    259266        </div>
    260267        <div class="cybex-card cybex-stat">
    … …  
    289296                        <div class="cybex-card-title"><?php esc_html_e( 'Email volume · last 14 days', 'cybexsoft-smtp' ); ?></div>
    290297                        <div class="cybex-chart-legend">
    291                                 <span><span class="cybex-swatch is-ok"></span><?php esc_html_e( 'Delivered', 'cybexsoft-smtp' ); ?></span>
     298                                <span><span class="cybex-swatch is-ok"></span><?php esc_html_e( 'Sent', 'cybexsoft-smtp' ); ?></span>
    292299                                <span><span class="cybex-swatch is-fail"></span><?php esc_html_e( 'Failed', 'cybexsoft-smtp' ); ?></span>
    293300                        </div>
    … …  
    299306                                        data-ok="<?php echo esc_attr( $d['ok'] ); ?>"
    300307                                        data-fail="<?php echo esc_attr( $d['fail'] ); ?>"
    301                                         aria-label="<?php echo esc_attr( $d['date'] . ': ' . $d['ok'] . ' delivered, ' . $d['fail'] . ' failed' ); ?>">
     308                                        aria-label="<?php echo esc_attr( $d['date'] . ': ' . $d['ok'] . ' sent, ' . $d['fail'] . ' failed' ); ?>">
    302309                                        <div class="cybex-bar-fail" style="height:<?php echo esc_attr( round( $d['fail'] * $scale ) ); ?>px"></div>
    303310                                        <div class="cybex-bar-ok" style="height:<?php echo esc_attr( max( 1, round( $d['ok'] * $scale ) ) ); ?>px"></div>
  • cybexsoft-smtp/trunk/admin/views/tab-log.php

    r3726993 r3733698  
    3131$filters = array(
    3232        'all'    => __( 'All', 'cybexsoft-smtp' ),
    33         'sent'   => __( 'Delivered', 'cybexsoft-smtp' ),
     33        'sent'   => __( 'Sent', 'cybexsoft-smtp' ),
    3434        'failed' => __( 'Failed', 'cybexsoft-smtp' ),
    3535);
    3636
    37 // Nothing writes this status until an add-on suppresses a message, so the
    38 // filter only appears on sites where there is something behind it.
    39 if ( $counts['blocked'] > 0 ) {
    40         $filters['blocked'] = __( 'Blocked', 'cybexsoft-smtp' );
     37/*
     38 * The rest only appear on sites with something behind them: the delivery
     39 * statuses need a provider reporting back, and blocked needs the block list.
     40 * Labels come from the logger, so a filter reads the same as the pills.
     41 */
     42foreach ( array( 'delivered', 'deferred', 'bounced', 'complained', 'blocked' ) as $optional_status ) {
     43        if ( ! empty( $counts[ $optional_status ] ) ) {
     44                $filters[ $optional_status ] = Cybex_SMTP_Logger::status_label( $optional_status );
     45        }
    4146}
    4247
  • cybexsoft-smtp/trunk/admin/views/tab-settings.php

    r3696103 r3733698  
    311311                                <?php esc_html_e( 'Delete failed only', 'cybexsoft-smtp' ); ?>
    312312                        </button>
    313                         <button type="submit" name="scope" value="sent" class="button" onclick="return confirm('<?php echo esc_js( __( 'Delete all delivered log entries?', 'cybexsoft-smtp' ) ); ?>');">
    314                                 <?php esc_html_e( 'Delete delivered only', 'cybexsoft-smtp' ); ?>
     313                        <button type="submit" name="scope" value="sent" class="button" onclick="return confirm('<?php echo esc_js( __( 'Delete all sent log entries?', 'cybexsoft-smtp' ) ); ?>');">
     314                                <?php esc_html_e( 'Delete sent only', 'cybexsoft-smtp' ); ?>
    315315                        </button>
    316316                </form>
  • cybexsoft-smtp/trunk/cybexsoft-smtp.php

    r3732590 r3733698  
    44 * Plugin URI:        https://cybexsoft.com/products/wordpress/plugins/cybexsoft-smtp
    55 * Description:       Reliable transactional email for WordPress. Connect a real mailer, log every message, retry what fails, and diagnose deliverability issues.
    6  * Version:           1.0.6
     6 * Version:           1.0.7
    77 * Requires at least: 5.5
    88 * Requires PHP:      7.4
    … …  
    1919}
    2020
    21 define( 'CYBEX_SMTP_VERSION', '1.0.6' );
     21define( 'CYBEX_SMTP_VERSION', '1.0.7' );
    2222/*
    2323 * The shipped schema, versioned separately from the plugin: a release that
  • cybexsoft-smtp/trunk/includes/class-cybex-smtp-admin.php

    r3732590 r3733698  
    259259                                'invalidDomain'    => __( 'That does not look like a domain name. Enter just the domain, e.g. example.com.', 'cybexsoft-smtp' ),
    260260                                'genericError'     => __( 'Something went wrong. Please try again.', 'cybexsoft-smtp' ),
    261                                 'delivered'        => __( 'delivered', 'cybexsoft-smtp' ),
     261                                'delivered'        => __( 'sent', 'cybexsoft-smtp' ),
    262262                                'failed'           => __( 'failed', 'cybexsoft-smtp' ),
    263263                                'sendingRequest'   => __( 'Sending request…', 'cybexsoft-smtp' ),
  • cybexsoft-smtp/trunk/includes/class-cybex-smtp-ajax.php

    r3696103 r3733698  
    313313                }
    314314
     315                /**
     316                 * Extra markup for the metadata panel, after the status and error.
     317                 * Cybexsoft SMTP Pro uses it for the provider's delivery timeline.
     318                 * Returned as HTML and printed as-is: escape everything in it.
     319                 *
     320                 * @param string $html
     321                 * @param array  $row The log row.
     322                 */
     323                $html .= (string) apply_filters( 'cybex_smtp/log/email_meta_after', '', $row );
     324
    315325                if ( ! empty( $row['headers'] ) ) {
    316326                        $html .= sprintf(
  • cybexsoft-smtp/trunk/includes/class-cybex-smtp-logger.php

    r3727515 r3733698  
    3333        public static function statuses() {
    3434                $statuses = array(
    35                         'sent'    => array(
     35                        /*
     36                         * "Sent", not "Delivered": all a send can know is that the provider
     37                         * took the message. Whether it reached the mailbox is what the
     38                         * delivery statuses below say, once a provider reports back.
     39                         */
     40                        'sent'       => array(
     41                                'label' => __( 'Sent', 'cybexsoft-smtp' ),
     42                                'class' => 'is-sent',
     43                        ),
     44                        'delivered'  => array(
    3645                                'label' => __( 'Delivered', 'cybexsoft-smtp' ),
    37                                 'class' => 'is-sent',
    38                         ),
    39                         'failed'  => array(
     46                                'class' => 'is-delivered',
     47                        ),
     48                        'deferred'   => array(
     49                                'label' => __( 'Deferred', 'cybexsoft-smtp' ),
     50                                'class' => 'is-deferred',
     51                        ),
     52                        'bounced'    => array(
     53                                'label' => __( 'Bounced', 'cybexsoft-smtp' ),
     54                                'class' => 'is-failed',
     55                        ),
     56                        'complained' => array(
     57                                'label' => __( 'Spam complaint', 'cybexsoft-smtp' ),
     58                                'class' => 'is-failed',
     59                        ),
     60                        'failed'     => array(
    4061                                'label' => __( 'Failed', 'cybexsoft-smtp' ),
    4162                                'class' => 'is-failed',
    4263                        ),
    43                         'blocked' => array(
     64                        'blocked'    => array(
    4465                                'label' => __( 'Blocked', 'cybexsoft-smtp' ),
    4566                                'class' => 'is-blocked',
    … …  
    5677
    5778        /**
     79         * Statuses of a message the provider took.
     80         *
     81         * `deferred` is still in the provider's hands and `complained` reached the
     82         * mailbox -- the recipient had to read it to complain -- so both count as
     83         * accepted. `bounced` is in neither list on its own: it was accepted, then
     84         * failed, and each count below says which side it lands on.
     85         *
     86         * @return string[]
     87         */
     88        public static function accepted_statuses() {
     89                return array( 'sent', 'delivered', 'deferred', 'complained' );
     90        }
     91
     92        /**
     93         * What a provider's report about a message may change its status to, or
     94         * null to leave it alone.
     95         *
     96         * Reports arrive out of order and more than once, so the status only ever
     97         * moves forward: a late "deferred" must not undo "delivered", and nothing
     98         * undoes a bounce or a complaint. A message the provider never took --
     99         * failed or blocked -- has nothing to report about and stays as it is.
     100         *
     101         * @param string $current  The stored status.
     102         * @param string $incoming delivered|deferred|bounced|complained.
     103         * @return string|null
     104         */
     105        public static function next_status( $current, $incoming ) {
     106                $rank = array(
     107                        'sent'       => 1,
     108                        'deferred'   => 2,
     109                        'delivered'  => 3,
     110                        'bounced'    => 4,
     111                        'complained' => 5,
     112                );
     113
     114                if ( ! isset( $rank[ $current ], $rank[ $incoming ] ) || 'sent' === $incoming ) {
     115                        return null;
     116                }
     117
     118                return $rank[ $incoming ] > $rank[ $current ] ? $incoming : null;
     119        }
     120
     121        /**
     122         * The given statuses as a quoted SQL list. Only ever called with the
     123         * literal lists above, never with anything a request supplied.
     124         *
     125         * @param string[] $statuses
     126         * @return string
     127         */
     128        private static function sql_list( array $statuses ) {
     129                return "'" . implode( "','", array_map( 'sanitize_key', $statuses ) ) . "'";
     130        }
     131
     132        /**
    58133         * Human label for a stored status. Anything unrecognised is reported as a
    59134         * failure, which is what an unknown status meant before this map existed.
    … …  
    78153         *   @type string $from
    79154         *   @type string $subject
    80          *   @type string $status  'sent'|'failed'
     155         *   @type string $status  'sent'|'failed'|'blocked'; the delivery statuses are only ever set later, by apply_delivery_status()
    81156         *   @type string $mailer
    82157         *   @type string $error
    … …  
    232307
    233308        /**
     309         * The log row a provider's report is about, or null.
     310         *
     311         * The provider id is tried first: it is what every report carries. The
     312         * token is the fallback for a report that only quotes our own tag or
     313         * Message-ID. Latest row first, should more than one carry it: a failover
     314         * can log the same message twice, and the report is about the send that
     315         * the provider took.
     316         *
     317         * @param string $provider_id
     318         * @param string $token
     319         * @return array|null { id, status }
     320         */
     321        public function find_for_event( $provider_id, $token ) {
     322                global $wpdb;
     323
     324                $provider_id = Cybex_SMTP_Send_Context::clean_provider_id( $provider_id );
     325                $token       = preg_match( '/^[a-f0-9]{32}$/', (string) $token ) ? (string) $token : '';
     326                $table       = Cybex_SMTP_DB::table_name();
     327
     328                if ( '' !== $provider_id ) {
     329                        $row = $wpdb->get_row(
     330                                $wpdb->prepare( "SELECT id, status FROM {$table} WHERE provider_id = %s ORDER BY id DESC LIMIT 1", $provider_id ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     331                                ARRAY_A
     332                        );
     333
     334                        if ( $row ) {
     335                                return $row;
     336                        }
     337                }
     338
     339                if ( '' !== $token ) {
     340                        $row = $wpdb->get_row(
     341                                $wpdb->prepare( "SELECT id, status FROM {$table} WHERE token = %s ORDER BY id DESC LIMIT 1", $token ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     342                                ARRAY_A
     343                        );
     344
     345                        if ( $row ) {
     346                                return $row;
     347                        }
     348                }
     349
     350                return null;
     351        }
     352
     353        /**
     354         * Moves a row to what a provider reported about it, if that is a step
     355         * forward -- see next_status().
     356         *
     357         * @param int    $id
     358         * @param string $current The row's stored status, as find_for_event() read it.
     359         * @param string $status  delivered|deferred|bounced|complained.
     360         * @param string $detail  The provider's reason, kept as the row's error.
     361         * @return string|null The status written, or null when nothing changed.
     362         */
     363        public function apply_delivery_status( $id, $current, $status, $detail = '' ) {
     364                global $wpdb;
     365
     366                $next = self::next_status( (string) $current, (string) $status );
     367
     368                if ( null === $next ) {
     369                        return null;
     370                }
     371
     372                $values  = array( 'status' => $next );
     373                $formats = array( '%s' );
     374
     375                // Delivery says nothing went wrong, so it keeps whatever is there.
     376                if ( 'delivered' !== $next && '' !== (string) $detail ) {
     377                        $values['error_message'] = substr( wp_strip_all_tags( (string) $detail ), 0, 1000 );
     378                        $formats[]               = '%s';
     379                }
     380
     381                $wpdb->update( Cybex_SMTP_DB::table_name(), $values, array( 'id' => (int) $id ), $formats, array( '%d' ) );
     382
     383                return $next;
     384        }
     385
     386        /**
    234387         * Every row matching the current filters, uncapped except for a hard
    235388         * safety ceiling -- used for CSV export.
    … …  
    250403
    251404                $counts = array(
    252                         'all'     => 0,
    253                         'sent'    => 0,
    254                         'failed'  => 0,
    255                         'blocked' => 0,
    256                         'pending' => 0,
     405                        'all'        => 0,
     406                        'sent'       => 0,
     407                        'delivered'  => 0,
     408                        'deferred'   => 0,
     409                        'bounced'    => 0,
     410                        'complained' => 0,
     411                        'failed'     => 0,
     412                        'blocked'    => 0,
     413                        'pending'    => 0,
    257414                );
    258415
    … …  
    334491         * memory.
    335492         *
     493         * A bounce reported later by the provider is the same kind of failure, the
     494         * recipient's, and is left out of both halves for the same reason.
     495         *
    336496         * @param int $days
    337497         * @return array[] Keyed by mailer id: accepted, refused, total, rate|null.
    … …  
    365525                $params[] = $since;
    366526
     527                $accepted = self::sql_list( self::accepted_statuses() );
     528
    367529                $rows = (array) $wpdb->get_results(
    368530                        $wpdb->prepare(
    … …  
    370532                                "SELECT
    371533                                        mailer,
    372                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) AS accepted,
     534                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) AS accepted,
    373535                                        SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS refused,
    374536                                        SUM(CASE WHEN status = 'failed' AND ( {$fault_sql} ) THEN 1 ELSE 0 END) AS recipient_faults
    … …  
    408570                $start = gmdate( 'Y-m-d H:i:s', strtotime( $end_datetime ) - ( $days * DAY_IN_SECONDS ) );
    409571
     572                $accepted = self::sql_list( self::accepted_statuses() );
     573
    410574                // Blocked messages were never handed to a mailer, so counting them would
    411575                // drag the delivery rate down for mail the site deliberately suppressed.
     576                // A bounce was accepted and then failed; the failure is what counts.
    412577                $row = $wpdb->get_row(
    413578                        $wpdb->prepare(
    414579                                "SELECT
    415580                                        COUNT(*) as total,
    416                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as sent,
    417                                         SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed
     581                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) as sent,
     582                                        SUM(CASE WHEN status IN ('failed','bounced') THEN 1 ELSE 0 END) as failed
    418583                                FROM {$table} WHERE status <> 'blocked' AND time_sent BETWEEN %s AND %s",
    419584                                $start,
    … …  
    447612                $since = gmdate( 'Y-m-d', current_time( 'timestamp' ) - ( ( $days - 1 ) * DAY_IN_SECONDS ) );
    448613
     614                $accepted = self::sql_list( self::accepted_statuses() );
     615
    449616                $results = $wpdb->get_results(
    450617                        $wpdb->prepare(
    451618                                "SELECT DATE(time_sent) as d,
    452                                         SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) as ok,
    453                                         SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as fail
     619                                        SUM(CASE WHEN status IN ({$accepted}) THEN 1 ELSE 0 END) as ok,
     620                                        SUM(CASE WHEN status IN ('failed','bounced') THEN 1 ELSE 0 END) as fail
    454621                                FROM {$table}
    455622                                WHERE time_sent >= %s
    … …  
    505672
    506673        /**
    507          * Deletes only the log rows matching the given status ('sent' or
    508          * 'failed'). Returns the number of rows removed, or false on an
     674         * Deletes only the log rows matching the given status (any of
     675         * statuses()). Returns the number of rows removed, or false on an
    509676         * invalid status.
    510677         */
  • cybexsoft-smtp/trunk/includes/class-cybex-smtp-privacy.php

    r3696103 r3733698  
    224224
    225225        /**
    226          * Erases Pro's archived messages for the address, and the open/click
    227          * event rows attached to them.
     226         * Erases Pro's archived messages for the address, the open/click event
     227         * rows attached to them, and the delivery events reported for it.
    228228         *
    229229         * @param string $like Prepared LIKE pattern.
    … …  
    250250                );
    251251
     252                // What providers reported per recipient. Checked for, because the
     253                // add-on is updated separately and an older one has no such table.
     254                if ( method_exists( 'Cybex_SMTP_Pro_DB', 'delivery_table' ) ) {
     255                        $delivery = Cybex_SMTP_Pro_DB::delivery_table();
     256
     257                        $removed += (int) $wpdb->query(
     258                                $wpdb->prepare( "DELETE FROM {$delivery} WHERE recipient LIKE %s", $like ) // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
     259                        );
     260                }
     261
    252262                return $removed;
    253263        }
  • cybexsoft-smtp/trunk/includes/class-cybex-smtp-send-context.php

    r3726993 r3733698  
    3434
    3535        /**
     36         * The name the token goes under in a provider's own tagging field --
     37         * SendGrid's `custom_args`, Mailgun's `v:` variables -- for the API
     38         * mailers, which do not send our Message-ID. Some providers copy these
     39         * into a header the recipient can read, so it names nothing but itself.
     40         */
     41        const PROVIDER_TAG = 'message_token';
     42
     43        /**
    3644         * Nesting depth of internal sends. A counter rather than a flag because
    3745         * these do nest: an alert about a failure can itself fail.
  • cybexsoft-smtp/trunk/includes/mailers/class-mailer-brevo.php

    r3726993 r3733698  
    6969
    7070                $headers = $this->custom_header_map();
     71
     72                // Brevo returns this header's value as `X-Mailin-custom` on every
     73                // webhook about the message.
     74                $token = Cybex_SMTP_Send_Context::token();
     75                if ( '' !== $token ) {
     76                        $headers['X-Mailin-custom'] = $token;
     77                }
     78
    7179                if ( $headers ) {
    7280                        $payload['headers'] = $headers;
  • cybexsoft-smtp/trunk/includes/mailers/class-mailer-mailgun.php

    r3726993 r3733698  
    8282                }
    8383
     84                // Comes back as `user-variables` on every event Mailgun reports.
     85                $token = Cybex_SMTP_Send_Context::token();
     86
     87                if ( '' !== $token ) {
     88                        $fields[ 'v:' . Cybex_SMTP_Send_Context::PROVIDER_TAG ] = $token;
     89                }
     90
    8491                $files = array();
    8592                foreach ( $this->attachments as $i => $path ) {
  • cybexsoft-smtp/trunk/includes/mailers/class-mailer-sendgrid.php

    r3726993 r3733698  
    8888                }
    8989
     90                // Comes back on every event SendGrid reports about the message.
     91                $token = Cybex_SMTP_Send_Context::token();
     92
     93                if ( '' !== $token ) {
     94                        $payload['custom_args'] = array( Cybex_SMTP_Send_Context::PROVIDER_TAG => $token );
     95                }
     96
    9097                if ( ! empty( $this->custom_headers ) ) {
    9198                        $headers = array();
  • cybexsoft-smtp/trunk/languages/cybexsoft-smtp.pot

    r3732590 r3733698  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Cybexsoft SMTP 1.0.6\n"
     5"Project-Id-Version: Cybexsoft SMTP 1.0.7\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/cybexsoft-smtp\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-07T12:30:54+00:00\n"
     12"POT-Creation-Date: 2026-10-08T05:04:44+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"Plural-Forms: nplurals=2; plural=(n != 1);\n"
    … …  
    5050#: admin/views/partial-lists-manage.php:259
    5151#: admin/views/partial-mailer-list.php:81
    52 #: admin/views/tab-dashboard.php:279
    53 #: admin/views/tab-dashboard.php:377
    54 #: admin/views/tab-dashboard.php:395
    55 #: admin/views/tab-dashboard.php:396
     52#: admin/views/tab-dashboard.php:286
     53#: admin/views/tab-dashboard.php:384
     54#: admin/views/tab-dashboard.php:402
     55#: admin/views/tab-dashboard.php:403
    5656#: admin/views/tab-deliver.php:354
    57 #: admin/views/tab-log.php:129
    58 #: admin/views/tab-log.php:130
     57#: admin/views/tab-log.php:134
     58#: admin/views/tab-log.php:135
    5959#: admin/views/tab-settings.php:76
    6060#: admin/views/tab-settings.php:164
    … …  
    9898
    9999#: admin/views/header.php:50
    100 #: admin/views/tab-dashboard.php:432
     100#: admin/views/tab-dashboard.php:439
    101101#: includes/class-cybex-smtp-plugins-screen.php:79
    102102msgid "Get Pro for Free"
    … …  
    207207
    208208#: admin/views/header.php:173
    209 #: pro/includes/class-cybex-smtp-pro-admin.php:169
     209#: pro/includes/class-cybex-smtp-pro-admin.php:171
    210210msgid "License activated."
    211211msgstr ""
    … …  
    303303#: admin/views/modal-email-content.php:28
    304304#: includes/class-cybex-smtp-admin.php:267
    305 #: pro/includes/class-cybex-smtp-pro-admin.php:319
     305#: pro/includes/class-cybex-smtp-pro-admin.php:321
    306306msgid "Loading…"
    307307msgstr ""
    308308
    309309#: admin/views/modal-get-pro.php:23
    310 #: admin/views/tab-dashboard.php:429
     310#: admin/views/tab-dashboard.php:436
    311311msgid "Get Cybexsoft SMTP Pro — free"
    312312msgstr ""
    … …  
    483483
    484484#: admin/views/modal-wizard.php:301
    485 #: admin/views/tab-dashboard.php:337
     485#: admin/views/tab-dashboard.php:344
    486486#: includes/class-cybex-smtp-notices.php:185
    487487msgid "Send a test email"
    … …  
    788788
    789789#: admin/views/partial-lists-manage.php:462
    790 #: admin/views/tab-log.php:112
     790#: admin/views/tab-log.php:117
    791791msgid "Clear selection"
    792792msgstr ""
    … …  
    817817
    818818#: admin/views/partial-lists-manage.php:478
    819 #: admin/views/tab-log.php:132
     819#: admin/views/tab-log.php:137
    820820msgid "Actions"
    821821msgstr ""
    … …  
    841841#. translators: %s: email subject
    842842#: admin/views/partial-lists-manage.php:514
    843 #: admin/views/tab-log.php:168
     843#: admin/views/tab-log.php:173
    844844msgid "Select %s"
    845845msgstr ""
    … …  
    871871
    872872#: admin/views/partial-lists-manage.php:580
    873 #: admin/views/tab-log.php:270
     873#: admin/views/tab-log.php:275
    874874msgid "Prev"
    875875msgstr ""
    876876
    877877#: admin/views/partial-lists-manage.php:586
    878 #: admin/views/tab-log.php:280
     878#: admin/views/tab-log.php:285
    879879msgid "Next"
    880880msgstr ""
    … …  
    933933
    934934#: admin/views/partial-lists-manage.php:664
    935 #: admin/views/tab-log.php:92
     935#: admin/views/tab-log.php:97
    936936msgid "Export CSV"
    937937msgstr ""
    … …  
    11751175#: admin/views/tab-dashboard.php:39
    11761176#: admin/views/tab-deliver.php:88
    1177 #: includes/class-cybex-smtp-ajax.php:478
     1177#: includes/class-cybex-smtp-ajax.php:488
    11781178msgid "Pass"
    11791179msgstr ""
    11801180
    11811181#: admin/views/tab-dashboard.php:40
    1182 #: includes/class-cybex-smtp-ajax.php:479
     1182#: includes/class-cybex-smtp-ajax.php:489
    11831183msgid "Monitor"
    11841184msgstr ""
    … …  
    11871187#: admin/views/tab-deliver.php:90
    11881188#: admin/views/tab-deliver.php:318
    1189 #: includes/class-cybex-smtp-ajax.php:480
     1189#: includes/class-cybex-smtp-ajax.php:490
    11901190msgid "Missing"
    11911191msgstr ""
    … …  
    11931193#: admin/views/tab-dashboard.php:42
    11941194#: admin/views/tab-deliver.php:91
    1195 #: includes/class-cybex-smtp-ajax.php:481
     1195#: includes/class-cybex-smtp-ajax.php:491
    11961196msgid "Not set up"
    11971197msgstr ""
    … …  
    12441244
    12451245#: admin/views/tab-dashboard.php:143
    1246 #: admin/views/tab-log.php:145
     1246#: admin/views/tab-log.php:150
    12471247#: admin/views/tab-tools.php:96
    12481248#: includes/class-cybex-smtp-ajax.php:261
    … …  
    13121312msgstr ""
    13131313
    1314 #. translators: 1: delivered count, 2: failed count
     1314#. translators: 1: count of messages the provider accepted, 2: failed count
    13151315#: admin/views/tab-dashboard.php:244
    1316 msgid "%1$s delivered · %2$s failed"
     1316msgid "%1$s sent · %2$s failed"
    13171317msgstr ""
    13181318
    13191319#: admin/views/tab-dashboard.php:252
    1320 msgid "Delivered · 30d"
     1320msgid "Accepted · 30d"
    13211321msgstr ""
    13221322
    … …  
    13251325msgstr ""
    13261326
    1327 #: admin/views/tab-dashboard.php:261
     1327#: admin/views/tab-dashboard.php:268
    13281328msgid "Failed · 30d"
    13291329msgstr ""
    13301330
    1331 #: admin/views/tab-dashboard.php:266
     1331#: admin/views/tab-dashboard.php:273
    13321332msgid "vs previous 30 days"
    13331333msgstr ""
    13341334
    1335 #: admin/views/tab-dashboard.php:279
    1336 #: pro/includes/class-cybex-smtp-pro-reports.php:135
     1335#: admin/views/tab-dashboard.php:286
     1336#: pro/includes/class-cybex-smtp-pro-reports.php:151
    13371337msgid "Open rate"
    13381338msgstr ""
    13391339
    1340 #: admin/views/tab-dashboard.php:281
     1340#: admin/views/tab-dashboard.php:288
    13411341msgid "Install & activate Pro"
    13421342msgstr ""
    13431343
    1344 #: admin/views/tab-dashboard.php:289
     1344#: admin/views/tab-dashboard.php:296
    13451345msgid "Email volume · last 14 days"
    13461346msgstr ""
    13471347
    1348 #: admin/views/tab-dashboard.php:291
    1349 #: admin/views/tab-dashboard.php:338
     1348#: admin/views/tab-dashboard.php:298
     1349#: admin/views/tab-dashboard.php:401
    13501350#: admin/views/tab-log.php:33
    1351 #: includes/class-cybex-smtp-logger.php:36
    1352 #: pro/admin/views/view-message.php:52
    1353 #: pro/includes/class-cybex-smtp-pro-reports.php:133
     1351#: includes/class-cybex-smtp-logger.php:41
     1352#: pro/admin/views/view-message.php:42
     1353#: pro/includes/class-cybex-smtp-pro-reports.php:134
     1354msgid "Sent"
     1355msgstr ""
     1356
     1357#: admin/views/tab-dashboard.php:299
     1358#: admin/views/tab-log.php:34
     1359#: includes/class-cybex-smtp-logger.php:61
     1360#: pro/includes/class-cybex-smtp-pro-reports.php:136
     1361msgid "Failed"
     1362msgstr ""
     1363
     1364#: admin/views/tab-dashboard.php:323
     1365msgid "Setup checklist"
     1366msgstr ""
     1367
     1368#: admin/views/tab-dashboard.php:328
     1369msgid "Connect a mailer"
     1370msgstr ""
     1371
     1372#: admin/views/tab-dashboard.php:329
     1373msgid "configured"
     1374msgstr ""
     1375
     1376#: admin/views/tab-dashboard.php:329
     1377msgid "Choose a mailer in Settings"
     1378msgstr ""
     1379
     1380#: admin/views/tab-dashboard.php:331
     1381#: admin/views/tab-dashboard.php:339
     1382#: admin/views/tab-dashboard.php:347
     1383#: admin/views/tab-dashboard.php:375
     1384msgid "Done"
     1385msgstr ""
     1386
     1387#: admin/views/tab-dashboard.php:336
     1388msgid "Verify sending domain"
     1389msgstr ""
     1390
     1391#: admin/views/tab-dashboard.php:337
     1392msgid "SPF record found"
     1393msgstr ""
     1394
     1395#: admin/views/tab-dashboard.php:337
     1396msgid "No SPF record found"
     1397msgstr ""
     1398
     1399#: admin/views/tab-dashboard.php:345
     1400#: includes/class-cybex-smtp-logger.php:45
    13541401msgid "Delivered"
    13551402msgstr ""
    13561403
    1357 #: admin/views/tab-dashboard.php:292
    1358 #: admin/views/tab-log.php:34
    1359 #: includes/class-cybex-smtp-logger.php:40
    1360 #: pro/admin/views/view-message.php:52
    1361 #: pro/includes/class-cybex-smtp-pro-reports.php:134
    1362 msgid "Failed"
    1363 msgstr ""
    1364 
    1365 #: admin/views/tab-dashboard.php:316
    1366 msgid "Setup checklist"
    1367 msgstr ""
    1368 
    1369 #: admin/views/tab-dashboard.php:321
    1370 msgid "Connect a mailer"
    1371 msgstr ""
    1372 
    1373 #: admin/views/tab-dashboard.php:322
    1374 msgid "configured"
    1375 msgstr ""
    1376 
    1377 #: admin/views/tab-dashboard.php:322
    1378 msgid "Choose a mailer in Settings"
    1379 msgstr ""
    1380 
    1381 #: admin/views/tab-dashboard.php:324
    1382 #: admin/views/tab-dashboard.php:332
    1383 #: admin/views/tab-dashboard.php:340
    1384 #: admin/views/tab-dashboard.php:368
    1385 msgid "Done"
    1386 msgstr ""
    1387 
    1388 #: admin/views/tab-dashboard.php:329
    1389 msgid "Verify sending domain"
    1390 msgstr ""
    1391 
    1392 #: admin/views/tab-dashboard.php:330
    1393 msgid "SPF record found"
    1394 msgstr ""
    1395 
    1396 #: admin/views/tab-dashboard.php:330
    1397 msgid "No SPF record found"
    1398 msgstr ""
    1399 
    1400 #: admin/views/tab-dashboard.php:338
     1404#: admin/views/tab-dashboard.php:345
    14011405msgid "Not sent yet"
    14021406msgstr ""
    14031407
    1404 #: admin/views/tab-dashboard.php:365
    1405 #: admin/views/tab-dashboard.php:374
     1408#: admin/views/tab-dashboard.php:372
     1409#: admin/views/tab-dashboard.php:381
    14061410msgid "Enable open & click tracking"
    14071411msgstr ""
    14081412
    1409 #: admin/views/tab-dashboard.php:366
     1413#: admin/views/tab-dashboard.php:373
    14101414msgid "Tracking active"
    14111415msgstr ""
    14121416
    1413 #: admin/views/tab-dashboard.php:366
     1417#: admin/views/tab-dashboard.php:373
    14141418msgid "Turn it on in Settings → Email controls"
    14151419msgstr ""
    14161420
    1417 #: admin/views/tab-dashboard.php:375
     1421#: admin/views/tab-dashboard.php:382
    14181422msgid "Install and activate Cybexsoft SMTP Pro"
    14191423msgstr ""
    14201424
    1421 #: admin/views/tab-dashboard.php:386
     1425#: admin/views/tab-dashboard.php:393
    14221426msgid "Recent emails"
    14231427msgstr ""
    14241428
    1425 #: admin/views/tab-dashboard.php:387
     1429#: admin/views/tab-dashboard.php:394
    14261430msgid "View full log →"
    14271431msgstr ""
    14281432
    1429 #: admin/views/tab-dashboard.php:391
    1430 #: admin/views/tab-log.php:125
     1433#: admin/views/tab-dashboard.php:398
     1434#: admin/views/tab-log.php:130
    14311435#: includes/class-cybex-smtp-privacy.php:101
    14321436msgid "Subject"
    14331437msgstr ""
    14341438
    1435 #: admin/views/tab-dashboard.php:392
    1436 #: admin/views/tab-log.php:126
     1439#: admin/views/tab-dashboard.php:399
     1440#: admin/views/tab-log.php:131
    14371441#: includes/class-cybex-smtp-privacy.php:105
    14381442msgid "Recipient"
    14391443msgstr ""
    14401444
    1441 #: admin/views/tab-dashboard.php:393
    1442 #: admin/views/tab-log.php:127
     1445#: admin/views/tab-dashboard.php:400
     1446#: admin/views/tab-log.php:132
    14431447#: includes/class-cybex-smtp-ajax.php:302
    14441448#: includes/class-cybex-smtp-privacy.php:113
    … …  
    14481452msgstr ""
    14491453
    1450 #: admin/views/tab-dashboard.php:394
    1451 #: pro/admin/views/view-message.php:42
    1452 #: pro/includes/class-cybex-smtp-pro-reports.php:132
    1453 msgid "Sent"
    1454 msgstr ""
    1455 
    1456 #: admin/views/tab-dashboard.php:395
    1457 #: admin/views/tab-log.php:129
     1454#: admin/views/tab-dashboard.php:402
     1455#: admin/views/tab-log.php:134
    14581456#: pro/admin/views/view-message.php:96
    14591457msgid "Opens"
    14601458msgstr ""
    14611459
    1462 #: admin/views/tab-dashboard.php:396
    1463 #: admin/views/tab-log.php:130
     1460#: admin/views/tab-dashboard.php:403
     1461#: admin/views/tab-log.php:135
    14641462#: pro/admin/views/view-message.php:102
    14651463msgid "Clicks"
    14661464msgstr ""
    14671465
    1468 #: admin/views/tab-dashboard.php:399
     1466#: admin/views/tab-dashboard.php:406
    14691467msgid "No emails sent yet."
    14701468msgstr ""
    14711469
    1472 #: admin/views/tab-dashboard.php:406
     1470#: admin/views/tab-dashboard.php:413
    14731471#: pro/admin/views/part-bounce-handling.php:146
    14741472msgid "ago"
    14751473msgstr ""
    14761474
    1477 #: admin/views/tab-dashboard.php:420
     1475#: admin/views/tab-dashboard.php:427
    14781476msgid "Cybexsoft SMTP Pro is active"
    14791477msgstr ""
    14801478
    1481 #: admin/views/tab-dashboard.php:421
     1479#: admin/views/tab-dashboard.php:428
    14821480msgid "Open & click tracking, content archiving, backup failover and weekly reports are all enabled."
    14831481msgstr ""
    14841482
    1485 #: admin/views/tab-dashboard.php:423
     1483#: admin/views/tab-dashboard.php:430
    14861484msgid "Manage Pro features →"
    14871485msgstr ""
    14881486
    1489 #: admin/views/tab-dashboard.php:430
     1487#: admin/views/tab-dashboard.php:437
    14901488msgid "Open & click tracking, content archiving, backup failover, weekly reports and four more mailers. Ask us and we will email you a copy."
    14911489msgstr ""
    14921490
    14931491#: admin/views/tab-deliver.php:45
    1494 #: includes/class-cybex-smtp-ajax.php:485
     1492#: includes/class-cybex-smtp-ajax.php:495
    14951493msgid "SPF"
    14961494msgstr ""
    … …  
    15111509
    15121510#: admin/views/tab-deliver.php:56
    1513 #: includes/class-cybex-smtp-ajax.php:486
     1511#: includes/class-cybex-smtp-ajax.php:496
    15141512msgid "DKIM"
    15151513msgstr ""
    … …  
    15281526
    15291527#: admin/views/tab-deliver.php:68
    1530 #: includes/class-cybex-smtp-ajax.php:487
     1528#: includes/class-cybex-smtp-ajax.php:497
    15311529msgid "DMARC"
    15321530msgstr ""
    … …  
    17081706msgstr ""
    17091707
    1710 #: admin/views/tab-log.php:40
    1711 #: includes/class-cybex-smtp-ajax.php:370
    1712 #: includes/class-cybex-smtp-logger.php:44
    1713 msgid "Blocked"
    1714 msgstr ""
    1715 
    1716 #: admin/views/tab-log.php:71
     1708#: admin/views/tab-log.php:76
    17171709msgid "Search by subject or recipient…"
    17181710msgstr ""
    17191711
    1720 #: admin/views/tab-log.php:109
     1712#: admin/views/tab-log.php:114
    17211713msgid "Delete selected"
    17221714msgstr ""
    17231715
    1724 #: admin/views/tab-log.php:122
     1716#: admin/views/tab-log.php:127
    17251717msgid "Select all emails on this page"
    17261718msgstr ""
    17271719
    1728 #: admin/views/tab-log.php:128
     1720#: admin/views/tab-log.php:133
    17291721#: includes/class-cybex-smtp-ajax.php:282
    17301722#: includes/class-cybex-smtp-privacy.php:97
    … …  
    17321724msgstr ""
    17331725
    1734 #: admin/views/tab-log.php:137
     1726#: admin/views/tab-log.php:142
    17351727msgid "No emails found."
    17361728msgstr ""
    17371729
    17381730#. translators: %s: the plugin, theme or "WordPress" that sent the email
    1739 #: admin/views/tab-log.php:194
     1731#: admin/views/tab-log.php:199
    17401732msgid "from %s"
    17411733msgstr ""
    17421734
    1743 #: admin/views/tab-log.php:227
     1735#: admin/views/tab-log.php:232
    17441736msgid "View email content"
    17451737msgstr ""
    17461738
    17471739#. translators: %s: email subject
    1748 #: admin/views/tab-log.php:233
     1740#: admin/views/tab-log.php:238
    17491741msgid "View content of %s"
    17501742msgstr ""
    17511743
    17521744#. translators: 1: first row on this page, 2: last row on this page, 3: total rows
    1753 #: admin/views/tab-log.php:260
     1745#: admin/views/tab-log.php:265
    17541746msgid "Showing %1$s–%2$s of %3$s emails"
    17551747msgstr ""
    17561748
    1757 #: admin/views/tab-log.php:299
     1749#: admin/views/tab-log.php:304
    17581750msgid "Open & click tracking is a Pro feature"
    17591751msgstr ""
    17601752
    1761 #: admin/views/tab-log.php:300
     1753#: admin/views/tab-log.php:305
    17621754msgid "Install and activate Cybexsoft SMTP Pro to see engagement per email and per link, plus full HTML content archiving."
    17631755msgstr ""
    … …  
    18911883
    18921884#: admin/views/tab-settings.php:313
    1893 msgid "Delete all delivered log entries?"
     1885msgid "Delete all sent log entries?"
    18941886msgstr ""
    18951887
    18961888#: admin/views/tab-settings.php:314
    1897 msgid "Delete delivered only"
     1889msgid "Delete sent only"
    18981890msgstr ""
    18991891
    … …  
    19821974
    19831975#: admin/views/tab-tools.php:73
    1984 #: includes/class-cybex-smtp-ajax.php:368
     1976#: includes/class-cybex-smtp-ajax.php:378
    19851977msgid "Connection trace"
    19861978msgstr ""
    … …  
    23502342#: includes/class-cybex-smtp-admin.php:260
    23512343#: includes/class-cybex-smtp-plugins-screen.php:211
    2352 #: pro/includes/class-cybex-smtp-pro-admin.php:318
     2344#: pro/includes/class-cybex-smtp-pro-admin.php:320
    23532345msgid "Something went wrong. Please try again."
    23542346msgstr ""
    23552347
    23562348#: includes/class-cybex-smtp-admin.php:261
    2357 msgid "delivered"
     2349msgid "sent"
    23582350msgstr ""
    23592351
    … …  
    25332525#: includes/class-cybex-smtp-ajax.php:39
    25342526#: includes/class-cybex-smtp-notices.php:536
    2535 #: pro/includes/class-cybex-smtp-pro-admin.php:547
    2536 #: pro/includes/class-cybex-smtp-pro-admin.php:559
    2537 #: pro/includes/class-cybex-smtp-pro-admin.php:595
     2527#: pro/includes/class-cybex-smtp-pro-admin.php:637
     2528#: pro/includes/class-cybex-smtp-pro-admin.php:649
     2529#: pro/includes/class-cybex-smtp-pro-admin.php:685
    25382530#: pro/includes/class-cybex-smtp-pro-ajax.php:38
    25392531#: pro/includes/class-cybex-smtp-pro-promotion.php:393
    … …  
    25602552
    25612553#: includes/class-cybex-smtp-ajax.php:68
    2562 #: includes/class-cybex-smtp-ajax.php:339
     2554#: includes/class-cybex-smtp-ajax.php:349
    25632555msgid "That is not a valid email address to test with."
    25642556msgstr ""
    … …  
    26392631msgstr ""
    26402632
    2641 #: includes/class-cybex-smtp-ajax.php:318
     2633#: includes/class-cybex-smtp-ajax.php:328
    26422634msgid "Headers"
    26432635msgstr ""
    26442636
    2645 #: includes/class-cybex-smtp-ajax.php:370
     2637#: includes/class-cybex-smtp-ajax.php:380
    26462638msgid "Reachable"
    26472639msgstr ""
    26482640
     2641#: includes/class-cybex-smtp-ajax.php:380
     2642#: includes/class-cybex-smtp-logger.php:65
     2643msgid "Blocked"
     2644msgstr ""
     2645
    26492646#. translators: %s: total milliseconds
    2650 #: includes/class-cybex-smtp-ajax.php:375
     2647#: includes/class-cybex-smtp-ajax.php:385
    26512648msgid "%s ms total"
    26522649msgstr ""
    26532650
    26542651#. translators: %s: milliseconds
    2655 #: includes/class-cybex-smtp-ajax.php:387
     2652#: includes/class-cybex-smtp-ajax.php:397
    26562653#: pro/includes/class-cybex-smtp-pro-ajax.php:155
    26572654msgid "%s ms"
    26582655msgstr ""
    26592656
    2660 #: includes/class-cybex-smtp-ajax.php:452
     2657#: includes/class-cybex-smtp-ajax.php:462
    26612658msgid "Please enter a domain to check."
    26622659msgstr ""
    26632660
    2664 #: includes/class-cybex-smtp-ajax.php:465
     2661#: includes/class-cybex-smtp-ajax.php:475
    26652662msgid "That does not look like a domain name. Enter just the domain you send from, e.g. example.com."
    26662663msgstr ""
    26672664
    2668 #: includes/class-cybex-smtp-ajax.php:474
     2665#: includes/class-cybex-smtp-ajax.php:484
    26692666msgid "This server does not support DNS lookups (dns_get_record is unavailable)."
    26702667msgstr ""
    … …  
    29752972msgstr ""
    29762973
     2974#: includes/class-cybex-smtp-logger.php:49
     2975msgid "Deferred"
     2976msgstr ""
     2977
     2978#: includes/class-cybex-smtp-logger.php:53
     2979#: pro/includes/class-cybex-smtp-pro-reports.php:147
     2980msgid "Bounced"
     2981msgstr ""
     2982
     2983#: includes/class-cybex-smtp-logger.php:57
     2984#: pro/includes/class-cybex-smtp-pro-failures.php:150
     2985msgid "Spam complaint"
     2986msgstr ""
     2987
    29772988#: includes/class-cybex-smtp-mailers.php:56
    29782989msgid "Default (PHP mail)"
    … …  
    35293540
    35303541#: pro/admin/views/part-alerts-card.php:64
     3542msgid "Also alert when the bounce rate passes (%)"
     3543msgstr ""
     3544
     3545#. translators: %d: minimum number of messages
     3546#: pro/admin/views/part-alerts-card.php:70
     3547msgid "Over the last 24 hours, from providers that report bounces back (set up under Delivery events on the mailer). Needs at least %d messages, at most one alert a day. 0 turns it off; 2–5 is a sensible line."
     3548msgstr ""
     3549
     3550#: pro/admin/views/part-alerts-card.php:78
    35313551msgid "A message that fails on your primary mailer but is rescued by the backup does not raise an alert — only final failures do. Alerts go out through your configured mailer, so if that is the thing that is broken the alert will not arrive: pair alerts with a backup mailer on a different provider."
    35323552msgstr ""
    … …  
    36803700
    36813701#: pro/admin/views/part-danger-engagement.php:28
    3682 #: pro/includes/class-cybex-smtp-pro-admin.php:320
     3702#: pro/includes/class-cybex-smtp-pro-admin.php:322
    36833703msgid "Delete all engagement data and archived content? This cannot be undone."
     3704msgstr ""
     3705
     3706#: pro/admin/views/part-delivery-events.php:25
     3707msgid "In Amazon SNS, create a topic and add an HTTPS subscription with the URL below. This site confirms the subscription by itself. Then, in SES, send Bounce, Complaint, Delivery and Delivery delay notifications for your sending identity (or a configuration set) to that topic."
     3708msgstr ""
     3709
     3710#: pro/admin/views/part-delivery-events.php:28
     3711msgid "In SendGrid, go to Settings → Mail Settings → Event Webhook, paste the URL below, tick Delivered, Deferred, Bounced, Dropped and Spam Reports, and turn on Signed Event Webhook. Copy the verification key it shows into the field here."
     3712msgstr ""
     3713
     3714#: pro/admin/views/part-delivery-events.php:29
     3715msgid "Verification key"
     3716msgstr ""
     3717
     3718#: pro/admin/views/part-delivery-events.php:32
     3719msgid "In Mailgun, go to Sending → Webhooks for your domain and add the URL below for Delivered, Permanent failure, Temporary failure and Spam complaints. Copy the HTTP webhook signing key from the same page into the field here."
     3720msgstr ""
     3721
     3722#: pro/admin/views/part-delivery-events.php:33
     3723msgid "HTTP webhook signing key"
     3724msgstr ""
     3725
     3726#: pro/admin/views/part-delivery-events.php:36
     3727msgid "In Postmark, open your server, choose the message stream, then Webhooks → Add webhook. Paste the URL below and tick Delivery, Bounce and Spam Complaint. Leave Basic auth credentials empty: the key in the URL does that job."
     3728msgstr ""
     3729
     3730#: pro/admin/views/part-delivery-events.php:39
     3731msgid "In Brevo, go to Transactional → Settings → Webhook, add a webhook with the URL below, and tick Delivered, Deferred, Soft bounce, Hard bounce, Invalid email, Blocked and Complaint."
     3732msgstr ""
     3733
     3734#: pro/admin/views/part-delivery-events.php:42
     3735msgid "In SMTP2GO, go to Settings → Webhooks, add the URL below, and tick Delivered, Bounce, Spam and Reject. Either output type works."
     3736msgstr ""
     3737
     3738#: pro/admin/views/part-delivery-events.php:45
     3739msgid "In Resend, go to Webhooks → Add endpoint, paste the URL below and choose email.delivered, email.delivery_delayed, email.bounced, email.complained and email.suppressed. Copy the endpoint’s signing secret (it starts whsec_) into the field here."
     3740msgstr ""
     3741
     3742#: pro/admin/views/part-delivery-events.php:46
     3743#: pro/admin/views/part-delivery-events.php:50
     3744msgid "Signing secret"
     3745msgstr ""
     3746
     3747#: pro/admin/views/part-delivery-events.php:49
     3748msgid "In MailerSend, go to Domains → your domain → Webhooks → Add webhook, paste the URL below and choose activity.delivered, activity.deferred, activity.soft_bounced, activity.hard_bounced and activity.spam_complaint. Copy its signing secret into the field here."
     3749msgstr ""
     3750
     3751#: pro/admin/views/part-delivery-events.php:53
     3752msgid "In Mailjet, go to Account settings → Event notifications (webhooks) and paste the URL below against Sent, Bounce, Blocked and Spam."
     3753msgstr ""
     3754
     3755#: pro/admin/views/part-delivery-events.php:56
     3756msgid "In Elastic Email, go to Settings → Notifications (Webhooks), add the URL below and tick Sent, Bounce/Error and Complaints. Elastic Email checks the URL when you save it; this site answers that check."
     3757msgstr ""
     3758
     3759#: pro/admin/views/part-delivery-events.php:59
     3760msgid "In ZeptoMail, open the Mail Agent → Webhooks → Add webhook, paste the URL below and choose Hard bounce, Soft bounce and Feedback loop. ZeptoMail does not report deliveries, so messages stay \"Sent\" unless they bounce or draw a complaint."
     3761msgstr ""
     3762
     3763#: pro/admin/views/part-delivery-events.php:73
     3764#: pro/admin/views/part-delivery-events.php:127
     3765msgid "Delivery events"
     3766msgstr ""
     3767
     3768#: pro/admin/views/part-delivery-events.php:74
     3769msgid "Lets the provider tell this site what happened after it took a message: delivered, delayed, bounced or reported as spam. The email log shows it, and addresses that hard-bounce or complain are blocked automatically."
     3770msgstr ""
     3771
     3772#: pro/admin/views/part-delivery-events.php:79
     3773msgid "Webhook URL"
     3774msgstr ""
     3775
     3776#: pro/admin/views/part-delivery-events.php:82
     3777msgid "The key at the end is what tells this site the request is genuine. Keep the URL private."
     3778msgstr ""
     3779
     3780#: pro/admin/views/part-delivery-events.php:85
     3781msgid "Make new keys when I save (every provider’s URL with a key changes and must be pasted again)"
     3782msgstr ""
     3783
     3784#. translators: %s: how long ago, e.g. "3 minutes"
     3785#: pro/admin/views/part-delivery-events.php:107
     3786msgid "Last event received %s ago."
     3787msgstr ""
     3788
     3789#: pro/admin/views/part-delivery-events.php:111
     3790msgid "Nothing received yet."
     3791msgstr ""
     3792
     3793#: pro/admin/views/part-delivery-events.php:128
     3794msgid "Not available for this mailer. Gmail and Outlook do not report deliveries, bounces or complaints to the apps that send through them; a bounce arrives as an email in the sending mailbox instead. Messages sent this way stay \"Sent\" in the log."
    36843795msgstr ""
    36853796
    … …  
    42314342msgstr ""
    42324343
    4233 #: pro/includes/class-cybex-smtp-pro-admin.php:170
     4344#: pro/includes/class-cybex-smtp-pro-admin.php:172
    42344345msgid "The license could not be activated."
    42354346msgstr ""
    42364347
    4237 #: pro/includes/class-cybex-smtp-pro-admin.php:171
     4348#: pro/includes/class-cybex-smtp-pro-admin.php:173
    42384349msgid "Message re-sent."
    42394350msgstr ""
    42404351
    4241 #: pro/includes/class-cybex-smtp-pro-admin.php:172
     4352#: pro/includes/class-cybex-smtp-pro-admin.php:174
    42424353msgid "The message could not be re-sent. Check the debug log in Tools."
    42434354msgstr ""
    42444355
    4245 #: pro/includes/class-cybex-smtp-pro-admin.php:173
     4356#: pro/includes/class-cybex-smtp-pro-admin.php:175
    42464357msgid "That message has no archived content to re-send."
    42474358msgstr ""
    42484359
    4249 #: pro/includes/class-cybex-smtp-pro-admin.php:174
     4360#: pro/includes/class-cybex-smtp-pro-admin.php:176
    42504361msgid "Engagement data and archived content deleted."
    42514362msgstr ""
    42524363
    4253 #: pro/includes/class-cybex-smtp-pro-admin.php:175
     4364#: pro/includes/class-cybex-smtp-pro-admin.php:177
    42544365msgid "Your backup mailer is now the primary. The one it replaced is standing by."
    42554366msgstr ""
    42564367
    4257 #: pro/includes/class-cybex-smtp-pro-admin.php:176
     4368#: pro/includes/class-cybex-smtp-pro-admin.php:178
    42584369msgid "The mailers were not swapped. The reasons are listed on the notice that offered it."
    42594370msgstr ""
    42604371
    4261 #: pro/includes/class-cybex-smtp-pro-admin.php:178
     4372#: pro/includes/class-cybex-smtp-pro-admin.php:180
    42624373msgid "Blocklists checked."
    42634374msgstr ""
    42644375
    4265 #: pro/includes/class-cybex-smtp-pro-admin.php:179
     4376#: pro/includes/class-cybex-smtp-pro-admin.php:181
    42664377msgid "There is no sending IP to check with your current mailer. See the card below."
    42674378msgstr ""
    42684379
    4269 #: pro/includes/class-cybex-smtp-pro-admin.php:181
     4380#: pro/includes/class-cybex-smtp-pro-admin.php:183
    42704381msgid "Weekly report sent."
    42714382msgstr ""
    42724383
    4273 #: pro/includes/class-cybex-smtp-pro-admin.php:182
     4384#: pro/includes/class-cybex-smtp-pro-admin.php:184
    42744385msgid "The weekly report could not be sent. Check the debug log below."
    42754386msgstr ""
    42764387
    4277 #: pro/includes/class-cybex-smtp-pro-admin.php:183
     4388#: pro/includes/class-cybex-smtp-pro-admin.php:185
    42784389msgid "Account connected."
    42794390msgstr ""
    42804391
    4281 #: pro/includes/class-cybex-smtp-pro-admin.php:184
     4392#: pro/includes/class-cybex-smtp-pro-admin.php:186
    42824393msgid "The account could not be connected."
    42834394msgstr ""
    42844395
    4285 #: pro/includes/class-cybex-smtp-pro-admin.php:185
     4396#: pro/includes/class-cybex-smtp-pro-admin.php:187
    42864397msgid "Account disconnected."
    42874398msgstr ""
    42884399
    4289 #: pro/includes/class-cybex-smtp-pro-admin.php:206
     4400#: pro/includes/class-cybex-smtp-pro-admin.php:208
    42904401msgid "Pro settings"
    42914402msgstr ""
    42924403
    4293 #: pro/includes/class-cybex-smtp-pro-admin.php:321
     4404#: pro/includes/class-cybex-smtp-pro-admin.php:323
    42944405msgid "This sends a real message through your backup mailer, to your From address. Continue?"
    42954406msgstr ""
    42964407
    4297 #: pro/includes/class-cybex-smtp-pro-admin.php:375
     4408#: pro/includes/class-cybex-smtp-pro-admin.php:377
    42984409msgid "The watchlist (bounce history only)"
    42994410msgstr ""
    43004411
    4301 #: pro/includes/class-cybex-smtp-pro-admin.php:512
     4412#. translators: 1: number of messages, 2: provider names
     4413#: pro/includes/class-cybex-smtp-pro-admin.php:520
     4414msgid "Delivery reports: %1$s message so far, from %2$s"
     4415msgid_plural "Delivery reports: %1$s messages so far, from %2$s"
     4416msgstr[0] ""
     4417msgstr[1] ""
     4418
     4419#. translators: 1: delivered rate, 2: bounce rate, 3: complaint rate, 4: provider names
     4420#: pro/includes/class-cybex-smtp-pro-admin.php:527
     4421msgid "%1$s%% delivered · %2$s%% bounced · %3$s%% complaints (%4$s)"
     4422msgstr ""
     4423
     4424#: pro/includes/class-cybex-smtp-pro-admin.php:558
     4425msgid "hard"
     4426msgstr ""
     4427
     4428#: pro/includes/class-cybex-smtp-pro-admin.php:558
     4429msgid "soft"
     4430msgstr ""
     4431
     4432#: pro/includes/class-cybex-smtp-pro-admin.php:573
     4433msgid "Provider reports"
     4434msgstr ""
     4435
     4436#: pro/includes/class-cybex-smtp-pro-admin.php:602
    43024437msgid "Not tracked — plain-text message, or this kind of tracking was off when it was sent."
    43034438msgstr ""
    … …  
    44324567msgstr ""
    44334568
     4569#. translators: 1: bounce rate as a percentage, 2: site name
     4570#: pro/includes/class-cybex-smtp-pro-alerts.php:109
     4571msgid "[Bounce rate %1$s%%] %2$s"
     4572msgstr ""
     4573
     4574#: pro/includes/class-cybex-smtp-pro-alerts.php:115
     4575msgid "Too much of your mail is bouncing"
     4576msgstr ""
     4577
     4578#. translators: 1: number bounced, 2: number sent, 3: bounce rate, 4: the alert threshold
     4579#: pro/includes/class-cybex-smtp-pro-alerts.php:120
     4580msgid "%1$s of %2$s messages sent in the last 24 hours bounced (%3$s%%). The alert is set at %4$s%%."
     4581msgstr ""
     4582
     4583#: pro/includes/class-cybex-smtp-pro-alerts.php:127
     4584msgid "Mailbox providers start filtering or refusing a sender whose bounce rate stays high. Usual causes: an old or bought address list, a sign-up form without confirmation, or a typo-prone checkout field."
     4585msgstr ""
     4586
     4587#: pro/includes/class-cybex-smtp-pro-alerts.php:128
     4588msgid "See the bounced messages"
     4589msgstr ""
     4590
    44344591#. translators: 1: number of failures, 2: site name
    4435 #: pro/includes/class-cybex-smtp-pro-alerts.php:107
     4592#: pro/includes/class-cybex-smtp-pro-alerts.php:199
    44364593msgid "[%1$d email failed] %2$s"
    44374594msgid_plural "[%1$d emails failed] %2$s"
    … …  
    44394596msgstr[1] ""
    44404597
    4441 #: pro/includes/class-cybex-smtp-pro-alerts.php:175
     4598#: pro/includes/class-cybex-smtp-pro-alerts.php:267
    44424599msgid "Email delivery is failing"
    44434600msgstr ""
    44444601
    44454602#. translators: 1: number of failures, 2: window in minutes
    4446 #: pro/includes/class-cybex-smtp-pro-alerts.php:181
     4603#: pro/includes/class-cybex-smtp-pro-alerts.php:273
    44474604msgid "%1$d message failed to send in the last %2$d minutes."
    44484605msgid_plural "%1$d messages failed to send in the last %2$d minutes."
    … …  
    44504607msgstr[1] ""
    44514608
    4452 #: pro/includes/class-cybex-smtp-pro-alerts.php:187
     4609#: pro/includes/class-cybex-smtp-pro-alerts.php:279
    44534610msgid "Latest error"
    44544611msgstr ""
    44554612
    4456 #: pro/includes/class-cybex-smtp-pro-alerts.php:191
     4613#: pro/includes/class-cybex-smtp-pro-alerts.php:283
    44574614msgid "Recent failures"
    44584615msgstr ""
    44594616
    4460 #: pro/includes/class-cybex-smtp-pro-alerts.php:195
     4617#: pro/includes/class-cybex-smtp-pro-alerts.php:287
    44614618msgid "Open the email log"
    44624619msgstr ""
    … …  
    44644621#: pro/includes/class-cybex-smtp-pro-cron.php:63
    44654622msgid "Every six hours (Cybexsoft SMTP blocklist check)"
     4623msgstr ""
     4624
     4625#. translators: %s: mailer name, e.g. sendgrid
     4626#: pro/includes/class-cybex-smtp-pro-events.php:744
     4627msgid "Delivery event refused (%s)"
    44664628msgstr ""
    44674629
    … …  
    45784740msgstr ""
    45794741
     4742#: pro/includes/class-cybex-smtp-pro-failures.php:123
     4743msgid "Hard bounce reported by the provider"
     4744msgstr ""
     4745
     4746#: pro/includes/class-cybex-smtp-pro-failures.php:147
     4747msgid "spam complaint"
     4748msgstr ""
     4749
     4750#: pro/includes/class-cybex-smtp-pro-failures.php:149
     4751msgid "Blocked automatically after a spam complaint."
     4752msgstr ""
     4753
    45804754#. translators: 1: number of failures, 2: the last error reported
    4581 #: pro/includes/class-cybex-smtp-pro-failures.php:169
     4755#: pro/includes/class-cybex-smtp-pro-failures.php:249
    45824756msgid "Blocked automatically after %1$d failed deliveries. Last error: %2$s"
    45834757msgstr ""
    45844758
    45854759#. translators: %d: number of failed deliveries
    4586 #: pro/includes/class-cybex-smtp-pro-failures.php:182
     4760#: pro/includes/class-cybex-smtp-pro-failures.php:262
    45874761msgid "Auto-blocked after %d bounces"
    45884762msgstr ""
    … …  
    46244798msgstr ""
    46254799
    4626 #: pro/includes/class-cybex-smtp-pro-modules.php:333
     4800#: pro/includes/class-cybex-smtp-pro-modules.php:343
    46274801msgid "Postmark gives you the DKIM record under Sender Signatures once you add the domain."
    46284802msgstr ""
    46294803
    4630 #: pro/includes/class-cybex-smtp-pro-modules.php:337
     4804#: pro/includes/class-cybex-smtp-pro-modules.php:347
    46314805msgid "Resend shows the DKIM and SPF records to publish when you add the domain under Domains."
    46324806msgstr ""
    46334807
    4634 #: pro/includes/class-cybex-smtp-pro-modules.php:341
     4808#: pro/includes/class-cybex-smtp-pro-modules.php:351
    46354809msgid "MailerSend lists the DKIM record on the domain's page under Domains once it is added."
    46364810msgstr ""
    46374811
    4638 #: pro/includes/class-cybex-smtp-pro-modules.php:345
     4812#: pro/includes/class-cybex-smtp-pro-modules.php:355
    46394813msgid "Mailjet publishes the DKIM record under Account settings → Sender domains & addresses."
    46404814msgstr ""
    46414815
    4642 #: pro/includes/class-cybex-smtp-pro-modules.php:349
     4816#: pro/includes/class-cybex-smtp-pro-modules.php:359
    46434817msgid "Elastic Email gives you the DKIM record under Settings → Domains after you add the domain."
    46444818msgstr ""
    46454819
    4646 #: pro/includes/class-cybex-smtp-pro-modules.php:353
     4820#: pro/includes/class-cybex-smtp-pro-modules.php:363
    46474821msgid "ZeptoMail issues the DKIM selector under Domains when you verify the domain. The record differs by data centre."
    46484822msgstr ""
    46494823
    4650 #: pro/includes/class-cybex-smtp-pro-modules.php:357
     4824#: pro/includes/class-cybex-smtp-pro-modules.php:367
    46514825msgid "Google Workspace generates the DKIM key under Apps → Google Workspace → Gmail → Authenticate email."
    46524826msgstr ""
    46534827
    4654 #: pro/includes/class-cybex-smtp-pro-modules.php:361
     4828#: pro/includes/class-cybex-smtp-pro-modules.php:371
    46554829msgid "Microsoft 365 publishes two DKIM CNAMEs; enable them in the Defender portal under Email authentication settings."
    46564830msgstr ""
    46574831
    4658 #: pro/includes/class-cybex-smtp-pro-modules.php:373
     4832#: pro/includes/class-cybex-smtp-pro-modules.php:383
    46594833msgid "Outlook / Microsoft 365"
    46604834msgstr ""
    … …  
    48625036msgstr ""
    48635037
    4864 #: pro/includes/class-cybex-smtp-pro-reports.php:128
     5038#: pro/includes/class-cybex-smtp-pro-reports.php:130
    48655039msgid "not tracked"
    48665040msgstr ""
    48675041
    4868 #: pro/includes/class-cybex-smtp-pro-reports.php:136
     5042#: pro/includes/class-cybex-smtp-pro-reports.php:135
     5043msgid "Accepted by your provider"
     5044msgstr ""
     5045
     5046#: pro/includes/class-cybex-smtp-pro-reports.php:146
     5047msgid "Delivered (confirmed by the provider)"
     5048msgstr ""
     5049
     5050#: pro/includes/class-cybex-smtp-pro-reports.php:148
     5051msgid "Spam complaints"
     5052msgstr ""
     5053
     5054#: pro/includes/class-cybex-smtp-pro-reports.php:152
    48695055msgid "Click rate"
    48705056msgstr ""
    48715057
    4872 #: pro/includes/class-cybex-smtp-pro-reports.php:140
     5058#: pro/includes/class-cybex-smtp-pro-reports.php:155
    48735059msgid "Your week in email"
    48745060msgstr ""
    48755061
    48765062#. translators: 1: site name, 2: start date, 3: end date
    4877 #: pro/includes/class-cybex-smtp-pro-reports.php:144
     5063#: pro/includes/class-cybex-smtp-pro-reports.php:159
    48785064msgid "%1$s · %2$s to %3$s"
    48795065msgstr ""
    48805066
    4881 #: pro/includes/class-cybex-smtp-pro-reports.php:162
     5067#: pro/includes/class-cybex-smtp-pro-reports.php:177
    48825068msgid "Most clicked links"
    48835069msgstr ""
    48845070
    48855071#. translators: %s: number of clicks
    4886 #: pro/includes/class-cybex-smtp-pro-reports.php:171
     5072#: pro/includes/class-cybex-smtp-pro-reports.php:186
    48875073msgid "%s click"
    48885074msgid_plural "%s clicks"
    … …  
    48905076msgstr[1] ""
    48915077
    4892 #: pro/includes/class-cybex-smtp-pro-reports.php:181
     5078#: pro/includes/class-cybex-smtp-pro-reports.php:196
    48935079msgid "Most common errors"
    48945080msgstr ""
    48955081
    4896 #: pro/includes/class-cybex-smtp-pro-reports.php:194
     5082#: pro/includes/class-cybex-smtp-pro-reports.php:209
    48975083msgid "Addresses blocked automatically"
    48985084msgstr ""
    48995085
    4900 #: pro/includes/class-cybex-smtp-pro-reports.php:195
     5086#: pro/includes/class-cybex-smtp-pro-reports.php:210
    49015087msgid "These kept bouncing, so this site has stopped emailing them. Remove any that should not be there under Cybexsoft SMTP → Pro → Recipients."
    49025088msgstr ""
    49035089
    4904 #: pro/includes/class-cybex-smtp-pro-reports.php:207
     5090#: pro/includes/class-cybex-smtp-pro-reports.php:222
    49055091msgid "Open the dashboard"
    49065092msgstr ""
    49075093
    4908 #: pro/includes/class-cybex-smtp-pro-reports.php:208
     5094#: pro/includes/class-cybex-smtp-pro-reports.php:223
    49095095msgid "Sent by Cybexsoft SMTP Pro. Change the schedule or turn this off under Cybexsoft SMTP → Pro."
    49105096msgstr ""
  • cybexsoft-smtp/trunk/readme.txt

    r3732590 r3733698  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 1.0.6
     7Stable tag: 1.0.7
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    200200== Changelog ==
    201201
     202= 1.0.7 =
     203* New: the email log has delivery statuses — Delivered, Deferred, Bounced and Spam complaint — for messages your provider reports on after accepting them. Reports are received by Cybexsoft SMTP Pro's delivery events, from Amazon SES, SendGrid, Mailgun, Brevo, SMTP2GO, Postmark, Resend, MailerSend, Mailjet, Elastic Email and ZeptoMail; the log filters for these statuses appear once there is mail to show.
     204* Change: a message your provider accepted is now labelled "Sent" instead of "Delivered". Acceptance is all a send can confirm; "Delivered" is kept for mail the provider says reached the mailbox. The dashboard's 30-day rate card now reads "Accepted".
     205* Change: messages sent through SendGrid, Mailgun and Brevo carry their log token in the provider's own tag field, so the provider's reports can be matched to the right log entry.
     206* Developers: two new hooks, `cybex_smtp/dashboard/accepted_stat_after` and the `cybex_smtp/log/email_meta_after` filter, for add-ons to show delivery information on the dashboard and in the message viewer.
     207
    202208= 1.0.6 =
    203209* New: a "Rate ★★★★★" link under the plugin's description on the Plugins screen, and one line at the foot of the plugin's own pages linking to the WordPress.org review form. No pop-ups or admin notices.
    … …  
    240246== Upgrade Notice ==
    241247
     248= 1.0.7 =
     249Mail your provider accepted is now labelled "Sent"; "Delivered", "Bounced" and "Spam complaint" appear when your provider reports back.
     250
    242251= 1.0.6 =
    243252Adds a link to rate the plugin on WordPress.org. No other changes.
Note: See TracChangeset for help on using the changeset viewer.