diff --git a/admin/class-emails-list-page.php b/admin/class-emails-list-page.php new file mode 100644 index 0000000..9e2e0ad --- /dev/null +++ b/admin/class-emails-list-page.php @@ -0,0 +1,172 @@ +get_recent_emails( $per_page, $offset ); + $total_emails = $queue->count_total_emails(); + $total_pages = ceil( $total_emails / $per_page ); + + ?> +
+ +
+ +| + | + | + | + | + | + | + |
|---|---|---|---|---|---|---|
| + + | +||||||
| id ); ?> | +to_email ); ?> | +
+ subject ); ?>
+ last_error ) ) : ?>
+ + last_error ); ?> + + + |
+ campaign_name ?? '-' ); ?> | ++ sent_at ) { + echo '✓ ' . esc_html__( 'Sent', 'robotstxt-smtp-newsletter' ) . ''; + } elseif ( $email->locked_at ) { + echo '⏳ ' . esc_html__( 'Processing', 'robotstxt-smtp-newsletter' ) . ''; + } elseif ( $email->attempts >= 3 ) { + echo '✗ ' . esc_html__( 'Failed', 'robotstxt-smtp-newsletter' ) . ''; + } else { + echo '⏸ ' . esc_html__( 'Pending', 'robotstxt-smtp-newsletter' ) . ''; + if ( $email->attempts > 0 ) { + echo sprintf( + ' (%s)', + sprintf( + /* translators: %d: number of retry attempts */ + esc_html__( 'Retry %d', 'robotstxt-smtp-newsletter' ), + absint( $email->attempts ) + ) + ); + } + } + ?> + | ++ created_at ); + echo esc_html( $created_time ); + ?> + | ++ sent_at ) { + $sent_time = mysql2date( 'Y-m-d H:i:s', $email->sent_at ); + echo esc_html( $sent_time ); + } else { + echo '-'; + } + ?> + | +
';
echo '' . $status_icon . ' ' . esc_html__( 'Settings Recommendations', 'robotstxt-smtp-newsletter' ) . '
';
echo '
';
- // Batch size recommendation.
if ( 'optimal' === $batch_status ) {
echo '✔ ' . sprintf(
/* translators: %d: batch size */
@@ -303,7 +290,7 @@ class Settings_Page {
if ( 'too_low' === $batch_status ) {
echo '
' . sprintf(
/* translators: %d: current batch size */
- esc_html__( 'Current (%d) is significantly lower than optimal. Increase it to send faster.', 'robotstxt-smtp-newsletter' ),
+ esc_html__( 'Current (%d) is significantly lower than optimal. Increase it to enqueue faster.', 'robotstxt-smtp-newsletter' ),
$current_batch
);
} elseif ( 'too_high' === $batch_status ) {
@@ -322,47 +309,7 @@ class Settings_Page {
}
}
- // Max per connection recommendation (only for SMTP).
- if ( ! $optimal['is_ses'] && $optimal['max_per_connection'] > 0 ) {
- echo '
';
- if ( 'optimal' === $max_conn_status ) {
- echo '✔ ' . sprintf(
- /* translators: %d: max per connection */
- esc_html__( 'Max per connection: Your current setting (%d) is optimal!', 'robotstxt-smtp-newsletter' ),
- $current_max_conn
- );
- } else {
- echo '► ' . sprintf(
- /* translators: %d: recommended max per connection */
- esc_html__( 'Recommended max per connection: %d emails', 'robotstxt-smtp-newsletter' ),
- $optimal['max_per_connection']
- );
-
- if ( 'too_low' === $max_conn_status ) {
- echo '
' . sprintf(
- /* translators: %d: current max per connection */
- esc_html__( 'Current (%d) is too low. Increase to reduce connection overhead.', 'robotstxt-smtp-newsletter' ),
- $current_max_conn
- );
- } elseif ( 'too_high' === $max_conn_status ) {
- echo '
' . sprintf(
- /* translators: %d: current max per connection */
- esc_html__( 'Current (%d) is too high and may cause SMTP timeouts. Reduce it.', 'robotstxt-smtp-newsletter' ),
- $current_max_conn
- );
- } elseif ( 'suboptimal' === $max_conn_status ) {
- echo '
' . sprintf(
- /* translators: 1: current max per connection, 2: recommended max per connection */
- esc_html__( 'Current (%1$d) could be optimized. Consider changing to %2$d.', 'robotstxt-smtp-newsletter' ),
- $current_max_conn,
- $optimal['max_per_connection']
- );
- }
- }
- }
-
echo '
- -
- - sync_from_queue(); + + // Get recent campaigns (last 5). + $campaigns = $stats->get_recent_campaigns( 5 ); ?> - -
-
-
+
+ + + +
+ + ++ +
+| + | + | + | + | + | + | + | + |
|---|---|---|---|---|---|---|---|
| + campaign_name ); ?> + finished_at ) : ?> + ⚠ + + | ++ started_at ) { + echo esc_html( mysql2date( 'Y-m-d H:i', $campaign->started_at ) ); + } else { + echo '-'; + } + ?> + | ++ finished_at ) { + echo esc_html( mysql2date( 'Y-m-d H:i', $campaign->finished_at ) ); + } else { + echo '' . esc_html__( 'In progress', 'robotstxt-smtp-newsletter' ) . ''; + } + ?> + | ++ total_emails ); ?> + | ++ sent_emails ); ?> + (%) + | ++ failed_emails > 0 ) : ?> + failed_emails ); ?> + + 0 + + | ++ duration_seconds ) { + $hours = floor( $campaign->duration_seconds / 3600 ); + $minutes = floor( ( $campaign->duration_seconds % 3600 ) / 60 ); + $seconds = $campaign->duration_seconds % 60; + + if ( $hours > 0 ) { + echo sprintf( '%dh %dm', $hours, $minutes ); + } elseif ( $minutes > 0 ) { + echo sprintf( '%dm %ds', $minutes, $seconds ); + } else { + echo sprintf( '%ds', $seconds ); + } + } else { + echo '-'; + } + ?> + | +
+ emails_per_hour ) {
+ echo '' . number_format_i18n( $campaign->emails_per_hour, 0 ) . ' /h';
+ if ( $campaign->emails_per_minute ) {
+ echo ' ' . number_format_i18n( $campaign->emails_per_minute, 1 ) . ' /min'; + } + } else { + echo '-'; + } + ?> + |
+
+ + + +
+ php 10 "w1"
+
+
+
+
+ seq 1 10 | xargs -P10 -I{} php 10 "w{}"
+
+
+ + + +
++ +
+| + | + | + |
|---|---|---|
| + | + | + + | +
| + | + | + + | +
| + | + | + + | +
| + | + | + + | +
+ +
+| + | + + | +
| + | + + | +
| + | + + | +
| + | + 0 ? ( $global['total_sent'] / $total ) * 100 : 0; + echo number_format_i18n( $rate, 1 ) . '%'; + ?> + | +
| + | + | + | + | + | + | + | + | + |
|---|---|---|---|---|---|---|---|---|
| + + | +||||||||
| campaign_name ); ?> | ++ total_emails ); ?> + | ++ sent_emails ); ?> + | ++ failed_emails ); ?> + | ++ started_at ) { + $started_time = mysql2date( 'Y-m-d H:i:s', $campaign->started_at ); + echo esc_html( $started_time ); + } else { + echo '-'; + } + ?> + | ++ finished_at ) { + $finished_time = mysql2date( 'Y-m-d H:i:s', $campaign->finished_at ); + echo esc_html( $finished_time ); + } else { + echo '' . esc_html__( 'In progress', 'robotstxt-smtp-newsletter' ) . ''; + } + ?> + | ++ duration_seconds ) { + $minutes = floor( $campaign->duration_seconds / 60 ); + $seconds = $campaign->duration_seconds % 60; + echo sprintf( '%dm %ds', absint( $minutes ), absint( $seconds ) ); + } else { + echo '-'; + } + ?> + | +
+ emails_per_hour ) {
+ echo number_format_i18n( $campaign->emails_per_hour, 0 ) . '/h '; + echo '' . number_format_i18n( $campaign->emails_per_minute, 1 ) . '/min'; + } else { + echo '-'; + } + ?> + |
+ + newsletter_id ) : ?> + + + - + + | +