{"id":322319,"date":"2026-06-05T08:26:18","date_gmt":"2026-06-05T08:26:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/send-email-today\/"},"modified":"2026-06-05T09:56:11","modified_gmt":"2026-06-05T09:56:11","slug":"casa-mail","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/casa-mail\/","author":23511283,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.1","stable_tag":"1.4.1","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Casa Mail","header_author":"CodeCasa Studios","header_description":"Routes wp_mail() through the Casa Mail SMTP gateway. Shows up under WooCommerce when present, otherwise under Settings.","assets_banners_color":"c4d1e8","last_updated":"2026-06-05 09:56:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/sendemailtoday.io","header_author_uri":"https:\/\/codecasastudios.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":101,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"sendemailtoday","date":"2026-06-05 08:53:32"},"1.4.1":{"tag":"1.4.1","author":"sendemailtoday","date":"2026-06-05 09:56:11"}},"upgrade_notice":{"1.4.0":"<p>Plugin renamed to Casa Mail. The mail gateway is unchanged, but stored option keys moved to a new prefix, so the plugin re-runs its one-time onboarding after this upgrade. Reconnect from the Casa Mail admin page if prompted.<\/p>","1.3":"<p>Plain-English rewrite of the &quot;Sender domain&quot; wizard step. No data migration; existing tenants see the new UX on their next admin visit.<\/p>","1.2":"<p>After verifying your own domain, customer emails now go from <code>@yourdomain.com<\/code> (matching your Casa Mail inbox name) instead of <code>noreply@yourdomain.com<\/code>. Replies still route through your OSN inbox so the free-tier auto-forward + future webmail tier both work the same.<\/p>","1.1":"<p>Adds the per-tenant Casa Mail inbox: every wp_mail() now goes from <code>@onlinestorenotifications.com<\/code>, with auto-forwarded replies to your contact email. Existing installs upgrade in place; the gateway backfills a mailbox slug on next plugin OTP-verify.<\/p>","1.0":"<p>First stable release. Submitting to the WordPress.org plugin directory. Existing installs upgrade in place; no data migration required.<\/p>","0.5.0":"<p>Adds the &quot;Use shared sender&quot; opt-out so tenants who don&#039;t want to publish DKIM\/SPF\/RP records can send via <code>noreply@onlinestorenotifications.com<\/code> instead. New Reply-To header preserves the original caller&#039;s From so customer replies still reach the right mailbox.<\/p>","0.4.2":"<p>Support contact swapped to <code>support@onlinestorenotifications.com<\/code> so deletion requests and error messages route to the already-active OSN mailbox.<\/p>","0.4.1":"<p>WordPress.org pre-submission cleanup: separate notice-dismiss JS instead of inline ``, gateway-routed deletion request, dropped unused AJAX endpoints.<\/p>","0.4.0":"<p>WordPress.org compliance release. Adds readme.txt, privacy registration, full translatability (8 locales bundled), modal-based confirmations, and a self-serve account-deletion request. Existing installs are upgraded in place; no data migration required.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3562067,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3562067,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3562067,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3562067,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0","1.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3562067,"resolution":"1","location":"assets","locale":"","width":3194,"height":1506},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3562067,"resolution":"2","location":"assets","locale":"","width":3192,"height":1444},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3562067,"resolution":"3","location":"assets","locale":"","width":3194,"height":1694}},"screenshots":{"1":"Dashboard with daily-cap stat card and recent sends panel.","2":"Email Gateway Settings","3":"Email Sent Logs"}},"plugin_section":[],"plugin_tags":[17561,267,6696,48586,6695],"plugin_category":[41],"plugin_contributors":[265958,265942],"plugin_business_model":[],"class_list":["post-322319","plugin","type-plugin","status-publish","hentry","plugin_tags-deliverability","plugin_tags-email","plugin_tags-smtp","plugin_tags-transactional-email","plugin_tags-wp_mail","plugin_category-communication","plugin_contributors-codecasastudios","plugin_contributors-sendemailtoday","plugin_committers-sendemailtoday"],"banners":{"banner":"https:\/\/ps.w.org\/casa-mail\/assets\/banner-772x250.png?rev=3562067","banner_2x":"https:\/\/ps.w.org\/casa-mail\/assets\/banner-1544x500.png?rev=3562067","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/casa-mail\/assets\/icon-128x128.png?rev=3562067","icon_2x":"https:\/\/ps.w.org\/casa-mail\/assets\/icon-256x256.png?rev=3562067","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/casa-mail\/assets\/screenshot-1.png?rev=3562067","caption":"Dashboard with daily-cap stat card and recent sends panel."},{"src":"https:\/\/ps.w.org\/casa-mail\/assets\/screenshot-2.png?rev=3562067","caption":"Email Gateway Settings"},{"src":"https:\/\/ps.w.org\/casa-mail\/assets\/screenshot-3.png?rev=3562067","caption":"Email Sent Logs"}],"raw_content":"<!--section=description-->\n<p>Casa Mail intercepts <code>wp_mail()<\/code> and delivers each message through the Casa Mail transactional email service operated by CodeCasa Studios on the OnlineStoreNotifications infrastructure (api.onlinestorenotifications.com).<\/p>\n\n<p>If your Wordpress site doesn't send emails yet, Casa Mail is the perfect solution to start sending with no technical experience or SMTP API keys. Already send mail? Switch to Casa Mail, save money and improve deliverability.<\/p>\n\n<p>The plugin is intended for sites that want an easy, hassle free wp_mail setup! Improve deliverability of order confirmations, password resets, account-verification emails, and similar transactional traffic with our built-in SMTP server. It does not change anything about how WordPress queues mail; it only changes how the SMTP step is performed.<\/p>\n\n<h4>How it works<\/h4>\n\n<ul>\n<li><code>pre_wp_mail<\/code> is hooked at priority 1. Each call is converted to a JSON payload and POSTed to the gateway.<\/li>\n<li>If the gateway accepts on the first POST, <code>wp_mail()<\/code> returns true and the message is durably enqueued upstream.<\/li>\n<li>If the gateway is unreachable on the first POST, the payload is written to a durable outbox table (<code>&lt;prefix&gt;casamail_outbox<\/code>) and a cron tick retries with 30s, 2m, 10m backoff.<\/li>\n<li>A separate transmit log table (<code>&lt;prefix&gt;casamail_sends<\/code>) records every attempt for visibility on the plugin dashboard. Rows older than 30 days are pruned automatically.<\/li>\n<\/ul>\n\n<h4>Onboarding<\/h4>\n\n<p>After activation, an in-WordPress wizard collects:<\/p>\n\n<ol>\n<li>Site name, site URL, contact email address.<\/li>\n<li>A 6-digit code emailed by the gateway to confirm the address.<\/li>\n<li>Plan selection (one free plan today; paid tiers planned).<\/li>\n<li>Optional: authenticate a sender domain so customer email goes out from your domain with aligned DKIM.<\/li>\n<\/ol>\n\n<h4>Trademark note<\/h4>\n\n<p>This plugin is not affiliated with or endorsed by WooCommerce, Automattic, or any third party. The WooCommerce name appears only as a compatibility note (when WooCommerce is detected, the plugin's admin menu attaches under it for convenience; otherwise it lands under Settings).<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin transmits data to a third-party SMTP gateway. WordPress.org policy requires this be disclosed.<\/p>\n\n<h4>Endpoints contacted<\/h4>\n\n<p>The plugin makes HTTPS requests to:<\/p>\n\n<ul>\n<li><code>https:\/\/api.onlinestorenotifications.com\/v1\/onboard\/request<\/code> \u2014 during onboarding, to send your verification email.<\/li>\n<li><code>https:\/\/api.onlinestorenotifications.com\/v1\/onboard\/verify<\/code> \u2014 during onboarding, to confirm the code and provision an account.<\/li>\n<li><code>https:\/\/api.onlinestorenotifications.com\/v1\/send<\/code> \u2014 for every <code>wp_mail()<\/code> call once the plugin is onboarded.<\/li>\n<li><code>https:\/\/api.onlinestorenotifications.com\/v1\/email\/domain<\/code> (GET \/ add \/ verify) \u2014 when the site administrator interacts with the Sender Domain page.<\/li>\n<\/ul>\n\n<p>The gateway is operated by CodeCasa Studios under the Casa Mail brand and runs on the OnlineStoreNotifications infrastructure. Casa Mail and OnlineStoreNotifications are sister brands of the same company; the API hostname reflects the shared backbone rather than a third-party dependency.<\/p>\n\n<h4>Data sent<\/h4>\n\n<p>During onboarding (one-time, before any send): site administrator email address, site name, site URL.<\/p>\n\n<p>For each <code>wp_mail()<\/code> call once onboarded: sender email address, sender name, recipient email address(es), subject, message body, message headers (after stripping <code>From<\/code>\/<code>To<\/code>\/<code>Subject<\/code>\/<code>Date<\/code>\/<code>Message-ID<\/code>\/<code>MIME-Version<\/code>\/<code>Content-Type<\/code>\/<code>Content-Transfer-Encoding<\/code>).<\/p>\n\n<h4>Terms and privacy<\/h4>\n\n<ul>\n<li>Terms of service: https:\/\/sendemailtoday.io\/terms.html<\/li>\n<li>Privacy policy: https:\/\/sendemailtoday.io\/privacy.html<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>When activated, this plugin transmits email content (recipient, sender, subject, body, headers) to a third-party SMTP gateway for delivery. This is the plugin's only purpose. The data lifecycle is described above under \"External services\" and on the linked privacy policy.<\/p>\n\n<p>The plugin also writes a <code>wp_add_privacy_policy_content()<\/code> block describing what is transmitted; this lets site administrators include the disclosure in the WordPress-managed privacy policy page (Settings -&gt; Privacy).<\/p>\n\n<p>Account deletion: a \"Request account deletion\" button on the plugin's Settings page emails the gateway operator. Upon confirmation, the tenant record, API key(s), domain-authentication records, and recent sending history are removed from the gateway side. The plugin uninstall additionally removes the plugin's WordPress-side options + tables.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin zip via Plugins -&gt; Add New -&gt; Upload Plugin, or extract <code>casa-mail<\/code> into <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate.<\/li>\n<li>WooCommerce -&gt; Casa Mail (or Settings -&gt; Casa Mail if WooCommerce is not installed) launches the onboarding wizard.<\/li>\n<\/ol>\n\n<p>The plugin requires PHP 7.4 or newer and WordPress 6.0 or newer.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20existing%20smtp%20plugins%3F\"><h3>Does this replace existing SMTP plugins?<\/h3><\/dt>\n<dd><p>Yes. The plugin hooks <code>pre_wp_mail<\/code> at priority 1, which runs before most SMTP plugins. For predictable behaviour, disable other mail routers (FluentSMTP, WP Mail SMTP, etc) when this plugin is active.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20gateway%20is%20unreachable%3F\"><h3>What happens if the gateway is unreachable?<\/h3><\/dt>\n<dd><p>Calls land in a durable retry outbox and a 60-second cron drains them with 30s \/ 2m \/ 10m backoff. After three failed retries the row is marked failed and preserved for diagnosis. <code>wp_mail()<\/code> always returns true (the plugin guarantees zero-loss + zero-blocking).<\/p><\/dd>\n<dt id=\"how%20is%20the%20from%3A%20address%20handled%3F\"><h3>How is the From: address handled?<\/h3><\/dt>\n<dd><p>If the site has verified a sender domain through the plugin's Sender Domain page, the plugin rewrites the From address to <code>noreply@&lt;verified-domain&gt;<\/code> so DKIM aligns. If the caller (WooCommerce, WordPress core, etc) already supplies a From address inside the verified domain, that address is honored. A \"Default From\" override is also available on the Settings page.<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20what%20was%20sent%3F\"><h3>Where can I see what was sent?<\/h3><\/dt>\n<dd><p>The dashboard's \"Recent sends\" panel lists the most recent 10 wp_mail() calls intercepted by the plugin. The Logs page extends this to the last 200. Rows older than 30 days are pruned automatically.<\/p><\/dd>\n<dt id=\"how%20do%20i%20delete%20my%20account%3F\"><h3>How do I delete my account?<\/h3><\/dt>\n<dd><p>Settings -&gt; Delete my account -&gt; Request account deletion. This emails the gateway operator who removes the tenant + API key + history within 48 hours and replies to the contact email on completion. The plugin uninstall (Plugins -&gt; Delete) handles the WordPress-side cleanup.<\/p><\/dd>\n<dt id=\"is%20this%20affiliated%20with%20woocommerce%3F\"><h3>Is this affiliated with WooCommerce?<\/h3><\/dt>\n<dd><p>No. WooCommerce is an Automattic trademark and this plugin is not endorsed by or affiliated with Automattic. The plugin only mentions WooCommerce as a compatibility note (the admin menu nests under WooCommerce when present, for ergonomic reasons).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.0<\/h4>\n\n<p>Renamed the plugin to Casa Mail (display name and slug). No functional change to mail handling - the same CodeCasa-operated transactional gateway on the OnlineStoreNotifications backbone. WordPress option keys, the outbox table, and the sends-log table now use the <code>casamail_<\/code> prefix; the admin menu pages, AJAX actions, cron hooks, script handles, and PHP namespace were prefixed to match. Existing installs re-run onboarding once after upgrade because the stored option keys changed prefix.<\/p>\n\n<h4>1.3.5<\/h4>\n\n<p>Sender Domain page no longer shows the yellow \"Using Cloudflare?\" advice boxes once a record is OK. They were setup hints meant for users who hadn't added the entries yet; sitting next to a green VERIFIED pill they made it look like something was wrong. Now hidden per-record: the apex \"trim the dot\" hint hides once overall status is <code>verified<\/code>, the Return-Path \"set to DNS only\" hint hides once that individual record's status is <code>OK<\/code>.<\/p>\n\n<h4>1.3.4<\/h4>\n\n<p>WordPress.org Plugin Check pass. All ERROR-level findings resolved: <code>translators:<\/code> comments added on the two placeholder-bearing translation strings; output escaped in the dashboard stat cards (<code>esc_html(number_format_i18n(...))<\/code>); <code>parse_url()<\/code> replaced with <code>wp_parse_url()<\/code>; <code>$wpdb-&gt;prepare()<\/code> brought to the OUTBOX_TABLE INSERT; <code>Tested up to<\/code> bumped to 7.0. Removed <code>load_plugin_textdomain()<\/code> (auto-loaded on WP.org since 4.6). Added <code>phpcs:disable<\/code> blocks with documented rationale for the false-positive WARNING-level findings: NonceVerification on AJAX handlers (the nonce IS verified - in <code>ajax_guard()<\/code>, just not inline), DirectDatabaseQuery + InterpolatedNotPrepared on the plugin's own custom tables (table names are hard-coded class constants, no user input, no object-cache layer for transmit logs), and PrefixAllGlobals on template files whose locals come from <code>extract()<\/code>. Bootstrap rewritten to use a closure so no <code>$set_gateway<\/code> global leaks into the WordPress namespace.<\/p>\n\n<h4>1.3.3<\/h4>\n\n<p>Dashboard banner (\"Sending from the shared sender\") no longer hardcodes <code>noreply@onlinestorenotifications.com<\/code> - it now shows the tenant's actual <code>&lt;slug&gt;@onlinestorenotifications.com<\/code> address (the inbox they picked at Step 3), matching what customers actually see in the From line. Fallback is the legacy <code>noreply@<\/code> for tenants on installs older than 1.1 who don't have a mailbox_slug yet.<\/p>\n\n<h4>1.3.2<\/h4>\n\n<p>Step 3 (\"Your inbox\") no longer pre-locks the domain in the customer's mental model. The preview now reads <code>slug@...<\/code> (with a literal ellipsis after the <code>@<\/code>), and a short helper line tells them Step 5 is where they pick the actual domain (the shared one, or their own). The host hint next to the rename input is also <code>@...<\/code>. Step 5 \"Use this address\" button no longer pops a confirmation modal - the card already explains the trade-offs, the second confirmation was pure friction; the click now fires the AJAX straight away. Stale \"noreply@\" copy in the populated Sender Domain page banner and the success notice is gone; both now use the tenant's actual slug address. Translated into all 8 bundled locales.<\/p>\n\n<h4>1.3.1<\/h4>\n\n<p>Step 5 (the sender-domain choice) now shows the user's actual inbox slug + addresses instead of generic placeholders. The page leads with \"Your inbox name is <code>acmestore<\/code>. Where would you like to use it?\" and each choice card previews the literal address customers will see (<code>acmestore@onlinestorenotifications.com<\/code> or <code>acmestore@yourstore.com<\/code>). Inline domain-input form's example also uses the user's slug. SG.mailboxSlug + SG.mailboxEmail stay in sync through OTP verify + rename so step 5 always reflects the chosen slug, even if the user renamed in step 3.<\/p>\n\n<h4>1.3<\/h4>\n\n<p>Wizard step 5 (\"Sender domain\") rewritten for non-technical users:\n* Step heading is now \"Where should your emails come from?\" instead of \"Authenticate your sender domain\".\n* Two equal-weight side-by-side cards present the choice as either\/or, not as \"do this complex thing OR skip it\". One card is \"Use the Casa Mail address\" (easiest), the other is \"Use your own domain\" (on-brand). On phones the cards stack.\n* Domain input field is hidden until the user picks \"Set up my own domain\" - clicking the card's button reveals a small inline form. Keeps the choice screen uncluttered.\n* DNS-records copy after provisioning uses plain English: \"Add these 3 entries to your domain settings\" instead of \"Publish these 3 DNS records\". Mentions Cloudflare \/ GoDaddy \/ Namecheap \/ Google Domains by name so users recognise where they're going. \"Verify DNS\" button relabelled \"Check my domain\".\n* SPF helper text explains the \"merge into existing v=spf1 record\" instruction in plain English.\n* Cloudflare grey-cloud tip explains why (not just \"set to DNS only\") - replies coming back from your customers depend on it.\n* The duplicate \"Use shared sender\" button in the wizard footer is gone - the shared-sender path is now one of the two main cards. The footer now shows only \"I will decide later\" + the post-verify \"Finish\" CTA.<\/p>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Use the tenant's chosen <code>mailbox_slug<\/code> as the From local-part on their own verified domain too, not just on the OSN side. Onboarding picks (or the user renames) <code>acmestore<\/code> as the inbox handle, and from then on customer-facing emails go from <code>acmestore@theirdomain.com<\/code> (after domain verification) AND <code>acmestore@onlinestorenotifications.com<\/code> (Reply-To target, where replies route through). One consistent identity across both addresses; no more <code>noreply@<\/code> in the customer-facing From.<\/li>\n<li>Gateway's <code>activateTenantSender<\/code> now overwrites any <code>@onlinestorenotifications.com<\/code> sender_email when a tenant verifies their own domain \u2014 previously it only matched the legacy shared <code>noreply@osn<\/code> value, leaving v1.1 per-tenant slug addresses stuck on OSN after domain verification.<\/li>\n<li>Operator-configured <code>default_from<\/code> on the Settings page still wins over the slug-based default.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<p>Per-tenant inbox feature (foundation for the paid webmail tier):\n* Every onboarded tenant now gets their own inbox at <code>&lt;slug&gt;@onlinestorenotifications.com<\/code>. The slug is derived from the site URL host (strips common subdomain noise like <code>www.<\/code>, <code>shop.<\/code>, <code>sms.<\/code>) with a fallback to <code>store-xxxxxx<\/code> for collisions.\n* New wizard step between OTP verification and plan selection lets the user accept the suggested inbox name or rename it inline with live availability checking.\n* When the tenant is on the shared sender, every wp_mail() now goes from <code>&lt;slug&gt;@onlinestorenotifications.com<\/code> instead of the generic <code>noreply@onlinestorenotifications.com<\/code>. Replies route directly to the tenant's inbox.\n* When the tenant has authenticated their own domain, From stays on their domain but a <code>Reply-To: &lt;slug&gt;@onlinestorenotifications.com<\/code> header is injected so replies still arrive in the OSN inbox.\n* Free tier auto-forwards inbox mail to the tenant's contact email via a Postfix virtual-alias map backed by a MariaDB view. The view is regenerated every 60s by a host systemd timer; no manual sync needed when tenants onboard or rename.\n* New gateway endpoints: <code>GET \/v1\/email\/mailbox<\/code> (read current inbox state), <code>POST \/v1\/email\/mailbox\/check<\/code> (live slug validation without mutating), <code>POST \/v1\/email\/mailbox\/rename<\/code> (atomic rename with UNIQUE-index protection).\n* A <code>webmail_enabled<\/code> flag exists on tenants for the future paid tier; when flipped on, the alias destination changes from \"forward to contact_email\" to \"store in Maildir\" \u2014 Roundcube auto-login + IMAP provisioning will arrive in a follow-up release.<\/p>\n\n<h4>1.0<\/h4>\n\n<p>First stable public release. Consolidates the 0.4.x WordPress.org compliance work and the 0.5.0 shared-sender feature, plus two correctness fixes shipped during end-to-end testing:\n* Onboarding submenu is now registered even when the plugin is already onboarded - the wizard URL gracefully renders the \"Setup is already complete - Open dashboard\" branch instead of WP's bare \"not allowed\" page when the admin_init redirect races a page-cache or back-button.\n* Stale-clone fix on the standalone Sender Domain page: the verified-state celebration banner (cloned from a template with the <code>hidden<\/code> HTML attribute) was being forced visible by <code>display: flex<\/code> in CSS, leaking a green \"verified\" banner onto the pending-records view. CSS now uses <code>:not([hidden])<\/code> so the attribute wins.\n* <code>activateTenantSender()<\/code> on the gateway now overwrites the shared-sender address when a tenant who previously opted into the shared path verifies their own domain. Previously the <code>COALESCE<\/code> guard kept <code>sender_email<\/code> pinned to <code>noreply@onlinestorenotifications.com<\/code> forever, so verification succeeded but sends never moved over to the customer's domain.<\/p>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Add the \"Use shared sender\" option to the onboarding wizard's step 4 and the standalone Sender Domain page. Tenants who don't want to authenticate their own domain can route every wp_mail() from <code>noreply@onlinestorenotifications.com<\/code> instead - DKIM + SPF + Return-Path are already configured for that domain on the gateway side, so mail arrives signed and aligned (cost: Gmail shows \"via onlinestorenotifications.com\" in the sender chrome).<\/li>\n<li>New gateway endpoint: <code>POST \/v1\/email\/domain\/skip<\/code> - sets <code>tenants.sender_email<\/code> to the shared address so Transport's <code>fromFor()<\/code> picks it up on every send.<\/li>\n<li>Plugin's <code>from_email()<\/code> now short-circuits to the shared address when <code>domain_status === 'shared'<\/code>, so the WP-side <code>wp_casamail_sends<\/code> log reflects the actual From the recipient will see (no drift between plugin log and Postal envelope).<\/li>\n<li>Inject a <code>Reply-To<\/code> header whenever the plugin rewrites the From, so customer replies still reach the original mailbox (caller-supplied From, or the tenant's contact email as fallback). Skipped when the caller already set Reply-To.<\/li>\n<li>Dashboard banner gains a blue informational variant for the shared-sender state (vs. the existing orange warning for \"authenticate your domain\").<\/li>\n<\/ul>\n\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Switch the account-deletion + error-message support address from <code>support@sendemailtoday.io<\/code> to <code>support@onlinestorenotifications.com<\/code>. The OSN mailbox already exists on the gateway's role-mailbox stack and is the same support address the onboarding OTP email body has always referenced.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Replace the inline <code>&lt;script&gt;<\/code> block in <code>show_onboarding_notice<\/code> with a separately-enqueued <code>assets\/js\/notice-dismiss.js<\/code>, loaded only when the notice would render.<\/li>\n<li>Remove dead URL-based notice-dismiss code path (was unreachable from the UI - everything went via the AJAX path).<\/li>\n<li>Route the account-deletion request email through the gateway instead of bypassing it - the previous <code>X-SET-Outbox: 1<\/code> shortcut relied on the host's PHP <code>mail()<\/code> being functional, which most managed WordPress hosts disable.<\/li>\n<li>Drop unused <code>set_gateway_get_dashboard<\/code> and <code>set_gateway_get_logs<\/code> AJAX endpoints that were scaffolded for a polling feature never implemented.<\/li>\n<li>Replace the <code>woocommerce<\/code> readme tag with <code>deliverability<\/code> to sidestep the trademark concern when listing on WordPress.org.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Add <code>readme.txt<\/code> and WP.org submission compliance.<\/li>\n<li>Add <code>wp_add_privacy_policy_content()<\/code> registration for Settings -&gt; Privacy.<\/li>\n<li>Add data-disclosure paragraph on the onboarding wizard's first step.<\/li>\n<li>Add Settings -&gt; Delete my account flow that emails the gateway operator.<\/li>\n<li>Make the persistent onboarding notice dismissible per-user, resurfaces on plugin upgrade.<\/li>\n<li>Replace <code>window.prompt()<\/code> calls with an accessible in-page modal.<\/li>\n<li>Move every user-facing JS string through <code>wp_localize_script<\/code> so the plugin is fully translatable.<\/li>\n<li>Add <code>load_plugin_textdomain<\/code> and ship translations for <code>de_DE<\/code>, <code>es_ES<\/code>, <code>fr_FR<\/code>, <code>it_IT<\/code>, <code>ja<\/code>, <code>nl_NL<\/code>, <code>pl_PL<\/code>, <code>pt_BR<\/code>.<\/li>\n<li>Replace <code>wp_unschedule_event<\/code> with <code>wp_clear_scheduled_hook<\/code> in deactivate to defend against duplicate-scheduled hooks.<\/li>\n<li>Annotate intentional unprepared <code>$wpdb<\/code> queries with <code>phpcs:ignore<\/code> comments + justifications.<\/li>\n<li>Replace inline <code>style=\"\"<\/code> attributes with CSS classes (<code>set-gw-notice-cta<\/code>, <code>set-logs-section-heading<\/code>, <code>set-danger-zone<\/code>, <code>set-gw-modal<\/code>).<\/li>\n<li>Move sales copy out of the plugin header into the Description section here.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Add <code>Sent (24h)<\/code> stat card on the dashboard.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Add post-verify celebration banner with Send Test Email and Open Dashboard CTAs.<\/li>\n<li>Patch the verifier to bypass <code>systemd-resolved<\/code> and query DNS via <code>dig @1.1.1.1<\/code> directly so a freshly-flipped Cloudflare proxy switch is reflected immediately.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Auto-rewrite From to <code>noreply@&lt;verified-domain&gt;<\/code> when the WC-supplied From is outside the verified domain.<\/li>\n<li>Add <code>wp_casamail_sends<\/code> transmit-log table + Recent sends dashboard panel.<\/li>\n<li>On plugin reinstall, rotate the API key and surface any existing sender-domain record so missing DNS records are visible immediately.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>In-WordPress onboarding wizard.<\/li>\n<li>Durable retry outbox.<\/li>\n<\/ul>","raw_excerpt":"Send emails reliably in just a few clicks. No SMTP server or technical knowledge required. Route every wp_mail() through the Casa Mail SMTP gateway an &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/322319","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=322319"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sendemailtoday"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=322319"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=322319"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=322319"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=322319"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=322319"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=322319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}