v2.1.6
This commit is contained in:
parent
6269b77f13
commit
c2ead8e434
13 changed files with 800 additions and 251 deletions
|
|
@ -1,5 +1,25 @@
|
|||
== Changelog ==
|
||||
|
||||
= 2.1.6 =
|
||||
|
||||
_Release date: 2026-06-09_
|
||||
|
||||
**Added**
|
||||
|
||||
* Clear buttons for Access Key ID and Secret Access Key on the settings page. When a credential is stored, a "Clear access key" or "Clear secret key" button appears next to the field. Clicking it immediately removes the stored value, matching the same pattern used by the parent plugin for the SMTP password.
|
||||
|
||||
**Compatibility**
|
||||
|
||||
* WordPress: 5.7 - 7.1
|
||||
* PHP: 8.2 - 8.5
|
||||
|
||||
**Tests**
|
||||
|
||||
* PHP_CodeSniffer: 3.13.5
|
||||
* WordPress Coding Standards: 3.3.0
|
||||
* PHPCompatibility: 9.3.5
|
||||
* PHPStan: 2.2.2
|
||||
|
||||
= 2.1.5 =
|
||||
|
||||
_Release date: 2026-06-09_
|
||||
|
|
|
|||
151
docs/audit-pre-deploy-2.1.6.md
Normal file
151
docs/audit-pre-deploy-2.1.6.md
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
# Pre-Deploy AI Audit — v2.1.6
|
||||
|
||||
**Plugin slug:** robotstxt-smtp-amazonses
|
||||
**Version:** 2.1.6
|
||||
**Minimum PHP:** 8.2
|
||||
**Minimum WP:** 5.7
|
||||
**Architecture:** Single-class OOP, namespace `Robotstxt_SMTP_AmazonSES`
|
||||
**Exposes:** AJAX-style admin-post handlers, Settings API filter, WP-Cron hook
|
||||
**Target:** Private / commercial
|
||||
|
||||
**Audit scope:** Full diff from 5ee811d (initial tooling commit) to HEAD — covers all changes introduced in this session.
|
||||
|
||||
---
|
||||
|
||||
## 1. SECURITY
|
||||
|
||||
### 1.1 handle_clear_credential() — new in 2.1.6
|
||||
|
||||
- **File:** `includes/class-plugin.php:1793`
|
||||
- **Nonce:** `wp_verify_nonce()` with GET input via `wp_unslash()`. ✓
|
||||
- **Capability:** `current_user_can('manage_options')` / `manage_network_options` based on scope. ✓
|
||||
- **Scope validation:** `sanitize_key(wp_unslash($scope_raw))` before comparison. ✓
|
||||
- **Redirect:** `wp_safe_redirect(add_query_arg([...], admin_url('admin.php')))` — both `$page_slug` and `$cleared_key` are hardcoded literals, not from user input. ✓
|
||||
- **Option update:** uses `update_option()` / `update_site_option()` (WordPress API). ✓
|
||||
- **ABSPATH guard:** present in main file. ✓
|
||||
|
||||
### 1.2 display_clear_key_notice() — new in 2.1.6
|
||||
|
||||
- **File:** `includes/class-plugin.php:1861`
|
||||
- `FILTER_UNSAFE_RAW` used to read `robotstxt_smtp_amazonses_cleared`. Value is checked with strict equality (`'access_key'` / `'secret_key'`) before any output. Output escaped with `esc_html()`. No XSS path. ✓
|
||||
- Notice only rendered when `get_current_screen()->id` contains `'robotstxt-smtp'`. ✓
|
||||
|
||||
### 1.3 Credential validation change (2.1.5)
|
||||
|
||||
- **File:** `includes/class-plugin.php:1473–1537`
|
||||
- Blocking only on `InvalidClientTokenId`, `SignatureDoesNotMatch`, `InvalidAccessKeyId` — correct. AWS authentication errors that definitively prove wrong credentials.
|
||||
- All other `AwsException` errors (wrong region, missing IAM permission) and `Throwable` errors (network) now allow saving. `unset($exception)` used to satisfy PHPCS empty-catch requirement. ✓
|
||||
- No sensitive data exposed in error messages — access key masked in debug context. ✓
|
||||
|
||||
### 1.4 Reply-to clearing (2.1.5)
|
||||
|
||||
- **File:** `includes/class-plugin.php:1269`
|
||||
- `sanitize_email(trim($options['reply_to_email']))` before setting to empty. ✓
|
||||
- Only acts when key `reply_to_email` exists in submitted `$options`. ✓
|
||||
|
||||
### 1.5 Dependency check / missing parent notice (2.1.5)
|
||||
|
||||
- **File:** `robotstxt-smtp-amazonses.php:82`
|
||||
- Pure output using `esc_html__()`. No user input read. ✓
|
||||
- Registered on `admin_notices` and `network_admin_notices` only when parent class is absent. ✓
|
||||
|
||||
### 1.6 Previously existing code — no regressions found
|
||||
|
||||
- All form field renders use `esc_attr()` / `esc_html_e()`. ✓
|
||||
- `wp_nonce_field()` / `check_admin_referer()` not needed here (Settings API handles nonces for save; admin-post handlers use `wp_verify_nonce()`). ✓
|
||||
- No `eval()`, `base64_decode()`, `system()`, `exec()`, `unserialize()`, `extract()`. ✓
|
||||
- Direct file access prevention on all PHP files. ✓
|
||||
|
||||
---
|
||||
|
||||
## 2. ROBUSTNESS & FATAL ERRORS
|
||||
|
||||
- `handle_clear_credential()` sets `$this->clearing_field` before `add_filter()` and unconditionally clears it after `update_option()`. If `update_option()` fails (returns false, does not throw), the priority-11 filter is still removed. No filter leak risk. ✓
|
||||
- `force_clear_credential()` only acts when `$this->clearing_field !== null`. Safe to call even if left registered by accident. ✓
|
||||
- All new code requires PHP 8.2 (`?string` property type). Declared minimum matches. ✓
|
||||
- `plugin_loaded` → dependency check → class file included → `run()`: no class can be called before it's required. ✓
|
||||
- `load_plugin_textdomain()` registered on `init` from main file (not from class), so it fires even when parent plugin is absent and the notice needs translating. ✓
|
||||
|
||||
---
|
||||
|
||||
## 3. COMPATIBILITY & CONFLICTS
|
||||
|
||||
- Multisite: both `get_site_option()` / `update_site_option()` and `get_option()` / `update_option()` paths implemented. `is_network_admin()` used for scope detection in field render, mirroring the parent plugin's password-clear pattern. ✓
|
||||
- No assumptions about sidebars, widgets, or block themes. ✓
|
||||
- `Requires Plugins: robotstxt-smtp` header enforced by WP 6.5+; PHP-level fallback added for WP 5.7–6.4. ✓
|
||||
|
||||
---
|
||||
|
||||
## 4. WORDPRESS CODING STANDARDS
|
||||
|
||||
- All new functions prefixed with `robotstxt_smtp_amazonses_`. ✓
|
||||
- All new methods documented with `@since 2.1.6`. ✓
|
||||
- No logic in constructor. ✓
|
||||
- PHPCS passes with zero errors. ✓
|
||||
|
||||
---
|
||||
|
||||
## 5. INTERNATIONALIZATION
|
||||
|
||||
- `load_plugin_textdomain()` on `init`. ✓
|
||||
- `.pot` regenerated with `wp i18n make-pot` (WP-CLI 2.12.0). ✓
|
||||
- `es_ES` and `ca` translations complete: all new strings translated, fuzzy entries resolved. ✓
|
||||
- Textdomain literal string `'robotstxt-smtp-amazonses'` — no variables. ✓
|
||||
|
||||
---
|
||||
|
||||
## 6. PERFORMANCE
|
||||
|
||||
- No N+1 queries introduced. ✓
|
||||
- `delete_site_transient(get_quota_cache_key())` called after credential clear — avoids stale quota display. ✓
|
||||
- `$client_cache` keyed by `md5(access_key|secret_key|region)` — SES clients re-used within a request. ✓
|
||||
- All new admin-post handlers exit early on scope/nonce/capability failure before touching the DB. ✓
|
||||
|
||||
---
|
||||
|
||||
## 7. DATABASE & MIGRATIONS
|
||||
|
||||
- No custom tables. All data in parent plugin's option. ✓
|
||||
- `uninstall.php` delegates to parent plugin. ✓
|
||||
|
||||
---
|
||||
|
||||
## 8. ASSETS & FRONTEND
|
||||
|
||||
- No JS or CSS added. ✓
|
||||
- Clear buttons render as `<a class="button button-secondary">` — standard WP admin styling, no inline script. ✓
|
||||
- `esc_url(wp_nonce_url(...))` used for button href. ✓
|
||||
|
||||
---
|
||||
|
||||
## 9. DEVOPS / RELEASE ARTIFACTS
|
||||
|
||||
- Version consistent across plugin header, `ROBOTSTXT_SMTP_AMAZONSES_VERSION`, `readme.txt`, `update.json`. ✓
|
||||
- `Stable tag` matches `Version`. ✓
|
||||
- `changelog.txt` and `readme.txt` follow template (date, categories, Compatibility, Tests). ✓
|
||||
- `composer audit` — no CVEs. ✓
|
||||
- `bin/deploy.sh` excludes dev files, phpstan config, composer.json/lock, `.claude/`, `.git`. ✓
|
||||
|
||||
---
|
||||
|
||||
## 10. PUBLIC API & BACKWARD COMPATIBILITY
|
||||
|
||||
- New public methods: `handle_clear_access_key()`, `handle_clear_secret_key()`, `force_clear_credential()`, `display_clear_key_notice()`, `get_cached_ses_quota()`. All additive, no removals. ✓
|
||||
- `get_quota_cache_key()` remains public static — parent plugin accesses it. ✓
|
||||
- No changes to filter/action signatures. ✓
|
||||
- Removed: `apply_ses_quota_to_rate_limits()` — was unused private method. ✓
|
||||
|
||||
---
|
||||
|
||||
## WARNINGS
|
||||
|
||||
- **[WARNING] RESOLVED** `includes/class-plugin.php:1873` — `FILTER_UNSAFE_RAW` changed to `FILTER_SANITIZE_SPECIAL_CHARS` + `sanitize_key()` for the `robotstxt_smtp_amazonses_cleared` query parameter.
|
||||
|
||||
---
|
||||
|
||||
## FINAL EXECUTIVE SUMMARY
|
||||
|
||||
1. **Overall status:** ✅ PASS
|
||||
2. **Top mandatory fixes before tagging:** None. All [CRITICAL] issues: 0.
|
||||
3. **Estimated security risk:** Low.
|
||||
4. **Version recommendation:** Safe to mark as stable.
|
||||
108
docs/deploy-checklist-2.1.6.md
Normal file
108
docs/deploy-checklist-2.1.6.md
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
# PRE-DEPLOY CHECKLIST — Version 2.1.6
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
PRE-DEPLOY CHECKLIST — Version 2.1.6
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
||||
INPUT VALIDATION
|
||||
[x] Empty field validation performed
|
||||
[x] Length limits validated server-side
|
||||
[x] Format patterns validated (regex, ctype_alnum, preg_match)
|
||||
[x] Safelist validation used for finite option sets — scope param uses sanitize_key() + strict equality
|
||||
[x] Strict type checking used (===, in_array with true parameter)
|
||||
[x] Validation performed BEFORE any action or processing
|
||||
[x] Helper functions used: is_email(), sanitize_key()
|
||||
|
||||
INPUT SANITIZATION
|
||||
[x] sanitize_text_field() for single-line text — credentials
|
||||
[x] sanitize_textarea_field() for multi-line text — n/a
|
||||
[x] sanitize_email() for email addresses — reply_to_email
|
||||
[x] sanitize_key() for keys/identifiers — scope, cleared_key params
|
||||
[x] sanitize_url() for URLs — n/a (no URL inputs)
|
||||
[x] sanitize_file_name() for filenames — n/a
|
||||
[x] wp_kses() / wp_kses_post() for HTML content — n/a
|
||||
|
||||
OUTPUT ESCAPING (Escape Late)
|
||||
[x] esc_html() for HTML element content
|
||||
[x] esc_attr() for HTML attributes — field names, placeholder text
|
||||
[x] esc_url() for all URLs (src, href) — wp_nonce_url() output + esc_url()
|
||||
[x] esc_js() for inline JavaScript — n/a
|
||||
[x] Combined i18n+escape functions (esc_html__(), esc_attr_e())
|
||||
[x] Escaping performed at output time, not before storage
|
||||
|
||||
CSRF PROTECTION (Nonces)
|
||||
[x] wp_nonce_url() used for clear credential action links
|
||||
[x] wp_verify_nonce() verifies the clear credential handlers (GET via admin-post.php)
|
||||
[x] Nonce action strings are specific ('robotstxt_smtp_amazonses_clear_access_key', 'robotstxt_smtp_amazonses_clear_secret_key')
|
||||
[x] Nonces NOT relied upon for authentication/authorization — capability checks are separate
|
||||
|
||||
DATABASE SECURITY
|
||||
[x] WordPress API functions used — update_option(), update_site_option(), get_option(), get_site_option()
|
||||
[x] No custom SQL queries
|
||||
[x] No direct $_POST/$_GET interpolation in DB operations
|
||||
|
||||
CAPABILITY CHECKS
|
||||
[x] current_user_can() on every admin action — handle_clear_credential() checks manage_options / manage_network_options
|
||||
[x] current_user_can() on every AJAX/admin-post handler
|
||||
[x] Capability checks in execution logic (reject if no permission — wp_die())
|
||||
[x] Appropriate capability selected
|
||||
|
||||
FILE OPERATIONS
|
||||
[x] Direct file access prevention on all PHP files (ABSPATH guard)
|
||||
|
||||
DANGEROUS FUNCTIONS
|
||||
[x] No eval() usage
|
||||
[x] No suspicious base64_decode()
|
||||
[x] No system(), exec(), shell_exec(), passthru()
|
||||
[x] No create_function() (use anonymous functions)
|
||||
[x] No extract() on untrusted data
|
||||
[x] No unserialize() on untrusted data
|
||||
|
||||
CODE QUALITY & STANDARDS
|
||||
[x] PHPCS passes with zero errors (WordPress-Core, WordPress-Docs, WordPress-Extra)
|
||||
[x] PHPStan level 9 passes with zero errors on all modified files
|
||||
[x] PHPCompatibility scan run — 8.2-8.5 PASSED
|
||||
[x] Minimum PHP version in headers reflects real lowest compatible version (8.2 — AWS SDK)
|
||||
[x] All user-facing strings use translation functions (textdomain = 'robotstxt-smtp-amazonses')
|
||||
[x] phpDoc added for all new public methods/hooks with @since 2.1.6
|
||||
|
||||
DEBUG & TESTING
|
||||
[x] Browser console — no new JS introduced
|
||||
[x] composer audit — no CVEs found
|
||||
[x] No PHP notices, warnings, or deprecated messages expected
|
||||
|
||||
VERSIONING & DOCUMENTATION
|
||||
[x] Plugin version bumped in main plugin file header — 2.1.6
|
||||
[x] CHANGELOG.md / changelog.txt updated
|
||||
[x] readme.txt updated — last 3 versions shown (2.1.4, 2.1.5, 2.1.6)
|
||||
[x] Stable tag in readme.txt matches Version in plugin header — both 2.1.6
|
||||
[x] Required headers present, forbidden headers absent
|
||||
[x] update.json version and download_url updated
|
||||
|
||||
DATABASE & UNINSTALL
|
||||
[x] No DB schema changes in this version
|
||||
[x] uninstall.php delegates to parent plugin
|
||||
|
||||
AI AUDIT
|
||||
[x] Pre-deploy AI audit executed — docs/audit-pre-deploy-2.1.6.md
|
||||
[x] All [CRITICAL] findings resolved — none found
|
||||
[x] [WARNING] finding documented and resolved (FILTER_UNSAFE_RAW → FILTER_SANITIZE_SPECIAL_CHARS + sanitize_key)
|
||||
[x] Executive summary: PASS
|
||||
[x] Security risk assessed as: Low
|
||||
|
||||
BUILD & ARTIFACT
|
||||
[x] deploy.sh executed manually
|
||||
[x] ZIP generated in parent directory (wp-content/plugins/)
|
||||
[x] ZIP excludes: vendor/ dev deps, tests, CI config, .git, phpstan.neon, composer.json, CLAUDE.md, AGENTS.md
|
||||
[x] Production dependencies bundled (AWS SDK + runtime deps only)
|
||||
[x] License compatibility verified — GPLv3, AWS SDK Apache-2.0 (GPL-compatible)
|
||||
|
||||
═══════════════════════════════════════════════════════════════
|
||||
DEPLOY AUTHORIZATION
|
||||
═══════════════════════════════════════════════════════════════
|
||||
All [CRITICAL] items resolved: YES
|
||||
Executive summary status: PASS
|
||||
Security risk level: Low
|
||||
|
||||
Manual approval confirmed: [x] YES
|
||||
═══════════════════════════════════════════════════════════════
|
||||
|
|
@ -72,6 +72,16 @@ class Plugin {
|
|||
*/
|
||||
private array $client_cache = array();
|
||||
|
||||
/**
|
||||
* Credential field being force-cleared during a direct option update.
|
||||
*
|
||||
* Set only for the duration of handle_clear_credential() to bypass the
|
||||
* keep-existing logic in sanitize_settings() via a priority-11 filter.
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
private ?string $clearing_field = null;
|
||||
|
||||
/**
|
||||
* Retrieves the instance.
|
||||
*
|
||||
|
|
@ -100,6 +110,10 @@ class Plugin {
|
|||
\add_action( 'admin_init', array( $this, 'handle_refresh_quota_request' ) );
|
||||
\add_action( 'admin_notices', array( $this, 'display_admin_notices' ) );
|
||||
\add_action( 'network_admin_notices', array( $this, 'display_admin_notices' ) );
|
||||
\add_action( 'admin_post_robotstxt_smtp_amazonses_clear_access_key', array( $this, 'handle_clear_access_key' ) );
|
||||
\add_action( 'admin_post_robotstxt_smtp_amazonses_clear_secret_key', array( $this, 'handle_clear_secret_key' ) );
|
||||
\add_action( 'admin_notices', array( $this, 'display_clear_key_notice' ) );
|
||||
\add_action( 'network_admin_notices', array( $this, 'display_clear_key_notice' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1025,7 +1039,8 @@ class Plugin {
|
|||
public function render_access_key_field(): void {
|
||||
$settings = $this->get_stored_settings();
|
||||
$has_access_key = '' !== $settings[ self::OPTION_ACCESS_KEY ];
|
||||
$placeholder_label = $has_access_key ? \__( 'Leave empty to keep the stored access key.', 'robotstxt-smtp-amazonses' ) : '';
|
||||
$placeholder = $has_access_key ? \__( 'Leave empty to keep the stored access key.', 'robotstxt-smtp-amazonses' ) : '';
|
||||
$scope = \is_network_admin() ? 'network' : 'site';
|
||||
?>
|
||||
<input
|
||||
name="<?php echo \esc_attr( $this->get_field_name( self::OPTION_ACCESS_KEY ) ); ?>"
|
||||
|
|
@ -1034,8 +1049,28 @@ class Plugin {
|
|||
class="regular-text"
|
||||
value=""
|
||||
autocomplete="off"
|
||||
placeholder="<?php echo \esc_attr( $placeholder_label ); ?>"
|
||||
placeholder="<?php echo \esc_attr( $placeholder ); ?>"
|
||||
/>
|
||||
<?php if ( $has_access_key ) : ?>
|
||||
<a href="
|
||||
<?php
|
||||
echo \esc_url(
|
||||
\wp_nonce_url(
|
||||
\add_query_arg(
|
||||
array(
|
||||
'action' => 'robotstxt_smtp_amazonses_clear_access_key',
|
||||
'robotstxt_smtp_scope' => $scope,
|
||||
),
|
||||
\admin_url( 'admin-post.php' )
|
||||
),
|
||||
'robotstxt_smtp_amazonses_clear_access_key'
|
||||
)
|
||||
);
|
||||
?>
|
||||
" class="button button-secondary" style="margin-left: 6px;">
|
||||
<?php \esc_html_e( 'Clear access key', 'robotstxt-smtp-amazonses' ); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
<p class="description"><?php \esc_html_e( 'Provide the IAM access key ID with permissions to send email through Amazon SES. Leave the field empty to retain the existing value.', 'robotstxt-smtp-amazonses' ); ?></p>
|
||||
<?php
|
||||
}
|
||||
|
|
@ -1048,7 +1083,8 @@ class Plugin {
|
|||
public function render_secret_key_field(): void {
|
||||
$settings = $this->get_stored_settings();
|
||||
$has_secret_key = '' !== $settings[ self::OPTION_SECRET_KEY ];
|
||||
$placeholder_label = $has_secret_key ? \__( 'Leave empty to keep the stored secret access key.', 'robotstxt-smtp-amazonses' ) : '';
|
||||
$placeholder = $has_secret_key ? \__( 'Leave empty to keep the stored secret access key.', 'robotstxt-smtp-amazonses' ) : '';
|
||||
$scope = \is_network_admin() ? 'network' : 'site';
|
||||
?>
|
||||
<input
|
||||
name="<?php echo \esc_attr( $this->get_field_name( self::OPTION_SECRET_KEY ) ); ?>"
|
||||
|
|
@ -1057,8 +1093,28 @@ class Plugin {
|
|||
class="regular-text"
|
||||
value=""
|
||||
autocomplete="new-password"
|
||||
placeholder="<?php echo \esc_attr( $placeholder_label ); ?>"
|
||||
placeholder="<?php echo \esc_attr( $placeholder ); ?>"
|
||||
/>
|
||||
<?php if ( $has_secret_key ) : ?>
|
||||
<a href="
|
||||
<?php
|
||||
echo \esc_url(
|
||||
\wp_nonce_url(
|
||||
\add_query_arg(
|
||||
array(
|
||||
'action' => 'robotstxt_smtp_amazonses_clear_secret_key',
|
||||
'robotstxt_smtp_scope' => $scope,
|
||||
),
|
||||
\admin_url( 'admin-post.php' )
|
||||
),
|
||||
'robotstxt_smtp_amazonses_clear_secret_key'
|
||||
)
|
||||
);
|
||||
?>
|
||||
" class="button button-secondary" style="margin-left: 6px;">
|
||||
<?php \esc_html_e( 'Clear secret key', 'robotstxt-smtp-amazonses' ); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
<p class="description"><?php \esc_html_e( 'Enter the secret access key associated with the IAM user. Leave the field empty to retain the existing value.', 'robotstxt-smtp-amazonses' ); ?></p>
|
||||
<?php
|
||||
}
|
||||
|
|
@ -1685,4 +1741,157 @@ class Plugin {
|
|||
$result = \get_site_transient( self::get_quota_cache_key() );
|
||||
return is_array( $result ) ? $result : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the request to clear the stored Access Key ID.
|
||||
*
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle_clear_access_key(): void {
|
||||
$this->handle_clear_credential(
|
||||
self::OPTION_ACCESS_KEY,
|
||||
'robotstxt_smtp_amazonses_clear_access_key',
|
||||
'access_key'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the request to clear the stored Secret Access Key.
|
||||
*
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle_clear_secret_key(): void {
|
||||
$this->handle_clear_credential(
|
||||
self::OPTION_SECRET_KEY,
|
||||
'robotstxt_smtp_amazonses_clear_secret_key',
|
||||
'secret_key'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears a stored AWS credential from the settings option.
|
||||
*
|
||||
* Uses a priority-11 filter on `robotstxt_smtp_sanitized_options` to override
|
||||
* the keep-existing logic in sanitize_settings() (priority 10) during the direct
|
||||
* option update, matching the same pattern used by the parent plugin for the SMTP
|
||||
* password.
|
||||
*
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @param string $field Settings key to clear (OPTION_ACCESS_KEY or OPTION_SECRET_KEY).
|
||||
* @param string $nonce_action Nonce action string for this specific clear request.
|
||||
* @param string $cleared_key Value used in the success redirect query parameter.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function handle_clear_credential( string $field, string $nonce_action, string $cleared_key ): void {
|
||||
$nonce_raw = \filter_input( INPUT_GET, '_wpnonce', FILTER_UNSAFE_RAW );
|
||||
$nonce = is_string( $nonce_raw ) ? (string) \wp_unslash( $nonce_raw ) : '';
|
||||
|
||||
if ( ! \wp_verify_nonce( $nonce, $nonce_action ) ) {
|
||||
\wp_die( \esc_html__( 'The link you followed has expired.', 'robotstxt-smtp-amazonses' ) );
|
||||
}
|
||||
|
||||
$scope_raw = \filter_input( INPUT_GET, 'robotstxt_smtp_scope', FILTER_UNSAFE_RAW );
|
||||
$is_network = ROBOTSTXT_SMTP_IS_MULTISITE
|
||||
&& is_string( $scope_raw )
|
||||
&& 'network' === \sanitize_key( \wp_unslash( $scope_raw ) )
|
||||
&& Settings_Page::is_network_mode_enabled();
|
||||
|
||||
$required_cap = $is_network ? 'manage_network_options' : 'manage_options';
|
||||
if ( ! \current_user_can( $required_cap ) ) {
|
||||
\wp_die( \esc_html__( 'You do not have sufficient permissions to access this page.', 'robotstxt-smtp-amazonses' ) );
|
||||
}
|
||||
|
||||
if ( $is_network ) {
|
||||
$settings = \get_site_option( Settings_Page::NETWORK_OPTION_NAME, array() );
|
||||
$settings = is_array( $settings ) ? $settings : array();
|
||||
$settings[ $field ] = '';
|
||||
\update_site_option( Settings_Page::NETWORK_OPTION_NAME, $settings );
|
||||
$redirect_base = \network_admin_url( 'admin.php' );
|
||||
$page_slug = 'robotstxt-smtp-network';
|
||||
} else {
|
||||
$settings = \get_option( Settings_Page::OPTION_NAME, array() );
|
||||
$settings = is_array( $settings ) ? $settings : array();
|
||||
$settings[ $field ] = '';
|
||||
// sanitize_settings() at priority 10 preserves the existing value when the
|
||||
// submitted field is empty. Hook at priority 11 to force the empty value after it.
|
||||
$this->clearing_field = $field;
|
||||
\add_filter( 'robotstxt_smtp_sanitized_options', array( $this, 'force_clear_credential' ), 11, 1 );
|
||||
\update_option( Settings_Page::OPTION_NAME, $settings );
|
||||
\remove_filter( 'robotstxt_smtp_sanitized_options', array( $this, 'force_clear_credential' ), 11 );
|
||||
$this->clearing_field = null;
|
||||
$redirect_base = \admin_url( 'admin.php' );
|
||||
$page_slug = 'robotstxt-smtp';
|
||||
}
|
||||
|
||||
\delete_site_transient( self::get_quota_cache_key() );
|
||||
|
||||
\wp_safe_redirect(
|
||||
\add_query_arg(
|
||||
array(
|
||||
'page' => $page_slug,
|
||||
'robotstxt_smtp_amazonses_cleared' => $cleared_key,
|
||||
),
|
||||
$redirect_base
|
||||
)
|
||||
);
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces a credential field to empty string during a direct option update.
|
||||
*
|
||||
* Runs at priority 11, after sanitize_settings() at priority 10, and overrides
|
||||
* its keep-existing logic. Only active during handle_clear_credential().
|
||||
*
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @param array<string, mixed> $clean Sanitized option values.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function force_clear_credential( array $clean ): array {
|
||||
if ( null !== $this->clearing_field ) {
|
||||
$clean[ $this->clearing_field ] = '';
|
||||
}
|
||||
return $clean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a success notice after an AWS credential has been cleared.
|
||||
*
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function display_clear_key_notice(): void {
|
||||
$cleared_raw = \filter_input( INPUT_GET, 'robotstxt_smtp_amazonses_cleared', FILTER_SANITIZE_SPECIAL_CHARS );
|
||||
$cleared_raw = is_string( $cleared_raw ) ? \sanitize_key( $cleared_raw ) : '';
|
||||
if ( '' === $cleared_raw ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$screen = \get_current_screen();
|
||||
if ( null === $screen || false === strpos( $screen->id, 'robotstxt-smtp' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( 'access_key' === $cleared_raw ) {
|
||||
$message = \__( 'The Amazon SES Access Key ID has been cleared.', 'robotstxt-smtp-amazonses' );
|
||||
} elseif ( 'secret_key' === $cleared_raw ) {
|
||||
$message = \__( 'The Amazon SES Secret Access Key has been cleared.', 'robotstxt-smtp-amazonses' );
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
printf(
|
||||
'<div class="notice notice-success is-dismissible"><p>%s</p></div>',
|
||||
\esc_html( $message )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -3,7 +3,7 @@ msgstr ""
|
|||
"Project-Id-Version: SMTP (by ROBOTSTXT) Amazon SES\n"
|
||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
||||
"amazonses\n"
|
||||
"POT-Creation-Date: 2026-06-09T10:41:00+00:00\n"
|
||||
"POT-Creation-Date: 2026-06-09T12:37:13+00:00\n"
|
||||
"PO-Revision-Date: 2026-01-29 09:30+0100\n"
|
||||
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
||||
"Language-Team: Catalan\n"
|
||||
|
|
@ -43,107 +43,112 @@ msgstr ""
|
|||
msgid "Security check failed"
|
||||
msgstr "Ha fallat la comprovació de seguretat"
|
||||
|
||||
#: class-robotstxt-updater.php:384 includes/class-plugin.php:918
|
||||
#: class-robotstxt-updater.php:384 includes/class-plugin.php:932
|
||||
#: includes/class-plugin.php:1807
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr "No tens permisos suficients per accedir a aquesta pàgina."
|
||||
|
||||
#: includes/class-plugin.php:149
|
||||
#: includes/class-plugin.php:163
|
||||
msgid "Amazon SES could not send the email because no recipient was provided."
|
||||
msgstr ""
|
||||
"Amazon SES no ha pogut enviar l'email perquè no s'ha proporcionat cap "
|
||||
"destinatari."
|
||||
|
||||
#. translators: %s: Error details describing the email preparation failure.
|
||||
#: includes/class-plugin.php:231
|
||||
#: includes/class-plugin.php:245
|
||||
#, php-format
|
||||
msgid "Amazon SES could not prepare the email: %s"
|
||||
msgstr "Amazon SES no ha pogut preparar l'email: %s"
|
||||
|
||||
#. translators: %s: Error message returned by Amazon SES.
|
||||
#: includes/class-plugin.php:275
|
||||
#: includes/class-plugin.php:289
|
||||
#, php-format
|
||||
msgid "Amazon SES could not send the email: %s"
|
||||
msgstr "Amazon SES no ha pogut enviar l'email: %s"
|
||||
|
||||
#. translators: %s: Error message describing the unexpected failure.
|
||||
#: includes/class-plugin.php:295
|
||||
#: includes/class-plugin.php:309
|
||||
#, php-format
|
||||
msgid "An unexpected error occurred while sending through Amazon SES: %s"
|
||||
msgstr "S'ha produït un error inesperat en enviar a través d'Amazon SES: %s"
|
||||
|
||||
#. translators: %s: Error details describing why the From header is invalid.
|
||||
#: includes/class-plugin.php:357
|
||||
#: includes/class-plugin.php:371
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the \"From\" address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça \"De\": %s"
|
||||
|
||||
#. translators: %s: Invalid recipient email address.
|
||||
#: includes/class-plugin.php:378
|
||||
#: includes/class-plugin.php:392
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the recipient address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça del destinatari: %s"
|
||||
|
||||
#. translators: %s: Invalid CC email address.
|
||||
#: includes/class-plugin.php:400
|
||||
#: includes/class-plugin.php:414
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the CC address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça CC: %s"
|
||||
|
||||
#. translators: %s: Invalid BCC email address.
|
||||
#: includes/class-plugin.php:422
|
||||
#: includes/class-plugin.php:436
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the BCC address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça CCO: %s"
|
||||
|
||||
#. translators: %s: Invalid reply-to email address.
|
||||
#: includes/class-plugin.php:444
|
||||
#: includes/class-plugin.php:458
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the reply-to address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça de resposta: %s"
|
||||
|
||||
#. translators: %s: Invalid reply-to email address from settings.
|
||||
#: includes/class-plugin.php:473
|
||||
#: includes/class-plugin.php:487
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the configured reply-to address: %s"
|
||||
msgstr "Amazon SES ha rebutjat l'adreça de resposta configurada: %s"
|
||||
|
||||
#. translators: %s: Attachment path that could not be added.
|
||||
#: includes/class-plugin.php:524
|
||||
#: includes/class-plugin.php:538
|
||||
#, php-format
|
||||
msgid "Amazon SES could not include the attachment: %s"
|
||||
msgstr "Amazon SES no ha pogut incloure l'adjunt: %s"
|
||||
|
||||
#: includes/class-plugin.php:910
|
||||
#: includes/class-plugin.php:924
|
||||
msgid "Security check failed."
|
||||
msgstr "Ha fallat la comprovació de seguretat."
|
||||
|
||||
#: includes/class-plugin.php:931
|
||||
#: includes/class-plugin.php:945
|
||||
msgid "Amazon SES quotas refreshed successfully."
|
||||
msgstr "Quotes d'Amazon SES actualitzades correctament."
|
||||
|
||||
#: includes/class-plugin.php:938
|
||||
#: includes/class-plugin.php:952
|
||||
msgid "Unable to fetch quotas from Amazon SES. Check debug log for details."
|
||||
msgstr ""
|
||||
"No s'han pogut obtenir les quotes d'Amazon SES. Verifica el registre de "
|
||||
"depuració per a més detalls."
|
||||
|
||||
#: includes/class-plugin.php:977
|
||||
#: includes/class-plugin.php:991
|
||||
msgid "Access Key ID"
|
||||
msgstr "ID de clau d'accés"
|
||||
|
||||
#: includes/class-plugin.php:983
|
||||
#: includes/class-plugin.php:997
|
||||
msgid "Secret Access Key"
|
||||
msgstr "Clau d'accés secreta"
|
||||
|
||||
#: includes/class-plugin.php:989
|
||||
#: includes/class-plugin.php:1003
|
||||
msgid "Region"
|
||||
msgstr "Regió"
|
||||
|
||||
#: includes/class-plugin.php:1028
|
||||
#: includes/class-plugin.php:1042
|
||||
msgid "Leave empty to keep the stored access key."
|
||||
msgstr "Deixar buit per mantenir la clau d'accés emmagatzemada."
|
||||
|
||||
#: includes/class-plugin.php:1039
|
||||
#: includes/class-plugin.php:1071
|
||||
msgid "Clear access key"
|
||||
msgstr "Elimina la clau d'accés"
|
||||
|
||||
#: includes/class-plugin.php:1074
|
||||
msgid ""
|
||||
"Provide the IAM access key ID with permissions to send email through Amazon "
|
||||
"SES. Leave the field empty to retain the existing value."
|
||||
|
|
@ -151,11 +156,15 @@ msgstr ""
|
|||
"Proporciona l'ID de clau d'accés IAM amb permisos per enviar email a través "
|
||||
"d'Amazon SES. Deixa el camp buit per mantenir el valor existent."
|
||||
|
||||
#: includes/class-plugin.php:1051
|
||||
#: includes/class-plugin.php:1086
|
||||
msgid "Leave empty to keep the stored secret access key."
|
||||
msgstr "Deixar buit per mantenir la clau d'accés secreta emmagatzemada."
|
||||
|
||||
#: includes/class-plugin.php:1062
|
||||
#: includes/class-plugin.php:1115
|
||||
msgid "Clear secret key"
|
||||
msgstr "Elimina la clau d'accés secreta"
|
||||
|
||||
#: includes/class-plugin.php:1118
|
||||
msgid ""
|
||||
"Enter the secret access key associated with the IAM user. Leave the field "
|
||||
"empty to retain the existing value."
|
||||
|
|
@ -163,19 +172,19 @@ msgstr ""
|
|||
"Introdueix la clau d'accés secreta associada amb l'usuari IAM. Deixa el camp "
|
||||
"buit per mantenir el valor existent."
|
||||
|
||||
#: includes/class-plugin.php:1077
|
||||
#: includes/class-plugin.php:1133
|
||||
msgid "Select a region"
|
||||
msgstr "Selecciona una regió"
|
||||
|
||||
#: includes/class-plugin.php:1082
|
||||
#: includes/class-plugin.php:1138
|
||||
msgid "Choose the AWS region where your Amazon SES account is hosted."
|
||||
msgstr "Tria la regió d'AWS on està allotjat el teu compte d'Amazon SES."
|
||||
|
||||
#: includes/class-plugin.php:1160
|
||||
#: includes/class-plugin.php:1216
|
||||
msgid "The selected Amazon SES region is not available."
|
||||
msgstr "La regió d'Amazon SES seleccionada no està disponible."
|
||||
|
||||
#: includes/class-plugin.php:1176
|
||||
#: includes/class-plugin.php:1232
|
||||
msgid ""
|
||||
"Amazon SES credentials were not saved. Provide an access key, secret key, "
|
||||
"and region."
|
||||
|
|
@ -183,169 +192,181 @@ msgstr ""
|
|||
"Les credencials d'Amazon SES no s'han desat. Proporciona una clau d'accés, "
|
||||
"clau secreta i regió."
|
||||
|
||||
#: includes/class-plugin.php:1200
|
||||
#: includes/class-plugin.php:1256
|
||||
msgid "Amazon SES credentials verified successfully."
|
||||
msgstr "Credencials d'Amazon SES verificades correctament."
|
||||
|
||||
#: includes/class-plugin.php:1411
|
||||
#: includes/class-plugin.php:1467
|
||||
msgid "US East (Ohio)"
|
||||
msgstr "EUA Est (Ohio)"
|
||||
|
||||
#: includes/class-plugin.php:1412
|
||||
#: includes/class-plugin.php:1468
|
||||
msgid "US East (N. Virginia)"
|
||||
msgstr "EUA Est (N. Virgínia)"
|
||||
|
||||
#: includes/class-plugin.php:1413
|
||||
#: includes/class-plugin.php:1469
|
||||
msgid "US West (N. California)"
|
||||
msgstr "EUA Oest (N. Califòrnia)"
|
||||
|
||||
#: includes/class-plugin.php:1414
|
||||
#: includes/class-plugin.php:1470
|
||||
msgid "US West (Oregon)"
|
||||
msgstr "EUA Oest (Oregon)"
|
||||
|
||||
#: includes/class-plugin.php:1415
|
||||
#: includes/class-plugin.php:1471
|
||||
msgid "Africa (Cape Town)"
|
||||
msgstr "Àfrica (Ciutat del Cap)"
|
||||
|
||||
#: includes/class-plugin.php:1416
|
||||
#: includes/class-plugin.php:1472
|
||||
msgid "Asia Pacific (Hyderabad)"
|
||||
msgstr "Àsia Pacífic (Hyderabad)"
|
||||
|
||||
#: includes/class-plugin.php:1417
|
||||
#: includes/class-plugin.php:1473
|
||||
msgid "Asia Pacific (Jakarta)"
|
||||
msgstr "Àsia Pacífic (Jakarta)"
|
||||
|
||||
#: includes/class-plugin.php:1418
|
||||
#: includes/class-plugin.php:1474
|
||||
msgid "Asia Pacific (Mumbai)"
|
||||
msgstr "Àsia Pacífic (Mumbai)"
|
||||
|
||||
#: includes/class-plugin.php:1419
|
||||
#: includes/class-plugin.php:1475
|
||||
msgid "Asia Pacific (Osaka)"
|
||||
msgstr "Àsia Pacífic (Osaka)"
|
||||
|
||||
#: includes/class-plugin.php:1420
|
||||
#: includes/class-plugin.php:1476
|
||||
msgid "Asia Pacific (Seoul)"
|
||||
msgstr "Àsia Pacífic (Seül)"
|
||||
|
||||
#: includes/class-plugin.php:1421
|
||||
#: includes/class-plugin.php:1477
|
||||
msgid "Asia Pacific (Singapore)"
|
||||
msgstr "Àsia Pacífic (Singapur)"
|
||||
|
||||
#: includes/class-plugin.php:1422
|
||||
#: includes/class-plugin.php:1478
|
||||
msgid "Asia Pacific (Sydney)"
|
||||
msgstr "Àsia Pacífic (Sydney)"
|
||||
|
||||
#: includes/class-plugin.php:1423
|
||||
#: includes/class-plugin.php:1479
|
||||
msgid "Asia Pacific (Tokyo)"
|
||||
msgstr "Àsia Pacífic (Tòquio)"
|
||||
|
||||
#: includes/class-plugin.php:1424
|
||||
#: includes/class-plugin.php:1480
|
||||
msgid "Canada (Central)"
|
||||
msgstr "Canadà (Central)"
|
||||
|
||||
#: includes/class-plugin.php:1425
|
||||
#: includes/class-plugin.php:1481
|
||||
msgid "Europe (Frankfurt)"
|
||||
msgstr "Europa (Frankfurt)"
|
||||
|
||||
#: includes/class-plugin.php:1426
|
||||
#: includes/class-plugin.php:1482
|
||||
msgid "Europe (Ireland)"
|
||||
msgstr "Europa (Irlanda)"
|
||||
|
||||
#: includes/class-plugin.php:1427
|
||||
#: includes/class-plugin.php:1483
|
||||
msgid "Europe (London)"
|
||||
msgstr "Europa (Londres)"
|
||||
|
||||
#: includes/class-plugin.php:1428
|
||||
#: includes/class-plugin.php:1484
|
||||
msgid "Europe (Milan)"
|
||||
msgstr "Europa (Milà)"
|
||||
|
||||
#: includes/class-plugin.php:1429
|
||||
#: includes/class-plugin.php:1485
|
||||
msgid "Europe (Paris)"
|
||||
msgstr "Europa (París)"
|
||||
|
||||
#: includes/class-plugin.php:1430
|
||||
#: includes/class-plugin.php:1486
|
||||
msgid "Europe (Stockholm)"
|
||||
msgstr "Europa (Estocolm)"
|
||||
|
||||
#: includes/class-plugin.php:1431
|
||||
#: includes/class-plugin.php:1487
|
||||
msgid "Europe (Zurich)"
|
||||
msgstr "Europa (Zuric)"
|
||||
|
||||
#: includes/class-plugin.php:1432
|
||||
#: includes/class-plugin.php:1488
|
||||
msgid "Israel (Tel Aviv)"
|
||||
msgstr "Israel (Tel Aviv)"
|
||||
|
||||
#: includes/class-plugin.php:1433
|
||||
#: includes/class-plugin.php:1489
|
||||
msgid "Middle East (Bahrain)"
|
||||
msgstr "Orient Mitjà (Bahrain)"
|
||||
|
||||
#: includes/class-plugin.php:1434
|
||||
#: includes/class-plugin.php:1490
|
||||
msgid "Middle East (UAE)"
|
||||
msgstr "Orient Mitjà (EAU)"
|
||||
|
||||
#: includes/class-plugin.php:1435
|
||||
#: includes/class-plugin.php:1491
|
||||
msgid "South America (São Paulo)"
|
||||
msgstr "Sud-amèrica (São Paulo)"
|
||||
|
||||
#: includes/class-plugin.php:1436
|
||||
#: includes/class-plugin.php:1492
|
||||
msgid "AWS GovCloud (US-East)"
|
||||
msgstr "AWS GovCloud (EUA-Est)"
|
||||
|
||||
#: includes/class-plugin.php:1437
|
||||
#: includes/class-plugin.php:1493
|
||||
msgid "AWS GovCloud (US-West)"
|
||||
msgstr "AWS GovCloud (EUA-Oest)"
|
||||
|
||||
#. translators: 1: AWS region display name. 2: AWS region code.
|
||||
#: includes/class-plugin.php:1452
|
||||
#: includes/class-plugin.php:1508
|
||||
#, php-format
|
||||
msgid "%1$s (%2$s)"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. translators: %s: AWS region code.
|
||||
#: includes/class-plugin.php:1468
|
||||
#: includes/class-plugin.php:1524
|
||||
#, php-format
|
||||
msgid "Region %s"
|
||||
msgstr "Regió %s"
|
||||
|
||||
#. translators: %s: Error message from Amazon SES.
|
||||
#: includes/class-plugin.php:1509
|
||||
#: includes/class-plugin.php:1565
|
||||
#, php-format
|
||||
msgid "Invalid Amazon SES credentials: %s"
|
||||
msgstr "Credencials d'Amazon SES invàlides: %s"
|
||||
|
||||
#: includes/class-plugin.php:1574 includes/class-plugin.php:1596
|
||||
#: includes/class-plugin.php:1630 includes/class-plugin.php:1652
|
||||
msgid "Amazon SES credentials are not configured."
|
||||
msgstr "Les credencials d'Amazon SES no estan configurades."
|
||||
|
||||
#: includes/class-plugin.php:1610
|
||||
#: includes/class-plugin.php:1666
|
||||
msgid "Amazon SES did not return quota data."
|
||||
msgstr "Amazon SES no ha retornat dades de quota."
|
||||
|
||||
#: includes/class-plugin.php:1632
|
||||
#: includes/class-plugin.php:1688
|
||||
msgid "Cannot fetch SES quotas: IAM user lacks ses:GetAccount permission."
|
||||
msgstr ""
|
||||
"No es poden obtenir les quotes de SES: l'usuari IAM no té el permís ses:"
|
||||
"GetAccount."
|
||||
|
||||
#. translators: %s: AWS error message
|
||||
#: includes/class-plugin.php:1640
|
||||
#: includes/class-plugin.php:1696
|
||||
#, php-format
|
||||
msgid "Amazon SES API error: %s"
|
||||
msgstr "Error d'API d'Amazon SES: %s"
|
||||
|
||||
#. translators: %s: Error message
|
||||
#: includes/class-plugin.php:1649
|
||||
#: includes/class-plugin.php:1705
|
||||
#, php-format
|
||||
msgid "Failed to fetch SES quota: %s"
|
||||
msgstr "Ha fallat en obtenir la quota de SES: %s"
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:68
|
||||
#: includes/class-plugin.php:1796
|
||||
msgid "The link you followed has expired."
|
||||
msgstr "L'enllaç que has seguit ha caducat."
|
||||
|
||||
#: includes/class-plugin.php:1884
|
||||
msgid "The Amazon SES Access Key ID has been cleared."
|
||||
msgstr "L'ID de clau d'accés d'Amazon SES s'ha eliminat."
|
||||
|
||||
#: includes/class-plugin.php:1886
|
||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||
msgstr "La clau d'accés secreta d'Amazon SES s'ha eliminat."
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:85
|
||||
msgid ""
|
||||
"SMTP (by ROBOTSTXT) Amazon SES requires the SMTP (by ROBOTSTXT) plugin to be "
|
||||
"installed and active."
|
||||
msgstr ""
|
||||
"SMTP (by ROBOTSTXT) Amazon SES requereix que el connector SMTP (by ROBOTSTXT) "
|
||||
"estigui instal·lat i actiu."
|
||||
"SMTP (by ROBOTSTXT) Amazon SES requereix que el connector SMTP (by "
|
||||
"ROBOTSTXT) estigui instal·lat i actiu."
|
||||
|
||||
#~ msgid "From Email"
|
||||
#~ msgstr "Email remitent"
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -3,7 +3,7 @@ msgstr ""
|
|||
"Project-Id-Version: SMTP (by ROBOTSTXT) Amazon SES\n"
|
||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-"
|
||||
"amazonses\n"
|
||||
"POT-Creation-Date: 2026-06-09T10:41:00+00:00\n"
|
||||
"POT-Creation-Date: 2026-06-09T12:37:13+00:00\n"
|
||||
"PO-Revision-Date: 2026-01-29 09:30+0100\n"
|
||||
"Last-Translator: ROBOTSTXT <robotstxt@robotstxt.es>\n"
|
||||
"Language-Team: Spanish\n"
|
||||
|
|
@ -43,107 +43,112 @@ msgstr ""
|
|||
msgid "Security check failed"
|
||||
msgstr "Falló la comprobación de seguridad"
|
||||
|
||||
#: class-robotstxt-updater.php:384 includes/class-plugin.php:918
|
||||
#: class-robotstxt-updater.php:384 includes/class-plugin.php:932
|
||||
#: includes/class-plugin.php:1807
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr "No tienes permisos suficientes para acceder a esta página."
|
||||
|
||||
#: includes/class-plugin.php:149
|
||||
#: includes/class-plugin.php:163
|
||||
msgid "Amazon SES could not send the email because no recipient was provided."
|
||||
msgstr ""
|
||||
"Amazon SES no pudo enviar el email porque no se proporcionó ningún "
|
||||
"destinatario."
|
||||
|
||||
#. translators: %s: Error details describing the email preparation failure.
|
||||
#: includes/class-plugin.php:231
|
||||
#: includes/class-plugin.php:245
|
||||
#, php-format
|
||||
msgid "Amazon SES could not prepare the email: %s"
|
||||
msgstr "Amazon SES no pudo preparar el email: %s"
|
||||
|
||||
#. translators: %s: Error message returned by Amazon SES.
|
||||
#: includes/class-plugin.php:275
|
||||
#: includes/class-plugin.php:289
|
||||
#, php-format
|
||||
msgid "Amazon SES could not send the email: %s"
|
||||
msgstr "Amazon SES no pudo enviar el email: %s"
|
||||
|
||||
#. translators: %s: Error message describing the unexpected failure.
|
||||
#: includes/class-plugin.php:295
|
||||
#: includes/class-plugin.php:309
|
||||
#, php-format
|
||||
msgid "An unexpected error occurred while sending through Amazon SES: %s"
|
||||
msgstr "Ocurrió un error inesperado al enviar a través de Amazon SES: %s"
|
||||
|
||||
#. translators: %s: Error details describing why the From header is invalid.
|
||||
#: includes/class-plugin.php:357
|
||||
#: includes/class-plugin.php:371
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the \"From\" address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección \"De\": %s"
|
||||
|
||||
#. translators: %s: Invalid recipient email address.
|
||||
#: includes/class-plugin.php:378
|
||||
#: includes/class-plugin.php:392
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the recipient address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección del destinatario: %s"
|
||||
|
||||
#. translators: %s: Invalid CC email address.
|
||||
#: includes/class-plugin.php:400
|
||||
#: includes/class-plugin.php:414
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the CC address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección CC: %s"
|
||||
|
||||
#. translators: %s: Invalid BCC email address.
|
||||
#: includes/class-plugin.php:422
|
||||
#: includes/class-plugin.php:436
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the BCC address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección CCO: %s"
|
||||
|
||||
#. translators: %s: Invalid reply-to email address.
|
||||
#: includes/class-plugin.php:444
|
||||
#: includes/class-plugin.php:458
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the reply-to address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección de respuesta: %s"
|
||||
|
||||
#. translators: %s: Invalid reply-to email address from settings.
|
||||
#: includes/class-plugin.php:473
|
||||
#: includes/class-plugin.php:487
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the configured reply-to address: %s"
|
||||
msgstr "Amazon SES rechazó la dirección de respuesta configurada: %s"
|
||||
|
||||
#. translators: %s: Attachment path that could not be added.
|
||||
#: includes/class-plugin.php:524
|
||||
#: includes/class-plugin.php:538
|
||||
#, php-format
|
||||
msgid "Amazon SES could not include the attachment: %s"
|
||||
msgstr "Amazon SES no pudo incluir el adjunto: %s"
|
||||
|
||||
#: includes/class-plugin.php:910
|
||||
#: includes/class-plugin.php:924
|
||||
msgid "Security check failed."
|
||||
msgstr "Falló la comprobación de seguridad."
|
||||
|
||||
#: includes/class-plugin.php:931
|
||||
#: includes/class-plugin.php:945
|
||||
msgid "Amazon SES quotas refreshed successfully."
|
||||
msgstr "Cuotas de Amazon SES actualizadas correctamente."
|
||||
|
||||
#: includes/class-plugin.php:938
|
||||
#: includes/class-plugin.php:952
|
||||
msgid "Unable to fetch quotas from Amazon SES. Check debug log for details."
|
||||
msgstr ""
|
||||
"No se pudieron obtener las cuotas de Amazon SES. Verifica el registro de "
|
||||
"depuración para más detalles."
|
||||
|
||||
#: includes/class-plugin.php:977
|
||||
#: includes/class-plugin.php:991
|
||||
msgid "Access Key ID"
|
||||
msgstr "ID de clave de acceso"
|
||||
|
||||
#: includes/class-plugin.php:983
|
||||
#: includes/class-plugin.php:997
|
||||
msgid "Secret Access Key"
|
||||
msgstr "Clave de acceso secreta"
|
||||
|
||||
#: includes/class-plugin.php:989
|
||||
#: includes/class-plugin.php:1003
|
||||
msgid "Region"
|
||||
msgstr "Región"
|
||||
|
||||
#: includes/class-plugin.php:1028
|
||||
#: includes/class-plugin.php:1042
|
||||
msgid "Leave empty to keep the stored access key."
|
||||
msgstr "Dejar vacío para mantener la clave de acceso almacenada."
|
||||
|
||||
#: includes/class-plugin.php:1039
|
||||
#: includes/class-plugin.php:1071
|
||||
msgid "Clear access key"
|
||||
msgstr "Eliminar clave de acceso"
|
||||
|
||||
#: includes/class-plugin.php:1074
|
||||
msgid ""
|
||||
"Provide the IAM access key ID with permissions to send email through Amazon "
|
||||
"SES. Leave the field empty to retain the existing value."
|
||||
|
|
@ -151,11 +156,15 @@ msgstr ""
|
|||
"Proporciona el ID de clave de acceso IAM con permisos para enviar email a "
|
||||
"través de Amazon SES. Deja el campo vacío para mantener el valor existente."
|
||||
|
||||
#: includes/class-plugin.php:1051
|
||||
#: includes/class-plugin.php:1086
|
||||
msgid "Leave empty to keep the stored secret access key."
|
||||
msgstr "Dejar vacío para mantener la clave de acceso secreta almacenada."
|
||||
|
||||
#: includes/class-plugin.php:1062
|
||||
#: includes/class-plugin.php:1115
|
||||
msgid "Clear secret key"
|
||||
msgstr "Eliminar clave de acceso secreta"
|
||||
|
||||
#: includes/class-plugin.php:1118
|
||||
msgid ""
|
||||
"Enter the secret access key associated with the IAM user. Leave the field "
|
||||
"empty to retain the existing value."
|
||||
|
|
@ -163,19 +172,19 @@ msgstr ""
|
|||
"Introduce la clave de acceso secreta asociada con el usuario IAM. Deja el "
|
||||
"campo vacío para mantener el valor existente."
|
||||
|
||||
#: includes/class-plugin.php:1077
|
||||
#: includes/class-plugin.php:1133
|
||||
msgid "Select a region"
|
||||
msgstr "Selecciona una región"
|
||||
|
||||
#: includes/class-plugin.php:1082
|
||||
#: includes/class-plugin.php:1138
|
||||
msgid "Choose the AWS region where your Amazon SES account is hosted."
|
||||
msgstr "Elige la región de AWS donde está alojada tu cuenta de Amazon SES."
|
||||
|
||||
#: includes/class-plugin.php:1160
|
||||
#: includes/class-plugin.php:1216
|
||||
msgid "The selected Amazon SES region is not available."
|
||||
msgstr "La región de Amazon SES seleccionada no está disponible."
|
||||
|
||||
#: includes/class-plugin.php:1176
|
||||
#: includes/class-plugin.php:1232
|
||||
msgid ""
|
||||
"Amazon SES credentials were not saved. Provide an access key, secret key, "
|
||||
"and region."
|
||||
|
|
@ -183,163 +192,175 @@ msgstr ""
|
|||
"Las credenciales de Amazon SES no se guardaron. Proporciona una clave de "
|
||||
"acceso, clave secreta y región."
|
||||
|
||||
#: includes/class-plugin.php:1200
|
||||
#: includes/class-plugin.php:1256
|
||||
msgid "Amazon SES credentials verified successfully."
|
||||
msgstr "Credenciales de Amazon SES verificadas correctamente."
|
||||
|
||||
#: includes/class-plugin.php:1411
|
||||
#: includes/class-plugin.php:1467
|
||||
msgid "US East (Ohio)"
|
||||
msgstr "EE.UU. Este (Ohio)"
|
||||
|
||||
#: includes/class-plugin.php:1412
|
||||
#: includes/class-plugin.php:1468
|
||||
msgid "US East (N. Virginia)"
|
||||
msgstr "EE.UU. Este (N. Virginia)"
|
||||
|
||||
#: includes/class-plugin.php:1413
|
||||
#: includes/class-plugin.php:1469
|
||||
msgid "US West (N. California)"
|
||||
msgstr "EE.UU. Oeste (N. California)"
|
||||
|
||||
#: includes/class-plugin.php:1414
|
||||
#: includes/class-plugin.php:1470
|
||||
msgid "US West (Oregon)"
|
||||
msgstr "EE.UU. Oeste (Oregón)"
|
||||
|
||||
#: includes/class-plugin.php:1415
|
||||
#: includes/class-plugin.php:1471
|
||||
msgid "Africa (Cape Town)"
|
||||
msgstr "África (Ciudad del Cabo)"
|
||||
|
||||
#: includes/class-plugin.php:1416
|
||||
#: includes/class-plugin.php:1472
|
||||
msgid "Asia Pacific (Hyderabad)"
|
||||
msgstr "Asia Pacífico (Hyderabad)"
|
||||
|
||||
#: includes/class-plugin.php:1417
|
||||
#: includes/class-plugin.php:1473
|
||||
msgid "Asia Pacific (Jakarta)"
|
||||
msgstr "Asia Pacífico (Yakarta)"
|
||||
|
||||
#: includes/class-plugin.php:1418
|
||||
#: includes/class-plugin.php:1474
|
||||
msgid "Asia Pacific (Mumbai)"
|
||||
msgstr "Asia Pacífico (Mumbai)"
|
||||
|
||||
#: includes/class-plugin.php:1419
|
||||
#: includes/class-plugin.php:1475
|
||||
msgid "Asia Pacific (Osaka)"
|
||||
msgstr "Asia Pacífico (Osaka)"
|
||||
|
||||
#: includes/class-plugin.php:1420
|
||||
#: includes/class-plugin.php:1476
|
||||
msgid "Asia Pacific (Seoul)"
|
||||
msgstr "Asia Pacífico (Seúl)"
|
||||
|
||||
#: includes/class-plugin.php:1421
|
||||
#: includes/class-plugin.php:1477
|
||||
msgid "Asia Pacific (Singapore)"
|
||||
msgstr "Asia Pacífico (Singapur)"
|
||||
|
||||
#: includes/class-plugin.php:1422
|
||||
#: includes/class-plugin.php:1478
|
||||
msgid "Asia Pacific (Sydney)"
|
||||
msgstr "Asia Pacífico (Sídney)"
|
||||
|
||||
#: includes/class-plugin.php:1423
|
||||
#: includes/class-plugin.php:1479
|
||||
msgid "Asia Pacific (Tokyo)"
|
||||
msgstr "Asia Pacífico (Tokio)"
|
||||
|
||||
#: includes/class-plugin.php:1424
|
||||
#: includes/class-plugin.php:1480
|
||||
msgid "Canada (Central)"
|
||||
msgstr "Canadá (Central)"
|
||||
|
||||
#: includes/class-plugin.php:1425
|
||||
#: includes/class-plugin.php:1481
|
||||
msgid "Europe (Frankfurt)"
|
||||
msgstr "Europa (Fráncfort)"
|
||||
|
||||
#: includes/class-plugin.php:1426
|
||||
#: includes/class-plugin.php:1482
|
||||
msgid "Europe (Ireland)"
|
||||
msgstr "Europa (Irlanda)"
|
||||
|
||||
#: includes/class-plugin.php:1427
|
||||
#: includes/class-plugin.php:1483
|
||||
msgid "Europe (London)"
|
||||
msgstr "Europa (Londres)"
|
||||
|
||||
#: includes/class-plugin.php:1428
|
||||
#: includes/class-plugin.php:1484
|
||||
msgid "Europe (Milan)"
|
||||
msgstr "Europa (Milán)"
|
||||
|
||||
#: includes/class-plugin.php:1429
|
||||
#: includes/class-plugin.php:1485
|
||||
msgid "Europe (Paris)"
|
||||
msgstr "Europa (París)"
|
||||
|
||||
#: includes/class-plugin.php:1430
|
||||
#: includes/class-plugin.php:1486
|
||||
msgid "Europe (Stockholm)"
|
||||
msgstr "Europa (Estocolmo)"
|
||||
|
||||
#: includes/class-plugin.php:1431
|
||||
#: includes/class-plugin.php:1487
|
||||
msgid "Europe (Zurich)"
|
||||
msgstr "Europa (Zúrich)"
|
||||
|
||||
#: includes/class-plugin.php:1432
|
||||
#: includes/class-plugin.php:1488
|
||||
msgid "Israel (Tel Aviv)"
|
||||
msgstr "Israel (Tel Aviv)"
|
||||
|
||||
#: includes/class-plugin.php:1433
|
||||
#: includes/class-plugin.php:1489
|
||||
msgid "Middle East (Bahrain)"
|
||||
msgstr "Oriente Medio (Baréin)"
|
||||
|
||||
#: includes/class-plugin.php:1434
|
||||
#: includes/class-plugin.php:1490
|
||||
msgid "Middle East (UAE)"
|
||||
msgstr "Oriente Medio (EAU)"
|
||||
|
||||
#: includes/class-plugin.php:1435
|
||||
#: includes/class-plugin.php:1491
|
||||
msgid "South America (São Paulo)"
|
||||
msgstr "Sudamérica (São Paulo)"
|
||||
|
||||
#: includes/class-plugin.php:1436
|
||||
#: includes/class-plugin.php:1492
|
||||
msgid "AWS GovCloud (US-East)"
|
||||
msgstr "AWS GovCloud (EE.UU.-Este)"
|
||||
|
||||
#: includes/class-plugin.php:1437
|
||||
#: includes/class-plugin.php:1493
|
||||
msgid "AWS GovCloud (US-West)"
|
||||
msgstr "AWS GovCloud (EE.UU.-Oeste)"
|
||||
|
||||
#. translators: 1: AWS region display name. 2: AWS region code.
|
||||
#: includes/class-plugin.php:1452
|
||||
#: includes/class-plugin.php:1508
|
||||
#, php-format
|
||||
msgid "%1$s (%2$s)"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. translators: %s: AWS region code.
|
||||
#: includes/class-plugin.php:1468
|
||||
#: includes/class-plugin.php:1524
|
||||
#, php-format
|
||||
msgid "Region %s"
|
||||
msgstr "Región %s"
|
||||
|
||||
#. translators: %s: Error message from Amazon SES.
|
||||
#: includes/class-plugin.php:1509
|
||||
#: includes/class-plugin.php:1565
|
||||
#, php-format
|
||||
msgid "Invalid Amazon SES credentials: %s"
|
||||
msgstr "Credenciales de Amazon SES inválidas: %s"
|
||||
|
||||
#: includes/class-plugin.php:1574 includes/class-plugin.php:1596
|
||||
#: includes/class-plugin.php:1630 includes/class-plugin.php:1652
|
||||
msgid "Amazon SES credentials are not configured."
|
||||
msgstr "Las credenciales de Amazon SES no están configuradas."
|
||||
|
||||
#: includes/class-plugin.php:1610
|
||||
#: includes/class-plugin.php:1666
|
||||
msgid "Amazon SES did not return quota data."
|
||||
msgstr "Amazon SES no devolvió datos de cuota."
|
||||
|
||||
#: includes/class-plugin.php:1632
|
||||
#: includes/class-plugin.php:1688
|
||||
msgid "Cannot fetch SES quotas: IAM user lacks ses:GetAccount permission."
|
||||
msgstr ""
|
||||
"No se pueden obtener las cuotas de SES: el usuario IAM no tiene el permiso "
|
||||
"ses:GetAccount."
|
||||
|
||||
#. translators: %s: AWS error message
|
||||
#: includes/class-plugin.php:1640
|
||||
#: includes/class-plugin.php:1696
|
||||
#, php-format
|
||||
msgid "Amazon SES API error: %s"
|
||||
msgstr "Error de API de Amazon SES: %s"
|
||||
|
||||
#. translators: %s: Error message
|
||||
#: includes/class-plugin.php:1649
|
||||
#: includes/class-plugin.php:1705
|
||||
#, php-format
|
||||
msgid "Failed to fetch SES quota: %s"
|
||||
msgstr "Falló al obtener la cuota de SES: %s"
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:68
|
||||
#: includes/class-plugin.php:1796
|
||||
msgid "The link you followed has expired."
|
||||
msgstr "El enlace que has seguido ha caducado."
|
||||
|
||||
#: includes/class-plugin.php:1884
|
||||
msgid "The Amazon SES Access Key ID has been cleared."
|
||||
msgstr "El ID de clave de acceso de Amazon SES se ha eliminado."
|
||||
|
||||
#: includes/class-plugin.php:1886
|
||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||
msgstr "La clave de acceso secreta de Amazon SES se ha eliminado."
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:85
|
||||
msgid ""
|
||||
"SMTP (by ROBOTSTXT) Amazon SES requires the SMTP (by ROBOTSTXT) plugin to be "
|
||||
"installed and active."
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SMTP (by ROBOTSTXT) Amazon SES 2.1.5\n"
|
||||
"Project-Id-Version: SMTP (by ROBOTSTXT) Amazon SES 2.1.6\n"
|
||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-smtp-amazonses\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"POT-Creation-Date: 2026-06-09T10:41:00+00:00\n"
|
||||
"POT-Creation-Date: 2026-06-09T12:37:13+00:00\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"X-Generator: WP-CLI 2.12.0\n"
|
||||
"X-Domain: robotstxt-smtp-amazonses\n"
|
||||
|
|
@ -42,285 +42,306 @@ msgid "Security check failed"
|
|||
msgstr ""
|
||||
|
||||
#: class-robotstxt-updater.php:384
|
||||
#: includes/class-plugin.php:918
|
||||
#: includes/class-plugin.php:932
|
||||
#: includes/class-plugin.php:1807
|
||||
msgid "You do not have sufficient permissions to access this page."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:149
|
||||
#: includes/class-plugin.php:163
|
||||
msgid "Amazon SES could not send the email because no recipient was provided."
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error details describing the email preparation failure.
|
||||
#: includes/class-plugin.php:231
|
||||
#: includes/class-plugin.php:245
|
||||
#, php-format
|
||||
msgid "Amazon SES could not prepare the email: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error message returned by Amazon SES.
|
||||
#: includes/class-plugin.php:275
|
||||
#: includes/class-plugin.php:289
|
||||
#, php-format
|
||||
msgid "Amazon SES could not send the email: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error message describing the unexpected failure.
|
||||
#: includes/class-plugin.php:295
|
||||
#: includes/class-plugin.php:309
|
||||
#, php-format
|
||||
msgid "An unexpected error occurred while sending through Amazon SES: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error details describing why the From header is invalid.
|
||||
#: includes/class-plugin.php:357
|
||||
#: includes/class-plugin.php:371
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the \"From\" address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Invalid recipient email address.
|
||||
#: includes/class-plugin.php:378
|
||||
#: includes/class-plugin.php:392
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the recipient address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Invalid CC email address.
|
||||
#: includes/class-plugin.php:400
|
||||
#: includes/class-plugin.php:414
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the CC address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Invalid BCC email address.
|
||||
#: includes/class-plugin.php:422
|
||||
#: includes/class-plugin.php:436
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the BCC address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Invalid reply-to email address.
|
||||
#: includes/class-plugin.php:444
|
||||
#: includes/class-plugin.php:458
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the reply-to address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Invalid reply-to email address from settings.
|
||||
#: includes/class-plugin.php:473
|
||||
#: includes/class-plugin.php:487
|
||||
#, php-format
|
||||
msgid "Amazon SES rejected the configured reply-to address: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Attachment path that could not be added.
|
||||
#: includes/class-plugin.php:524
|
||||
#: includes/class-plugin.php:538
|
||||
#, php-format
|
||||
msgid "Amazon SES could not include the attachment: %s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:910
|
||||
#: includes/class-plugin.php:924
|
||||
msgid "Security check failed."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:931
|
||||
#: includes/class-plugin.php:945
|
||||
msgid "Amazon SES quotas refreshed successfully."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:938
|
||||
#: includes/class-plugin.php:952
|
||||
msgid "Unable to fetch quotas from Amazon SES. Check debug log for details."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:977
|
||||
#: includes/class-plugin.php:991
|
||||
msgid "Access Key ID"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:983
|
||||
#: includes/class-plugin.php:997
|
||||
msgid "Secret Access Key"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:989
|
||||
#: includes/class-plugin.php:1003
|
||||
msgid "Region"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1028
|
||||
#: includes/class-plugin.php:1042
|
||||
msgid "Leave empty to keep the stored access key."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1039
|
||||
#: includes/class-plugin.php:1071
|
||||
msgid "Clear access key"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1074
|
||||
msgid "Provide the IAM access key ID with permissions to send email through Amazon SES. Leave the field empty to retain the existing value."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1051
|
||||
#: includes/class-plugin.php:1086
|
||||
msgid "Leave empty to keep the stored secret access key."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1062
|
||||
#: includes/class-plugin.php:1115
|
||||
msgid "Clear secret key"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1118
|
||||
msgid "Enter the secret access key associated with the IAM user. Leave the field empty to retain the existing value."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1077
|
||||
#: includes/class-plugin.php:1133
|
||||
msgid "Select a region"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1082
|
||||
#: includes/class-plugin.php:1138
|
||||
msgid "Choose the AWS region where your Amazon SES account is hosted."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1160
|
||||
#: includes/class-plugin.php:1216
|
||||
msgid "The selected Amazon SES region is not available."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1176
|
||||
#: includes/class-plugin.php:1232
|
||||
msgid "Amazon SES credentials were not saved. Provide an access key, secret key, and region."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1200
|
||||
#: includes/class-plugin.php:1256
|
||||
msgid "Amazon SES credentials verified successfully."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1411
|
||||
#: includes/class-plugin.php:1467
|
||||
msgid "US East (Ohio)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1412
|
||||
#: includes/class-plugin.php:1468
|
||||
msgid "US East (N. Virginia)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1413
|
||||
#: includes/class-plugin.php:1469
|
||||
msgid "US West (N. California)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1414
|
||||
#: includes/class-plugin.php:1470
|
||||
msgid "US West (Oregon)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1415
|
||||
#: includes/class-plugin.php:1471
|
||||
msgid "Africa (Cape Town)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1416
|
||||
#: includes/class-plugin.php:1472
|
||||
msgid "Asia Pacific (Hyderabad)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1417
|
||||
#: includes/class-plugin.php:1473
|
||||
msgid "Asia Pacific (Jakarta)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1418
|
||||
#: includes/class-plugin.php:1474
|
||||
msgid "Asia Pacific (Mumbai)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1419
|
||||
#: includes/class-plugin.php:1475
|
||||
msgid "Asia Pacific (Osaka)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1420
|
||||
#: includes/class-plugin.php:1476
|
||||
msgid "Asia Pacific (Seoul)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1421
|
||||
#: includes/class-plugin.php:1477
|
||||
msgid "Asia Pacific (Singapore)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1422
|
||||
#: includes/class-plugin.php:1478
|
||||
msgid "Asia Pacific (Sydney)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1423
|
||||
#: includes/class-plugin.php:1479
|
||||
msgid "Asia Pacific (Tokyo)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1424
|
||||
#: includes/class-plugin.php:1480
|
||||
msgid "Canada (Central)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1425
|
||||
#: includes/class-plugin.php:1481
|
||||
msgid "Europe (Frankfurt)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1426
|
||||
#: includes/class-plugin.php:1482
|
||||
msgid "Europe (Ireland)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1427
|
||||
#: includes/class-plugin.php:1483
|
||||
msgid "Europe (London)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1428
|
||||
#: includes/class-plugin.php:1484
|
||||
msgid "Europe (Milan)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1429
|
||||
#: includes/class-plugin.php:1485
|
||||
msgid "Europe (Paris)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1430
|
||||
#: includes/class-plugin.php:1486
|
||||
msgid "Europe (Stockholm)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1431
|
||||
#: includes/class-plugin.php:1487
|
||||
msgid "Europe (Zurich)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1432
|
||||
#: includes/class-plugin.php:1488
|
||||
msgid "Israel (Tel Aviv)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1433
|
||||
#: includes/class-plugin.php:1489
|
||||
msgid "Middle East (Bahrain)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1434
|
||||
#: includes/class-plugin.php:1490
|
||||
msgid "Middle East (UAE)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1435
|
||||
#: includes/class-plugin.php:1491
|
||||
msgid "South America (São Paulo)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1436
|
||||
#: includes/class-plugin.php:1492
|
||||
msgid "AWS GovCloud (US-East)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1437
|
||||
#: includes/class-plugin.php:1493
|
||||
msgid "AWS GovCloud (US-West)"
|
||||
msgstr ""
|
||||
|
||||
#. translators: 1: AWS region display name. 2: AWS region code.
|
||||
#: includes/class-plugin.php:1452
|
||||
#: includes/class-plugin.php:1508
|
||||
#, php-format
|
||||
msgid "%1$s (%2$s)"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: AWS region code.
|
||||
#: includes/class-plugin.php:1468
|
||||
#: includes/class-plugin.php:1524
|
||||
#, php-format
|
||||
msgid "Region %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error message from Amazon SES.
|
||||
#: includes/class-plugin.php:1509
|
||||
#: includes/class-plugin.php:1565
|
||||
#, php-format
|
||||
msgid "Invalid Amazon SES credentials: %s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1574
|
||||
#: includes/class-plugin.php:1596
|
||||
#: includes/class-plugin.php:1630
|
||||
#: includes/class-plugin.php:1652
|
||||
msgid "Amazon SES credentials are not configured."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1610
|
||||
#: includes/class-plugin.php:1666
|
||||
msgid "Amazon SES did not return quota data."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1632
|
||||
#: includes/class-plugin.php:1688
|
||||
msgid "Cannot fetch SES quotas: IAM user lacks ses:GetAccount permission."
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: AWS error message
|
||||
#: includes/class-plugin.php:1640
|
||||
#: includes/class-plugin.php:1696
|
||||
#, php-format
|
||||
msgid "Amazon SES API error: %s"
|
||||
msgstr ""
|
||||
|
||||
#. translators: %s: Error message
|
||||
#: includes/class-plugin.php:1649
|
||||
#: includes/class-plugin.php:1705
|
||||
#, php-format
|
||||
msgid "Failed to fetch SES quota: %s"
|
||||
msgstr ""
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:68
|
||||
#: includes/class-plugin.php:1796
|
||||
msgid "The link you followed has expired."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1884
|
||||
msgid "The Amazon SES Access Key ID has been cleared."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-plugin.php:1886
|
||||
msgid "The Amazon SES Secret Access Key has been cleared."
|
||||
msgstr ""
|
||||
|
||||
#: robotstxt-smtp-amazonses.php:85
|
||||
msgid "SMTP (by ROBOTSTXT) Amazon SES requires the SMTP (by ROBOTSTXT) plugin to be installed and active."
|
||||
msgstr ""
|
||||
|
|
|
|||
46
readme.txt
46
readme.txt
|
|
@ -3,9 +3,9 @@ Contributors: javiercasares
|
|||
Tags: amazon-ses, smtp, email, mail
|
||||
Requires at least: 5.7
|
||||
Tested up to: 7.1
|
||||
Stable tag: 2.1.5
|
||||
Stable tag: 2.1.6
|
||||
Requires PHP: 8.2
|
||||
Version: 2.1.5
|
||||
Version: 2.1.6
|
||||
License: GPL-3.0-or-later
|
||||
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
|
|
@ -53,6 +53,26 @@ Yes. Network administrators can manage credentials centrally or allow individual
|
|||
|
||||
Only the 3 last versions. The full changelog will be at changelog.txt
|
||||
|
||||
= 2.1.6 =
|
||||
|
||||
_Release date: 2026-06-09_
|
||||
|
||||
**Added**
|
||||
|
||||
* Clear buttons for Access Key ID and Secret Access Key on the settings page. When a credential is stored, a "Clear access key" or "Clear secret key" button appears next to the field, allowing immediate removal of the stored value.
|
||||
|
||||
**Compatibility**
|
||||
|
||||
* WordPress: 5.7 - 7.1
|
||||
* PHP: 8.2 - 8.5
|
||||
|
||||
**Tests**
|
||||
|
||||
* PHP_CodeSniffer: 3.13.5
|
||||
* WordPress Coding Standards: 3.3.0
|
||||
* PHPCompatibility: 9.3.5
|
||||
* PHPStan: 2.2.2
|
||||
|
||||
= 2.1.5 =
|
||||
|
||||
_Release date: 2026-06-09_
|
||||
|
|
@ -98,28 +118,6 @@ _Release date: 2026-06-09_
|
|||
* PHPCompatibility: 9.3.5
|
||||
* PHPStan: 2.2.2
|
||||
|
||||
= 2.1.3 =
|
||||
|
||||
_Release date: 2026-06-09_
|
||||
|
||||
**Fixed**
|
||||
|
||||
* Nonce handling in manual quota refresh now correctly handles `false` values from `filter_input()`.
|
||||
* Admin notices display now skips non-array notice entries.
|
||||
* Input normalization for recipients, attachments, and headers now properly skips non-string values.
|
||||
|
||||
**Compatibility**
|
||||
|
||||
* WordPress: 5.7 - 7.1
|
||||
* PHP: 8.2 - 8.5
|
||||
|
||||
**Tests**
|
||||
|
||||
* PHP_CodeSniffer: 3.13.5
|
||||
* WordPress Coding Standards: 3.3.0
|
||||
* PHPCompatibility: 9.3.5
|
||||
* PHPStan: 2.2.2
|
||||
|
||||
= Previous versions =
|
||||
|
||||
If you want to see the full changelog, visit the [changelog.txt](https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses/raw/branch/main/changelog.txt) file.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
* Plugin Name: SMTP (by ROBOTSTXT) Amazon SES
|
||||
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses
|
||||
* Description: Adds Amazon SES configuration support to the ROBOTSTXT SMTP plugin.
|
||||
* Version: 2.1.5
|
||||
* Version: 2.1.6
|
||||
* Requires at least: 5.7
|
||||
* Requires PHP: 8.2
|
||||
* Network: true
|
||||
|
|
@ -26,7 +26,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
}
|
||||
|
||||
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION' ) ) {
|
||||
define( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION', '2.1.5' );
|
||||
define( 'ROBOTSTXT_SMTP_AMAZONSES_VERSION', '2.1.6' );
|
||||
}
|
||||
|
||||
if ( ! defined( 'ROBOTSTXT_SMTP_AMAZONSES_FILE' ) ) {
|
||||
|
|
@ -58,7 +58,7 @@ if ( \is_readable( $autoload ) ) {
|
|||
/**
|
||||
* Loads the plugin text domain for translations.
|
||||
*
|
||||
* @since 2.1.5
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
|
@ -75,7 +75,7 @@ function robotstxt_smtp_amazonses_load_textdomain(): void {
|
|||
/**
|
||||
* Displays an admin notice when the parent plugin is missing or inactive.
|
||||
*
|
||||
* @since 2.1.5
|
||||
* @since 2.1.6
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "SMTP (by ROBOTSTXT) Amazon SES",
|
||||
"slug": "robotstxt-smtp-amazonses",
|
||||
"version": "2.1.5",
|
||||
"download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses/releases/download/2.1.5/robotstxt-smtp-amazonses-2.1.5.zip",
|
||||
"version": "2.1.6",
|
||||
"download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses/releases/download/2.1.6/robotstxt-smtp-amazonses-2.1.6.zip",
|
||||
"requires": "5.7",
|
||||
"requires_php": "8.2",
|
||||
"tested": "7.1",
|
||||
|
|
@ -12,10 +12,10 @@
|
|||
"homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-amazonses",
|
||||
"requires_plugins": ["robotstxt-smtp"],
|
||||
"description": "Adds Amazon SES (Simple Email Service) configuration support to the ROBOTSTXT SMTP plugin. Integrates seamlessly with AWS SDK for PHP to send emails through Amazon SES infrastructure.",
|
||||
"changelog": "<h3>2.1.5 - 2026-06-09</h3><ul><li><strong>Added:</strong> Runtime check for missing parent plugin — shows admin notice instead of fatal error</li><li><strong>Fixed:</strong> Credentials never saving on first entry — validation now only blocks on definitive auth failures (InvalidClientTokenId, SignatureDoesNotMatch, InvalidAccessKeyId)</li><li><strong>Fixed:</strong> Reply-to email field cannot be cleared — submitting empty now removes the stored address</li></ul><h3>2.1.4 - 2026-06-09</h3><ul><li><strong>Changed:</strong> Minimum WordPress version lowered to 5.7 (verified real minimum by static analysis)</li></ul><h3>2.1.3 - 2026-06-09</h3><ul><li><strong>Fixed:</strong> Nonce handling in manual quota refresh to correctly handle false values from filter_input()</li><li><strong>Fixed:</strong> Admin notices display now skips non-array notice entries</li><li><strong>Fixed:</strong> Input normalization for recipients, attachments, and headers now properly skips non-string values</li><li><strong>Removed:</strong> Unused internal rate limit method (dead code cleanup)</li><li><strong>Compatibility:</strong> Tested up to WordPress 7.1</li></ul><h3>2.1.2 - 2026-02-12</h3><ul><li><strong>Fixed:</strong> Charset encoding issue that caused \"expected parameter value, got null\" error when sending emails through Amazon SES</li><li><strong>Improved:</strong> Added robust charset validation in header parsing to prevent empty or invalid charset values</li><li><strong>Improved:</strong> Enhanced charset handling with automatic fallback to UTF-8 when no valid charset is provided</li></ul>",
|
||||
"changelog": "<h3>2.1.6 - 2026-06-09</h3><ul><li><strong>Added:</strong> Clear buttons for Access Key ID and Secret Access Key — when a credential is stored, a button appears next to the field to immediately remove the stored value</li></ul><h3>2.1.5 - 2026-06-09</h3><ul><li><strong>Added:</strong> Runtime check for missing parent plugin — shows admin notice instead of fatal error</li><li><strong>Fixed:</strong> Credentials never saving on first entry — validation now only blocks on definitive auth failures</li><li><strong>Fixed:</strong> Reply-to email field cannot be cleared — submitting empty now removes the stored address</li></ul><h3>2.1.4 - 2026-06-09</h3><ul><li><strong>Changed:</strong> Minimum WordPress version lowered to 5.7 (verified real minimum by static analysis)</li></ul><h3>2.1.3 - 2026-06-09</h3><ul><li><strong>Fixed:</strong> Nonce handling in manual quota refresh to correctly handle false values from filter_input()</li><li><strong>Fixed:</strong> Admin notices display now skips non-array notice entries</li><li><strong>Fixed:</strong> Input normalization for recipients, attachments, and headers now properly skips non-string values</li><li><strong>Removed:</strong> Unused internal rate limit method (dead code cleanup)</li><li><strong>Compatibility:</strong> Tested up to WordPress 7.1</li></ul><h3>2.1.2 - 2026-02-12</h3><ul><li><strong>Fixed:</strong> Charset encoding issue that caused \"expected parameter value, got null\" error when sending emails through Amazon SES</li><li><strong>Improved:</strong> Added robust charset validation in header parsing to prevent empty or invalid charset values</li><li><strong>Improved:</strong> Enhanced charset handling with automatic fallback to UTF-8 when no valid charset is provided</li></ul>",
|
||||
"sections": {
|
||||
"description": "Adds Amazon SES (Simple Email Service) configuration support to the ROBOTSTXT SMTP plugin. Integrates seamlessly with AWS SDK for PHP to send emails through Amazon SES infrastructure.",
|
||||
"changelog": "<h3>2.1.5 - 2026-06-09</h3><ul><li><strong>Added:</strong> Runtime check for missing parent plugin — shows admin notice instead of fatal error</li><li><strong>Fixed:</strong> Credentials never saving on first entry — validation now only blocks on definitive auth failures</li><li><strong>Fixed:</strong> Reply-to email field cannot be cleared — submitting empty now removes the stored address</li></ul><h3>2.1.4 - 2026-06-09</h3><ul><li><strong>Changed:</strong> Minimum WordPress version lowered to 5.7 (verified real minimum by static analysis)</li></ul><h3>2.1.3 - 2026-06-09</h3><ul><li><strong>Fixed:</strong> Nonce handling in manual quota refresh to correctly handle false values from filter_input()</li><li><strong>Fixed:</strong> Admin notices display now skips non-array notice entries</li><li><strong>Fixed:</strong> Input normalization for recipients, attachments, and headers now properly skips non-string values</li><li><strong>Removed:</strong> Unused internal rate limit method (dead code cleanup)</li><li><strong>Compatibility:</strong> Tested up to WordPress 7.1</li></ul><h3>2.1.2 - 2026-02-12</h3><ul><li><strong>Fixed:</strong> Charset encoding issue that caused \"expected parameter value, got null\" error when sending emails through Amazon SES</li><li><strong>Improved:</strong> Added robust charset validation in header parsing to prevent empty or invalid charset values</li><li><strong>Improved:</strong> Enhanced charset handling with automatic fallback to UTF-8 when no valid charset is provided</li></ul><h3>2.1.1 - 2026-02-09</h3><ul><li><strong>Added:</strong> Comprehensive Amazon SES debug context to test email error reports</li><li><strong>Security:</strong> Access keys are now masked in error output (shows only first 4 and last 4 characters)</li></ul><h3>2.1.0 - 2026-02-09</h3><ul><li><strong>Changed:</strong> Uninstall behavior: plugin no longer performs cleanup on uninstall, all data cleanup is now handled by the core SMTP plugin</li></ul>"
|
||||
"changelog": "<h3>2.1.6 - 2026-06-09</h3><ul><li><strong>Added:</strong> Clear buttons for Access Key ID and Secret Access Key — when a credential is stored, a button appears next to the field to immediately remove the stored value</li></ul><h3>2.1.5 - 2026-06-09</h3><ul><li><strong>Added:</strong> Runtime check for missing parent plugin — shows admin notice instead of fatal error</li><li><strong>Fixed:</strong> Credentials never saving on first entry — validation now only blocks on definitive auth failures</li><li><strong>Fixed:</strong> Reply-to email field cannot be cleared — submitting empty now removes the stored address</li></ul><h3>2.1.4 - 2026-06-09</h3><ul><li><strong>Changed:</strong> Minimum WordPress version lowered to 5.7 (verified real minimum by static analysis)</li></ul><h3>2.1.3 - 2026-06-09</h3><ul><li><strong>Fixed:</strong> Nonce handling in manual quota refresh to correctly handle false values from filter_input()</li><li><strong>Fixed:</strong> Admin notices display now skips non-array notice entries</li><li><strong>Fixed:</strong> Input normalization for recipients, attachments, and headers now properly skips non-string values</li><li><strong>Removed:</strong> Unused internal rate limit method (dead code cleanup)</li><li><strong>Compatibility:</strong> Tested up to WordPress 7.1</li></ul><h3>2.1.2 - 2026-02-12</h3><ul><li><strong>Fixed:</strong> Charset encoding issue that caused \"expected parameter value, got null\" error when sending emails through Amazon SES</li><li><strong>Improved:</strong> Added robust charset validation in header parsing to prevent empty or invalid charset values</li><li><strong>Improved:</strong> Enhanced charset handling with automatic fallback to UTF-8 when no valid charset is provided</li></ul><h3>2.1.1 - 2026-02-09</h3><ul><li><strong>Added:</strong> Comprehensive Amazon SES debug context to test email error reports</li><li><strong>Security:</strong> Access keys are now masked in error output (shows only first 4 and last 4 characters)</li></ul><h3>2.1.0 - 2026-02-09</h3><ul><li><strong>Changed:</strong> Uninstall behavior: plugin no longer performs cleanup on uninstall, all data cleanup is now handled by the core SMTP plugin</li></ul>"
|
||||
},
|
||||
"banners": {
|
||||
"low": "",
|
||||
|
|
|
|||
4
vendor/composer/installed.php
vendored
4
vendor/composer/installed.php
vendored
|
|
@ -3,7 +3,7 @@
|
|||
'name' => 'robotstxt/robotstxt-smtp-amazonses',
|
||||
'pretty_version' => 'dev-main',
|
||||
'version' => 'dev-main',
|
||||
'reference' => '76ef43f421cbfa826db298560ad762a5bbfda1dc',
|
||||
'reference' => '2d20c9c39a5dd1c977dd908a09254e0f76c97803',
|
||||
'type' => 'wordpress-plugin',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
|
|
@ -121,7 +121,7 @@
|
|||
'robotstxt/robotstxt-smtp-amazonses' => array(
|
||||
'pretty_version' => 'dev-main',
|
||||
'version' => 'dev-main',
|
||||
'reference' => '76ef43f421cbfa826db298560ad762a5bbfda1dc',
|
||||
'reference' => '2d20c9c39a5dd1c977dd908a09254e0f76c97803',
|
||||
'type' => 'wordpress-plugin',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
|
|
|
|||
Loading…
Reference in a new issue