{"id":292119,"date":"2026-04-11T12:27:30","date_gmt":"2026-04-11T12:27:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/m365-mailer\/"},"modified":"2026-04-11T12:27:13","modified_gmt":"2026-04-11T12:27:13","slug":"vr-smtp-mailer","status":"publish","type":"plugin","link":"https:\/\/ku.wordpress.org\/plugins\/vr-smtp-mailer\/","author":6331257,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.10","stable_tag":"trunk","tested":"6.9.4","requires":"6.2","requires_php":"","requires_plugins":null,"header_name":"VR SMTP Mailer","header_author":"vinodkram","header_description":"Sends WordPress mail via SMTP or OAuth mail APIs (Graph-compatible) with logging and queueing.","assets_banners_color":"488ad0","last_updated":"2026-04-11 12:27:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/vr-smtp-mailer\/","header_author_uri":"https:\/\/profiles.wordpress.org\/vinodkram\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":23,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3503943,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3503943,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3503943,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3503943,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3503973,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3503973,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3503973,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3503973,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3503973,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3503973,"resolution":"7","location":"assets","locale":""},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3503973,"resolution":"8","location":"assets","locale":""},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3503973,"resolution":"9","location":"assets","locale":""}},"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[186633,2061,203575,193628,25906],"plugin_category":[38],"plugin_contributors":[251128],"plugin_business_model":[],"class_list":["post-292119","plugin","type-plugin","status-publish","hentry","plugin_tags-microsoft-365","plugin_tags-oauth","plugin_tags-office365","plugin_tags-outlook-smtp","plugin_tags-wordpress-smtp","plugin_category-authentication","plugin_contributors-vinodkram","plugin_committers-vinodkram"],"banners":{"banner":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/banner-772x250.png?rev=3503943","banner_2x":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/banner-1544x500.png?rev=3503943","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/icon-256x256.png?rev=3503943","icon_2x":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/icon-256x256.png?rev=3503943","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-1.png?rev=3503943","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-2.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-3.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-4.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-5.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-6.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-7.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-8.png?rev=3503973","caption":""},{"src":"https:\/\/ps.w.org\/vr-smtp-mailer\/assets\/screenshot-9.png?rev=3503973","caption":""}],"raw_content":"<!--section=description-->\n<p>VR SMTP Mailer replaces the default WordPress mail transport with SMTP or an OAuth-based mail API, with full support for Microsoft 365 (Office365), Outlook SMTP, and Microsoft Graph API.<\/p>\n\n<p>It is designed as a complete email solution for WordPress \u2014 combining SMTP delivery, OAuth authentication, and API-based sending in a single plugin, without requiring multiple paid extensions.<\/p>\n\n<h3>Why choose this plugin<\/h3>\n\n<ul>\n<li>Works with Microsoft 365 \/ Office365 and Outlook SMTP<\/li>\n<li>Supports both SMTP and OAuth (Graph API) in one plugin<\/li>\n<li>No need to install multiple plugins for authentication and email delivery<\/li>\n<li>Designed to work as a full wp_mail replacement<\/li>\n<li>Includes features commonly available only in paid plugins<\/li>\n<li>No subscriptions or locked features<\/li>\n<\/ul>\n\n<p>Send emails using either SMTP or an OAuth-based mail API (Graph-compatible).\nWorks with wp_mail() (for immediate sends):\nWhen WordPress sends emails through this plugin, it keeps the same structure as the default wp_mail() function. This includes support for multiple recipients, subject, message body, headers (From, Cc, Bcc, Reply-To, Content-Type), attachments, and inline images where supported.\nStandard WordPress filters like wp_mail, wp_mail_from, wp_mail_content_type, and phpmailer_init are applied in SMTP mode, so behavior remains consistent with native WordPress email handling.\nGraph API limitations:\nWhen using the Graph API, emails support HTML or plain text content, along with To, Cc, Bcc, and Reply-To fields. Attachments and inline images are supported, but typically limited to around 3 MB per file.\nCustom MIME headers are not fully supported, and only standard fields are mapped to the API. More complex email structures may behave differently compared to traditional PHP mail handling.\nEmail queue (WP-Cron):\nEmails can be queued and processed later using WP-Cron. Queued emails store only basic details such as recipient, subject, and message body. Attachments, headers, and inline images are not included in queued jobs.\nAutomatic OAuth token refresh:\nAccess tokens are refreshed automatically to ensure uninterrupted email delivery.\nSecure OAuth handling:\nToken exchange (authorization code to access\/refresh tokens) is restricted to users with administrator-level permissions (manage_options). You must be logged in as an admin when completing the OAuth connection.\nTesting tools included:\nIncludes a built-in test email feature and an SMTP connection tester to help verify configuration.\nLogging and debugging:\nEmail activity and debug information are stored in custom database tables for troubleshooting and monitoring.<\/p>\n\n<p>Security and stored secrets<\/p>\n\n<p>This plugin stores SMTP passwords, OAuth client secrets, refresh tokens, and access tokens in the WordPress options table, using the same approach as most WordPress settings. These values are not encrypted at rest.<\/p>\n\n<p>Anyone with access to the database, a full site backup, or an administrator account could potentially view this information. It\u2019s recommended to use strong admin credentials, secure hosting, and limit your app permissions to only what is required.<\/p>\n\n<p>This plugin is not affiliated with or endorsed by Microsoft. Microsoft, Microsoft 365, Azure, Office, and related names are trademarks of Microsoft Corporation. These names are used only to describe compatibility and technical functionality.<\/p>\n\n<p>Do not use Microsoft or related logos, branding, or visual assets in your plugin icon, banner, or screenshots on WordPress.org. Use your own branding and neutral visuals.<\/p>\n\n<p>Third-party services<\/p>\n\n<p>This plugin connects to external services only when required for email delivery or authentication. It does not send general site traffic or unrelated data to third parties.<\/p>\n\n<p>Microsoft identity platform (OAuth2) \u2014 login.microsoftonline.com<\/p>\n\n<p>What it is\nThis is Microsoft\u2019s OAuth2 authentication service (also known as the Microsoft Identity Platform or Entra ID). It is used when you connect your account using OAuth.<\/p>\n\n<p>What it is used for<\/p>\n\n<p>Signing in through Microsoft\nExchanging authorization codes for access and refresh tokens\nRefreshing expired access tokens<\/p>\n\n<p>What data is sent and when<\/p>\n\n<p>During login (via browser): client ID, redirect URI, requested scopes (such as Mail.Send, User.Read), and a state parameter for security\nDuring token exchange (server-side): authorization code, client ID, client secret, redirect URI, grant type, and scopes<\/p>\n\n<p>Terms\nhttps:\/\/www.microsoft.com\/servicesagreement<\/p>\n\n<p>Privacy\nhttps:\/\/privacy.microsoft.com\/privacystatement<\/p>\n\n<p>Microsoft Graph API \u2014 graph.microsoft.com<\/p>\n\n<p>What it is\nMicrosoft\u2019s API for accessing Microsoft 365 services, including sending emails.<\/p>\n\n<p>What it is used for\nSending emails through the Graph API (\/v1.0\/me\/sendMail).<\/p>\n\n<p>What data is sent and when\nWhen an email is sent (including test emails), the plugin makes a secure HTTPS request that includes:<\/p>\n\n<p>An OAuth access token\nEmail details such as recipients, subject, message body, and optional Cc\/Bcc\/Reply-To\nAttachments or inline images (within API limits)<\/p>\n\n<p>Terms\nhttps:\/\/www.microsoft.com\/servicesagreement<\/p>\n\n<p>Privacy\nhttps:\/\/privacy.microsoft.com\/privacystatement<\/p>\n\n<p>Note: Use of Microsoft APIs is also subject to Microsoft\u2019s developer and product terms. Refer to https:\/\/www.microsoft.com\/legal\/\n for details.<\/p>\n\n<p>User-configured SMTP server<\/p>\n\n<p>What it is\nAn SMTP server that you configure (for example, your hosting provider, Microsoft 365, Google Workspace, or another email service).<\/p>\n\n<p>What it is used for\nSending emails using your SMTP credentials.<\/p>\n\n<p>What data is sent and when\nWhenever an email is sent (including test emails), the plugin transmits:<\/p>\n\n<p>SMTP credentials (if configured)\nEmail content such as recipients, subject, and message body<\/p>\n\n<p>This plugin does not control or manage the infrastructure of your SMTP provider.<\/p>\n\n<p>Terms and privacy\nYou are responsible for reviewing the terms and privacy policy of your email provider. This plugin does not replace or override those agreements.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>vr-smtp-mailer<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the \"Plugins\" menu in WordPress.<\/li>\n<li>Go to <strong>VR SMTP Mailer \u2192 Settings<\/strong> to configure:\n\n<ul>\n<li>Choose provider (SMTP or Graph OAuth mail).<\/li>\n<li>Enter SMTP host, username, password, and port, or tenant ID, client ID, and client secret for OAuth.<\/li>\n<li>Set From Email and From Name.<\/li>\n<li>Enable Debug Mode if desired.<\/li>\n<\/ul><\/li>\n<li>For Graph OAuth mail:\n\n<ul>\n<li>Save settings, then click <strong>Sign in to connect<\/strong> and complete the OAuth consent.<\/li>\n<li>Add the <strong>Authorization Redirect URI<\/strong> shown on the settings page to your cloud identity app registration (for example <code>https:\/\/yoursite.com\/vr-smtp-mailer-oauth<\/code>). Legacy paths <code>\/vr-smtp-oauth<\/code> and <code>\/m365-mailer-oauth<\/code> still work if you registered those URLs earlier.<\/li>\n<\/ul><\/li>\n<li>Use <strong>VR SMTP Mailer \u2192 Test Email<\/strong> to verify sending.<\/li>\n<li>Use <strong>VR SMTP Mailer \u2192 SMTP Tester<\/strong> to verify SMTP connectivity.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20replace%20the%20default%20%60wp_mail%60%20behavior%3F\"><h3>Does this plugin replace the default `wp_mail` behavior?<\/h3><\/dt>\n<dd><p>Yes. Emails are queued and delivered via the configured provider (SMTP or Graph OAuth mail) using WP-Cron.<\/p><\/dd>\n<dt id=\"does%20it%20require%20wp-cron%20to%20be%20enabled%3F\"><h3>Does it require WP-Cron to be enabled?<\/h3><\/dt>\n<dd><p>Yes. The queue worker runs on a custom five-minute cron schedule.<\/p><\/dd>\n<dt id=\"why%20does%20the%20readme%20list%20%E2%80%9Cvinodkram%E2%80%9D%20under%20contributors%3F\"><h3>Why does the readme list \u201cvinodkram\u201d under Contributors?<\/h3><\/dt>\n<dd><p>WordPress.org uses contributor <strong>profile usernames<\/strong> (slugs), not display names. List your WordPress.org username exactly as it appears in your profile URL (<code>https:\/\/profiles.wordpress.org\/username\/<\/code>).<\/p><\/dd>\n<dt id=\"what%20should%20plugin%20uri%20and%20author%20uri%20use%3F\"><h3>What should Plugin URI and Author URI use?<\/h3><\/dt>\n<dd><p>For this plugin, <strong>Plugin URI<\/strong> is the WordPress.org directory page: <code>https:\/\/wordpress.org\/plugins\/vr-smtp-mailer\/<\/code> (slug <strong><code>vr-smtp-mailer<\/code><\/strong>, same as the <strong>Text Domain<\/strong> and the plugin directory name). <strong>Author URI<\/strong> is <code>https:\/\/profiles.wordpress.org\/vinodkram\/<\/code>. If your approved slug on WordPress.org ever differs, update the Plugin URI in the main PHP file header to match <code>https:\/\/wordpress.org\/plugins\/{your-slug}\/<\/code>. Avoid URLs that could be mistaken for an official vendor or Microsoft property.<\/p><\/dd>\n<dt id=\"what%20about%20banners%20and%20icons%3F\"><h3>What about banners and icons?<\/h3><\/dt>\n<dd><p>Do not use Microsoft, Windows, Office, Azure, or other vendors\u2019 logos, trademarks, or trade dress in your WordPress.org banner, icon, or screenshots. Use your own branding and neutral artwork.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.10<\/h4>\n\n<ul>\n<li><strong>WordPress.org slug:<\/strong> Public plugin slug and directory name <strong><code>vr-smtp-mailer<\/code><\/strong>. Text domain <strong><code>vr-smtp-mailer<\/code><\/strong>; PHP prefix <strong><code>VR_SMTP_MAILER_<\/code><\/strong> and option\/hook prefix <strong><code>vr_smtp_mailer_<\/code><\/strong>; admin screen and asset handles use the <strong><code>vr-smtp-mailer-*<\/code><\/strong> pattern.<\/li>\n<li><strong>OAuth redirect:<\/strong> Canonical path <strong><code>\/vr-smtp-mailer-oauth<\/code><\/strong>; <strong><code>\/vr-smtp-oauth<\/code><\/strong> and <strong><code>\/m365-mailer-oauth<\/code><\/strong> remain supported for existing app registrations.<\/li>\n<li><strong>Migration:<\/strong> On upgrade, copies options and renames custom tables from prior <code>vr_smtp_*<\/code> keys\/names when needed; clears legacy <code>vr_smtp_process_queue<\/code> cron in favor of <strong><code>vr_smtp_mailer_process_queue<\/code><\/strong>.<\/li>\n<li><strong>Bootstrap file:<\/strong> Main plugin file is <strong><code>vr-smtp-mailer.php<\/code><\/strong>.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li><strong>wp_mail-style delivery:<\/strong> Mailers now receive full <code>pre_wp_mail<\/code> arguments\u2014headers (From, Cc, Bcc, Reply-To, Content-Type, custom headers on SMTP), attachments, and embeds\u2014so immediate sends align much more closely with core <code>wp_mail()<\/code>. SMTP path runs <code>phpmailer_init<\/code> and standard <code>wp_mail_*<\/code> filters.<\/li>\n<li><strong>Graph sendMail:<\/strong> Maps To\/Cc\/Bcc\/Reply-To, HTML vs plain text, attachments, and inline embeds (per-file size limit for base64 payload); documents Graph vs SMTP differences in the readme.<\/li>\n<li><strong>OAuth:<\/strong> Admin-only (<code>manage_options<\/code>) token exchange on both the admin callback and the pretty redirect URL; non-admins are redirected back to settings with an error.<\/li>\n<li><strong>Readme:<\/strong> Expanded Description\u2014<code>wp_mail<\/code> parity, Graph limits, queue storage limits, credential storage disclosure.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Requires WordPress <strong>6.2+<\/strong> for <code>%i<\/code> identifier placeholders in <code>$wpdb-&gt;prepare()<\/code> (debug log queries). Database calls use prepared statements without raw <code>$sql<\/code> variables.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li><strong>Text Domain<\/strong> and all <code>__()<\/code> \/ <code>esc_html__()<\/code> calls use <strong><code>vr-smtp<\/code><\/strong> to match the WordPress.org plugin directory slug. <code>VR_SMTP_PLUGIN_SLUG<\/code> is <strong><code>vr-smtp<\/code><\/strong>. OAuth redirect URI is <strong><code>\/vr-smtp-oauth<\/code><\/strong>; <strong><code>\/vr-smtp-mailer-oauth<\/code><\/strong> and <strong><code>\/m365-mailer-oauth<\/code><\/strong> remain supported for existing Azure app registrations.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Restored <strong>Text Domain<\/strong> and <code>VR_SMTP_PLUGIN_SLUG<\/code> to <strong><code>vr-smtp-mailer<\/code><\/strong>. Canonical OAuth redirect path is <code>\/vr-smtp-mailer-oauth<\/code>; <code>\/vr-smtp-oauth<\/code> and <code>\/m365-mailer-oauth<\/code> remain supported for existing app registrations. For WordPress.org, the plugin directory name must match the text domain (use the <code>vr-smtp-mailer<\/code> folder).<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Text domain and <code>VR_SMTP_PLUGIN_SLUG<\/code> aligned with the plugin directory slug <code>vr-smtp<\/code> (WordPress.org requirement). OAuth redirect URI is <code>\/vr-smtp-oauth<\/code>; <code>\/vr-smtp-mailer-oauth<\/code> and <code>\/m365-mailer-oauth<\/code> remain supported for existing app registrations.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Readme: documented third-party and external services (Microsoft identity OAuth, Microsoft Graph, user-configured SMTP); what data is sent and when; links to terms and privacy policies.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Readme: contributor field uses WordPress.org username; Plugin URI \/ Author URI point to WordPress.org; tags and marketing copy reduced unnecessary trademark use; clearer disclaimer and asset guidance.<\/li>\n<li>Admin: \u201cAuthorize Microsoft\u201d replaced with neutral \u201cSign in to connect\u201d; Graph section labels softened while keeping technical behavior unchanged.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Text domain <code>vr-smtp-mailer<\/code> (matches plugin slug). All <code>__()<\/code>, <code>_e()<\/code>, <code>esc_html__()<\/code>, and related calls updated; <code>load_plugin_textdomain()<\/code> loads translations from <code>\/languages<\/code>.<\/li>\n<li>Plugin directory slug is <code>vr-smtp-mailer<\/code> (was <code>vr-smtp<\/code>). OAuth redirect URI is <code>\/vr-smtp-mailer-oauth<\/code>; <code>\/vr-smtp-oauth<\/code> and <code>\/m365-mailer-oauth<\/code> remain supported for existing Azure app registrations.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed plugin to VR SMTP (directory <code>vr-smtp<\/code>, text domain <code>vr-smtp<\/code>). Migration preserves settings and renames database tables from the previous release.<\/li>\n<li>OAuth callback accepts the legacy <code>\/m365-mailer-oauth<\/code> path for existing Azure redirect URIs.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"SMTP or Microsoft Graph OAuth mail for WordPress. Full wp_mail replacement with logging, queue, and SMTP\/email test tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/292119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=292119"}],"author":[{"embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vinodkram"}],"wp:attachment":[{"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=292119"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=292119"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=292119"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=292119"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=292119"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ku.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=292119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}