{"id":350200,"date":"2026-08-15T06:52:48","date_gmt":"2026-08-15T06:52:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sendpaw-mail\/"},"modified":"2026-08-15T07:24:58","modified_gmt":"2026-08-15T07:24:58","slug":"sendpaw-mail","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sendpaw-mail\/","author":23527322,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.7","stable_tag":"1.1.7","tested":"7.0.4","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"SendPaw Mail","header_author":"PlatkaDigital","header_description":"Reliable transactional email for WordPress through SendPaw Free SMTP and API services. Sends all your WordPress mail (orders, registrations, password resets, contact forms) via SendPaw's HTTP API or SMTP \u2014 each with its own credentials, with optional automatic SMTP fallback if the API fails.","assets_banners_color":"a6acb3","last_updated":"2026-08-15 07:24:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/sendpaw.com","header_author_uri":"https:\/\/platka.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.7":{"tag":"1.1.7","author":"platkadigital","date":"2026-08-15 07:24:58"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3648249,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3648249,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3648224,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3648224,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3648224,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3648224,"resolution":"2","location":"assets","locale":"","width":1280,"height":720}},"screenshots":{"1":"Settings page (placeholder \u2014 to be replaced with an actual screenshot).","2":"Connect flow (placeholder \u2014 to be replaced with an actual screenshot)."}},"plugin_section":[],"plugin_tags":[17561,267,450,6696,48586],"plugin_category":[41],"plugin_contributors":[275779],"plugin_business_model":[],"class_list":["post-350200","plugin","type-plugin","status-publish","hentry","plugin_tags-deliverability","plugin_tags-email","plugin_tags-mail","plugin_tags-smtp","plugin_tags-transactional-email","plugin_category-communication","plugin_contributors-platkadigital","plugin_committers-platkadigital"],"banners":{"banner":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/banner-772x250.png?rev=3648224","banner_2x":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/banner-1544x500.png?rev=3648224","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/icon-128x128.png?rev=3648249","icon_2x":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/icon-256x256.png?rev=3648249","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/screenshot-1.png?rev=3648224","caption":"Settings page (placeholder \u2014 to be replaced with an actual screenshot)."},{"src":"https:\/\/ps.w.org\/sendpaw-mail\/assets\/screenshot-2.png?rev=3648224","caption":"Connect flow (placeholder \u2014 to be replaced with an actual screenshot)."}],"raw_content":"<!--section=description-->\n<p><strong>SendPaw Mail<\/strong> makes WordPress email actually arrive. It replaces WordPress's default\nmail sending (<code>wp_mail()<\/code>) with delivery through SendPaw, so your transactional email \u2014\norder confirmations, user registrations, password resets, contact-form notifications \u2014\nreaches the inbox instead of the spam folder.<\/p>\n\n<p>You can send using either of two independent methods, whichever suits your host:<\/p>\n\n<ul>\n<li><strong>HTTP API<\/strong> \u2014 a Bearer token calls SendPaw's REST endpoint directly. Fastest, and less\nlikely to be blocked by hosting firewalls.<\/li>\n<li><strong>SMTP<\/strong> \u2014 a real username and password over the standard SMTP protocol.<\/li>\n<\/ul>\n\n<p>The HTTP API and SMTP are two different protocols with their own separate credentials \u2014\npick either one as your primary sending method, with optional automatic fallback from\nAPI to SMTP if the API call fails.<\/p>\n\n<p>Features:<\/p>\n\n<ul>\n<li>Two independent sending methods: HTTP API (Bearer token) or SMTP (username + password).<\/li>\n<li>SMTP credentials work like any standard SMTP server \u2014 they aren't tied to the API key,\nso the SMTP settings also work with SMTP providers other than SendPaw.<\/li>\n<li>Optional automatic fallback to SMTP if the API call fails.<\/li>\n<li>Every send is capped at 10 seconds total (across the API attempt and the\nSMTP fallback combined), so a slow or unreachable mail server can only add\na few seconds to the page that triggered the email, never minutes \u2014 this\nis what prevents 504 Gateway Timeout errors on checkout, registration,\ncontact forms, etc.<\/li>\n<li>Automatically overrides the \"From\" address for all WordPress emails.<\/li>\n<li>Send a test email directly from the settings page.<\/li>\n<\/ul>\n\n<p>Note: SendPaw is a self-hosted service, so you'll need to enter the hostname of your own\nSendPaw instance (there is no single shared hostname for all users).<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to SendPaw, an external transactional email service, to deliver the\nemail your WordPress site sends. Sending mail through SendPaw is the entire purpose of the\nplugin, so it cannot work without contacting that service. Nothing is sent until you have\nentered your own credentials on the Settings &gt; SendPaw Mail screen.<\/p>\n\n<p><strong>1. SendPaw email API (<code>https:\/\/sendpaw.com\/api\/v1\/email<\/code>)<\/strong><\/p>\n\n<p>Used to deliver your WordPress email when the sending method is set to \"HTTP API\". Every\ntime WordPress sends an email (order confirmation, user registration, password reset,\ncontact-form notification, or the test email you trigger from the settings screen), the\nplugin makes one HTTPS request to this endpoint containing: your API key (as a Bearer\ntoken), the sender name and address you configured, the recipient addresses, the subject,\nthe message body, and any attachments passed to <code>wp_mail()<\/code>. No data is sent when no email\nis being sent.<\/p>\n\n<p><strong>2. SendPaw SMTP server (the host you enter under \"SMTP host\")<\/strong><\/p>\n\n<p>Used to deliver your WordPress email when the sending method is set to \"SMTP\", or as the\nautomatic fallback when an API send fails. The same message data listed above (sender,\nrecipients, subject, body, attachments) is transmitted over an authenticated, encrypted\nSMTP connection using the SMTP username and password you entered. These SMTP settings are\nprovider-agnostic: if you point them at a non-SendPaw SMTP server, the mail goes to that\nserver instead and SendPaw is not contacted.<\/p>\n\n<p><strong>3. SendPaw account API (<code>https:\/\/sendpaw.com\/api\/v1\/...<\/code>), optional<\/strong><\/p>\n\n<p>Only used if you click \"Connect to SendPaw\" or after you have connected. The connect flow\nopens SendPaw in your browser to authorise this site (protected by a one-time state value\nplus PKCE) and, on approval, receives a send-only API key that is saved in your settings.\nWhile connected, the settings screen requests your account summary (remaining email credits\nand the list of your sending domains and their verification status) so it can display them\nin the sidebar. Your site URL is sent as part of the connect request so the created key can\nbe identified. This is not used at all if you enter an API key manually.<\/p>\n\n<p>Service provider: SendPaw (https:\/\/sendpaw.com).\nTerms of Service: https:\/\/sendpaw.com\/terms\nPrivacy Policy: https:\/\/sendpaw.com\/privacy<\/p>\n\n<p>Note: SendPaw can also be self-hosted. If you define the <code>SENDPAW_API_HOST<\/code> constant in\n    wp-config.php, or point the SMTP host at your own server, the requests described above go\nto that instance instead of sendpaw.com, and that operator's terms apply.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sendpaw-mail<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the\nWordPress Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to Settings &gt; SendPaw Mail.<\/li>\n<li>Enter the API key from your SendPaw dashboard, or click \"Connect to SendPaw\" to have one\ncreated and filled in for you.<\/li>\n<li>Save, then send a test email to confirm your configuration works.<\/li>\n<\/ol>\n\n<p>If you send over SMTP instead, the SMTP host is already filled in with SendPaw's server \u2014\nyou only need to add your SMTP username and password. Change the host if you send through a\ndifferent provider.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20php%20versions%20are%20supported%3F\"><h3>Which PHP versions are supported?<\/h3><\/dt>\n<dd><p>PHP 7.4 is the minimum. The plugin is compatible with PHP 8.0 through 8.5, including the\nstricter null-argument handling introduced in PHP 8.1: every value is cast to string before\nit reaches <code>trim()<\/code>, <code>preg_replace()<\/code> or similar, so a null coming from <code>wp_mail()<\/code> headers\nor an unset settings field never triggers a deprecation notice.<\/p>\n\n<p>The plugin declares all class properties explicitly, so it is unaffected by the deprecation\nof dynamic properties (PHP 8.2) and will keep working when that becomes an error in PHP 9.\nIt uses no functions or extensions removed in PHP 8.5.<\/p><\/dd>\n<dt id=\"can%20i%20use%20a%20subdomain%20as%20my%20sending%20domain%3F\"><h3>Can I use a subdomain as my sending domain?<\/h3><\/dt>\n<dd><p>Yes. A subdomain such as <code>mail.example.com<\/code> or <code>news.example.com<\/code> is added and verified as\na domain in its own right, with its own SPF, DKIM and (optionally) tracking and bounce\nrecords published under that subdomain. Note that verifying <code>example.com<\/code> does not\nautomatically authorise its subdomains \u2014 add each sending subdomain separately, and make\nsure the <code>From:<\/code> address on this settings screen matches a verified one.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20api%20and%20smtp%20in%20this%20plugin%3F\"><h3>What's the difference between API and SMTP in this plugin?<\/h3><\/dt>\n<dd><p>The API sends through SendPaw's HTTP endpoint (faster, and less likely to be blocked by\nhosting firewalls). SMTP sends using the standard SMTP protocol to SendPaw's ingress. The\nplugin can use the API as the primary method and automatically fall back to SMTP if the API\nfails.<\/p><\/dd>\n<dt id=\"why%20do%20i%20need%20to%20enter%20the%20%22host%22%20myself%3F\"><h3>Why do I need to enter the \"Host\" myself?<\/h3><\/dt>\n<dd><p>SendPaw can be self-hosted, so every instance has its own hostname \u2014 there is no single\nhostname that works for every user.<\/p><\/dd>\n<dt id=\"are%20attachments%20supported%3F\"><h3>Are attachments supported?<\/h3><\/dt>\n<dd><p>Yes. Attachments passed to <code>wp_mail()<\/code> \u2014 WooCommerce invoices, form uploads, and so on \u2014\nare sent over both transports. On the API path the server validates each file against an\nallowlist of types and the operator's size\/count limits, and rejects the message if a file\nisn't allowed rather than delivering it without the attachment.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>The SMTP host now defaults to SendPaw's SMTP server, so it no longer has to be typed in\nby hand. Existing installs that left it blank are filled in automatically; a host you set\nyourself is never overwritten.<\/li>\n<li>Replaced the settings-page logo with the correct SendPaw mark.<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Verified compatibility with PHP 8.5; documented that the plugin uses no functions or\nextensions removed in that release and declares all class properties explicitly, so it is\nunaffected by the dynamic-property deprecation that becomes an error in PHP 9.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Added a \"Settings\" link to the plugin's row on the Plugins screen, so the configuration\npage can be reached directly after activation instead of via the Settings menu.<\/li>\n<li>Added a \"Documentation\" link to the plugin row meta.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Moved all admin CSS and JavaScript out of the page markup into properly enqueued asset\nfiles (<code>wp_enqueue_style()<\/code> \/ <code>wp_enqueue_script()<\/code>), loaded only on the plugin's own\nsettings screen.<\/li>\n<li>Documented the external SendPaw services the plugin contacts, what data is sent and when,\nwith links to the terms of service and privacy policy.<\/li>\n<li>Load WordPress's bundled PHPMailer classes with <code>require_once<\/code> instead of <code>require<\/code>.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Verified compatibility with PHP 8.0 through 8.4.<\/li>\n<li>Hardened string handling so a null value from <code>wp_mail()<\/code> (headers, recipients) or a\nsettings field no longer triggers a PHP 8.1 deprecation notice.<\/li>\n<li>Use <code>wp_safe_redirect()<\/code> for the Connect flow, whitelisting only the SendPaw host.<\/li>\n<li>Documented that query-string reads on the settings screen are display-only and the\nConnect callback is protected by a one-time state value plus PKCE.<\/li>\n<li>Fixed the internal version constant not matching the plugin header.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Send <code>wp_mail()<\/code> attachments over both the API and SMTP transports (previously dropped).<\/li>\n<li>API sends now include the sender display name, matching SMTP sends.<\/li>\n<li>Fixed the SMTP timeout not honouring the remaining send-time budget.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: one-screen setup, sending via the API with SMTP fallback, test email feature.<\/li>\n<\/ul>","raw_excerpt":"Reliable transactional email for WordPress through SendPaw. Send your WordPress mail over the HTTP API or SMTP, with automatic fallback.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/350200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=350200"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/platkadigital"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=350200"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=350200"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=350200"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=350200"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=350200"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=350200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}