| 开发者 | shiponkarmakar |
|---|---|
| 更新时间 | 2026年5月28日 19:23 |
| 捐献地址: | 去捐款 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
wp_mail() traffic through Amazon SES, SendGrid, Mailgun, Brevo (Sendinblue), Postmark, Zoho ZeptoMail, Gmail API, Microsoft 365, or any standard SMTP server — with full email logging, queue, retry, and failure alerts.
Why SendForce Mail SMTP
wp sendforce test, wp sendforce queue process, wp sendforce log list, wp sendforce sysinfo.sendforce_before_send, sendforce_after_send, sendforce_log_entry, sendforce_api_request, sendforce_api_response for extending the plugin without forking.WP_DEBUG_LOG integration — optional mirroring of SMTP and API debug output to debug.log.wp_mail() function, so it works with every plugin that sends email — including WooCommerce, Easy Digital Downloads, Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms, Forminator, MemberPress, LearnDash, BuddyPress, bbPress, MailPoet (transactional), and any custom plugin or theme that uses wp_mail().
sendforce-mail-relay folder to the /wp-content/plugins/ directory, or install directly through the WordPress plugin installer.Yes. You need access to an SMTP server or a transactional email provider account. Most providers (Gmail, Outlook, etc.) offer SMTP access. Transactional services like SendGrid, Mailgun, or Amazon SES offer both SMTP and HTTP API access.
Yes. All credentials are encrypted using AES-256-CBC encryption with a key derived from your WordPress security salts before being stored in the database.
When enabled, emails are stored in a database queue instead of being sent immediately. A WP-Cron job processes the queue every 5 minutes, sending emails in batches. Failed emails are retried with exponential backoff (5 min → 15 min → 45 min).
Yes. SendForce Mail Relay hooks into WordPress's phpmailer_init action (SMTP mode) or pre_wp_mail filter (API mode). Since every plugin — including WooCommerce, contact form plugins, and membership plugins — sends email via WordPress's wp_mail() function, SendForce Mail Relay will handle 100% of outgoing emails.
You should only use one SMTP plugin at a time. Please deactivate any other SMTP or email plugins (FluentSMTP, WP Mail SMTP, etc.) before activating SendForce Mail Relay.
By default, SendForce Mail Relay logs: recipient email, subject, headers, status (sent/failed), error message if any, and timestamp. Email body logging is optional and can be disabled in Settings > Queue & Logging for privacy compliance.
All plugin data (database tables, settings, and scheduled events) is completely removed when you delete the plugin through the WordPress admin.
No. SendForce Mail Relay does not collect any data, make any analytics calls, or communicate with any external server except when sending emails through your configured provider.
email, email log, gmail, outlook, smtp) to better match how users actually search. gmail and outlook in particular are high-intent searches that match our existing Gmail and Microsoft 365 OAuth flows but weren't previously tagged.aria-label so screen readers announce them correctly (was relying on title alone, which most assistive tech ignores)._n(), so non-English locales can translate the singular and plural cases separately instead of inheriting the awkward English "(s)" suffix.& in a translation string is a portability gotcha for some PO editors).viewBox (camelCase) to the SVG wp_kses whitelist alongside the existing lowercase viewbox, so channel-logo SVGs render correctly regardless of which casing the source file uses.$current_user to $sendforce_current_user in the Email Test template for prefix consistency with the rest of the file (avoids accidentally shadowing WP's globally-scoped $current_user in deeply included contexts).provider column to wp_sendforce_logs (varchar(50), indexed). Populated automatically going forward from the captured debug payload (when available) or the active connection's configured provider. Existing rows are not back-filled; only new log entries get the column populated. dbDelta handles the schema migration on plugin upgrade.<code> tags but didn't escape the inner content first — so when a bullet contained literal <tag> text inside backticks (very common in technical changelogs), the browser interpreted the embedded text as a real HTML tag and produced floating empty <code> elements that rendered as gray pills against the page background. Fix: esc_html() the raw line before applying the markdown transformations. The two regex rules (**bold** → <strong> and backtick → <code>) now run on already-escaped text, guaranteeing balanced tags and no HTML injection from bullet content. Affects 1.0.28 only.cron_schedules filter. The filter fires whenever WP looks up scheduled events (which can happen before init, during plugins_loaded or even setup_theme), so calling __( …, 'sendforce-mail-relay' ) there ran the translation function before the textdomain was loaded. Both filter callbacks (in the activator and the mailer) now use a literal English string for the cron schedule's display label — that label is only shown in dev tools like WP Crontrol or wp-cli cron list, never user-facing, so leaving it untranslated is harmless. Resolves the deprecation notice on sites running WP_DEBUG with WP 6.7 or newer.http:// an inline red warning appears explaining that the alert message (site name, failed recipient, error details) would be sent unencrypted. Catches typos and homemade webhook receivers before save.sendforce_alerts_throttle_seconds to change the window length, set it to 0 to disable throttling entirely.manage_options capability in addition to the existing nonce check. The forms that issued these requests already live on admin-only pages, so a non-admin couldn't normally obtain a valid nonce — but explicit capability checks match WordPress.org Plugin Check expectations and protect against any future flow that might mint a nonce in a less-restricted context./var/www/example.com/wp-content/uploads/woocommerce_uploads/2026/invoice-12345.pdf were stored verbatim — leaking the server directory layout, shared-hosting username paths, and customer order IDs from WooCommerce invoice filenames. From 1.0.27 the same row stores only invoice-12345.pdf. Existing rows are not rewritten; only new log entries get basename-only.wp_mail()'s 5th argument) are now base64-encoded into each provider's native JSON schema and delivered through the API.text/plain alternative is included via each provider's native multipart fields. Improves deliverability — Gmail and other inbox providers favour multipart-alternative messages, and plain-text-only clients get a readable fallback. Previously this setting was silently ignored in API mode for the 16 providers covered here.Content field with no IsContentHtml companion for both parts, so it can't represent multipart_text — its attachments work, just not the dual-body part.multipart/form-data (not JSON like the other 17), so a new build_multipart_form_data() helper in the base class assembles the request body correctly while still capturing the response into the debug log.prepare_attachments() (base64 + MIME-type detection + safe file reads) and get_plain_text_alt() (HTML→plain conversion when multipart_text is on) — give each provider ~5 lines of mapping code instead of duplicating the same boilerplate 18 times.error column. Previously every failure showed a generic "Failed to send email." message, regardless of whether the cause was an expired OAuth token, an unverified sender domain, a wrong API key, or a network glitch. The queue processor now hooks wp_mail_failed during each send attempt and stores the real WP_Error message (e.g. AADSTS70008: refresh token expired, MessageRejected: Email address is not verified, Domain not found). Users on the Queue tab can finally see WHY a send failed without digging into the Email Log.SendForce_Queue::$bypass_once flag tells the queue interceptor to skip the next wp_mail call, so test sends always go out synchronously regardless of queue mode.<details>/<summary> so it's keyboard-accessible and works without JavaScript.?tab=upcoming and ?tab=changelog URLs both still resolve as back-compat aliases so any bookmarks or in-plugin links keep working.build_raw_mime() helper. Full release detail in CHANGELOG.md.AADSTS50011 redirect URI mismatch. Root cause was add_query_arg() not URL-encoding values, leaving & characters bare inside redirect_uri. Switched to http_build_query() with PHP_QUERY_RFC3986.make_request()).Bearer TOKEN / Zoho-enczapikey TOKEN prefixes — auto-stripped before constructing the auth header. All API keys are also auto-trimmed.admin_url filters (Wordfence, LiteSpeed Cache).wp_kses SVG whitelist used for channel logos on the Alerts tab.from_email / from_domain conditions, "via rule" badge in Email Log, starter presets, "What's Next" roadmap tab, styled confirm dialogs.oauth_email field on newly created connections so the schema is consistent from save time.IsContentHtml flag in both HTML and plain-text paths).next_retry_at) on the next cron run.wp_strip_all_tags on provider errors returned to the browser.wp_mail() returns true on fallback success; clearer recovery message. Suppressed spurious SMTP-warning when active path was API or PHP-Mail.<select> dropdowns with branded styled component (full keyboard support — Arrow/Enter/Escape). Default/Fallback selectors auto-refresh after connection save. Form-control polish (chevron, focus ring, hover, disabled states)..DS_Store file from assets/images/providers/. Added phpcs:ignore annotations with rationale to interpolated table-name $wpdb queries. Restructured WP-CLI log-delete query for proper phpcs handling.<style>/<script> blocks from PHP output (proper enqueue). Surface actual provider HTTP status / response body in failure messages. Added "Raw API request / response" panel to Email Log detail modal. Masked-dots placeholder for saved password/API-key fields. Hardened secret redaction (covers client_secret, response bodies, malformed-JSON fallback). Defused CSV formula injection on log export. Gated on-load DB schema upgrade to admin/WP-CLI. Added confirmation prompts to destructive WP-CLI commands.wp sendforce test, queue, log, sysinfo). Added developer hooks (sendforce_before_send, sendforce_after_send, sendforce_log_entry, sendforce_api_request, sendforce_api_response). Added Developer Debug setting to mirror SMTP/API debug to debug.log. Added raw API request/response capture in new debug_data log column (with Authorization redaction). Email Log export as CSV/JSON. "Copy Debug Info" button on Email Test screen. Replaced stale "SMTP-Manager" User-Agent on Resend with "SendForce-Mail-Relay".sendforce-mail-relay.php.