{"id":27948,"date":"2014-02-23T23:07:26","date_gmt":"2014-02-23T23:07:26","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/my-newsletter\/"},"modified":"2026-04-07T21:04:56","modified_gmt":"2026-04-07T21:04:56","slug":"my-newsletter","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/my-newsletter\/","author":10295118,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.6.1","stable_tag":"2.6.1","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"My Newsletter","header_author":"Radovan Georgijevic","header_description":"","assets_banners_color":"e0e0e0","last_updated":"2026-04-07 21:04:56","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/my-newsletter\/","header_author_uri":"https:\/\/radovangeorgijevic.com","rating":5,"author_block_rating":0,"active_installs":10,"downloads":4209,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.0.7":{"tag":"0.0.7","author":"Georgijevic","date":"2014-02-23 23:20:01"},"0.0.8":{"tag":"0.0.8","author":"Georgijevic","date":"2014-02-23 23:29:17"},"0.0.9":{"tag":"0.0.9","author":"Georgijevic","date":"2014-02-24 00:05:34"},"0.1.0":{"tag":"0.1.0","author":"Georgijevic","date":"2014-02-24 07:53:03"},"0.1.1":{"tag":"0.1.1","author":"Georgijevic","date":"2014-03-20 01:14:17"},"0.1.2":{"tag":"0.1.2","author":"Georgijevic","date":"2014-03-20 01:29:44"},"0.1.3":{"tag":"0.1.3","author":"Georgijevic","date":"2014-09-26 21:38:14"},"1.0.0":{"tag":"1.0.0","author":"Georgijevic","date":"2014-09-27 07:54:06"},"1.0.1":{"tag":"1.0.1","author":"Georgijevic","date":"2014-09-27 07:40:36"},"2.0.2":{"tag":"2.0.2","author":"Georgijevic","date":"2026-02-26 21:00:34"},"2.6.1":{"tag":"2.6.1","author":"Georgijevic","date":"2026-04-07 21:04:56"}},"upgrade_notice":{"2.6.0":"<p>Manage saved email templates from a new Templates submenu (create\/edit\/rename\/duplicate\/delete).<\/p>","2.4.1":"<p>SMTP Test tool added in Settings.<\/p>","2.4.0":"<p>Built-in SMTP settings (smtp.hostinger.com compatible) and improved Settings guidance for Hostinger sending limits.<\/p>","2.3.3":"<p>Optional file logging + safer queue processing (locking\/claiming) for troubleshooting large sends.<\/p>","2.3.2":"<p>Plugin Check fixes: improved filesystem\/CSV export\/SQL prepare handling.<\/p>","2.2.0":"<p>List management + suppression UI, plus import preview and merge rules.<\/p>","2.1.0":"<p>Mailing list import is now available (CSV\/TXT, simple XLSX, or paste). You can now send campaigns to imported subscribers as a new recipient source.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":"3"},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3470678,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3470678,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3501085,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3501085,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.0.7","0.0.8","0.0.9","0.1.0","0.1.1","0.1.2","0.1.3","1.0.0","1.0.1","2.0.2","2.6.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Campaign composer screen","2":"Settings screen","3":"Campaign progress table","4":"Mailing List screen (import + subscriber table)"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[264,1021,5825,455,6696],"plugin_category":[42],"plugin_contributors":[88496],"plugin_business_model":[],"class_list":["post-27948","plugin","type-plugin","status-publish","hentry","plugin_tags-email-marketing","plugin_tags-email-newsletter","plugin_tags-mailing-list","plugin_tags-newsletter","plugin_tags-smtp","plugin_category-contact-forms","plugin_contributors-georgijevic","plugin_committers-georgijevic"],"banners":{"banner":"https:\/\/ps.w.org\/my-newsletter\/assets\/banner-772x250.png?rev=3501085","banner_2x":"https:\/\/ps.w.org\/my-newsletter\/assets\/banner-1544x500.png?rev=3501085","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/my-newsletter\/assets\/icon-128x128.png?rev=3470678","icon_2x":"https:\/\/ps.w.org\/my-newsletter\/assets\/icon-256x256.png?rev=3470678","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>My Newsletter is a lightweight WordPress newsletter plugin focused on a practical use case many site owners need immediately:<\/p>\n\n<ul>\n<li>Send a campaign to WordPress users.<\/li>\n<li>Send a campaign to commenters (optionally only commenters from a specific post).<\/li>\n<li>Import and manage your own mailing list (CSV\/TXT upload, simple XLSX upload, or paste emails).<\/li>\n<li>Queue the campaign and process it in the background (batch sending).<\/li>\n<li>Include unsubscribe links in every message.<\/li>\n<li>Track basic campaign progress in the admin area.<\/li>\n<li>Optional file logging for troubleshooting large sends.<\/li>\n<li>Optional built-in SMTP settings (with SMTP test) (no external SMTP plugin required).<\/li>\n<li>Save and load reusable email templates (v2.5.0).<\/li>\n<li>Manage templates (edit\/rename\/duplicate\/delete) from My Newsletter \u2192 Templates (v2.6.0).<\/li>\n<li>Import\/export templates as JSON for backup and migration (My Newsletter \u2192 Templates) (v2.6.1).<\/li>\n<\/ul>\n\n<p>This plugin is intentionally simple and WordPress-native:<\/p>\n\n<ul>\n<li>Email sending uses <code>wp_mail()<\/code> (https:\/\/developer.wordpress.org\/reference\/functions\/wp_mail\/).<\/li>\n<li>Background processing uses WP-Cron (https:\/\/developer.wordpress.org\/plugins\/cron\/).<\/li>\n<li>File uploads in the admin import flow use <code>wp_handle_upload()<\/code> (https:\/\/developer.wordpress.org\/reference\/functions\/wp_handle_upload\/).<\/li>\n<\/ul>\n\n<h4>Mailing list import &amp; management (v2.3.0)<\/h4>\n\n<p>My Newsletter lets you import and manage your own subscriber list:<\/p>\n\n<ul>\n<li>Import subscribers via CSV\/TXT upload, simple XLSX upload, or copy\/paste.<\/li>\n<li>Preview the first rows before writing to the database.<\/li>\n<li>Choose merge behavior: Update existing or Skip existing.<\/li>\n<li>Built-in list tools: search, export CSV, delete selected, delete all matching search, and delete by domain.<\/li>\n<li>Suppression list (unsubscribed): view\/export and remove suppression (admin-only).<\/li>\n<\/ul>\n\n<p>Important: You are responsible for ensuring you have a lawful basis\/consent to email imported contacts, and every campaign must include a working unsubscribe option.<\/p>\n\n<p>Then, when composing a campaign, choose <strong>Mailing list (imported)<\/strong> as the recipient source.<\/p>\n\n<h4>Core functionality<\/h4>\n\n<ul>\n<li><p><strong>Campaign composer (admin screen)<\/strong><\/p>\n\n<ul>\n<li>Create a newsletter subject and HTML content.<\/li>\n<li>Use the WordPress editor for message body content.<\/li>\n<li>Choose recipient source:<\/li>\n<li>Users + Commenters<\/li>\n<li>Users only<\/li>\n<li>Commenters only<\/li>\n<li>Commenters on a specific post<\/li>\n<li>Mailing list (imported)<\/li>\n<\/ul><\/li>\n<li><p><strong>Background queue processing<\/strong><\/p>\n\n<ul>\n<li>Recipients are queued in custom plugin tables.<\/li>\n<li>Sending runs in batches through WP-Cron (instead of trying to send everything in one browser request).<\/li>\n<li>Reduces the risk of timeouts and broken sends on slower hosting.<\/li>\n<\/ul><\/li>\n<li><p><strong>Test email before full campaign<\/strong><\/p>\n\n<ul>\n<li>Send a test message to any email address from the composer screen.<\/li>\n<li>Uses the same rendering path and unsubscribe footer logic as real sends.<\/li>\n<\/ul><\/li>\n<li><p><strong>Secure unsubscribe links<\/strong><\/p>\n\n<ul>\n<li>Every email includes an unsubscribe URL.<\/li>\n<li>Unsubscribe tokens use an HMAC-based signature (derived from WordPress salts; see <code>wp_salt()<\/code> https:\/\/developer.wordpress.org\/reference\/functions\/wp_salt\/).<\/li>\n<li>Unsubscribed addresses are stored and skipped in future campaigns.<\/li>\n<\/ul><\/li>\n<li><p><strong>Email templates (save\/load) (v2.5.0)<\/strong><\/p>\n\n<ul>\n<li>Save the current subject + content as a template.<\/li>\n<li>Load a saved template into the composer to reuse it for a new campaign.<\/li>\n<li>Templates are stored locally on your site (not sent anywhere).<\/li>\n<\/ul><\/li>\n<li><p><strong>Template variables (placeholders)<\/strong><\/p>\n\n<ul>\n<li><code>{{site_name}}<\/code><\/li>\n<li><code>{{site_url}}<\/code><\/li>\n<li><code>{{recipient_name}}<\/code><\/li>\n<li><code>{{recipient_email}}<\/code><\/li>\n<li><code>{{unsubscribe_url}}<\/code><\/li>\n<\/ul><\/li>\n<li><p><strong>Settings screen<\/strong><\/p>\n\n<ul>\n<li>From name<\/li>\n<li>From email<\/li>\n<li>Reply-To (optional)<\/li>\n<li>Max emails per cron run (batch size)<\/li>\n<li>Footer HTML (appended to outgoing emails)<\/li>\n<li>Logging (optional)<\/li>\n<\/ul><\/li>\n<li><p><strong>Optional log file (v2.3.3)<\/strong><\/p>\n\n<ul>\n<li>Enable logging in Settings \u2192 Logging.<\/li>\n<li>View, download, and clear logs in <strong>My Newsletter \u2192 Logs<\/strong>.<\/li>\n<li>Logs are stored in <code>wp-content\/uploads\/my-newsletter\/wpnl.log<\/code>.<\/li>\n<\/ul><\/li>\n<li><p><strong>Basic campaign tracking<\/strong><\/p>\n\n<ul>\n<li>Shows recent campaigns in admin.<\/li>\n<li>Displays queue progress (total \/ sent \/ failed \/ queued).<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h3>User Guide (v2.3.3)<\/h3>\n\n<h4>1) Quick start (5\u201310 minutes)<\/h4>\n\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to <strong>My Newsletter \u2192 Settings<\/strong> and set:\n\n<ul>\n<li>From name<\/li>\n<li>From email (prefer an address on your domain)<\/li>\n<\/ul><\/li>\n<li>Go to <strong>My Newsletter<\/strong> (campaign composer) and send a <strong>Test email<\/strong> to your own address first.<\/li>\n<li>Create a campaign:\n\n<ul>\n<li>Enter Subject<\/li>\n<li>Enter Message (HTML supported via the editor)<\/li>\n<li>Choose recipients (Users \/ Commenters \/ Mailing list)<\/li>\n<li>Click <strong>Queue &amp; Start Sending<\/strong> (wording may vary by screen)<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<p>If you don\u2019t see progress, read the \u201cWP\u2011Cron\u201d section below.<\/p>\n\n<h4>1B) Email templates (Save \/ Load) (v2.5.0)<\/h4>\n\n<p>On the <strong>My Newsletter<\/strong> campaign screen you can reuse content without retyping:<\/p>\n\n<ol>\n<li>Write your Subject and Content (or load an existing template).<\/li>\n<li>To save: enter a template name and click <strong>Save Email Template<\/strong>.<\/li>\n<li>To load: choose a template from the dropdown and click <strong>Load Email Template<\/strong>.<\/li>\n<\/ol>\n\n<p>Tip: keep templates generic (e.g. \u201cWelcome email\u201d, \u201cPromo template\u201d), then adjust the final message before queuing.<\/p>\n\n<h4>1C) Manage Templates (v2.6.0)<\/h4>\n\n<p>Use <strong>My Newsletter \u2192 Templates<\/strong> to manage your saved templates:<\/p>\n\n<ul>\n<li><strong>Add New<\/strong> to create a template from scratch.<\/li>\n<li><strong>Edit<\/strong> to update the template name (rename), subject, or body.<\/li>\n<li><strong>Duplicate<\/strong> to quickly create a variation.<\/li>\n<li><strong>Delete<\/strong> to remove a template you no longer need.<\/li>\n<\/ul>\n\n<p>Templates are local to your site and can be loaded into the campaign composer using <strong>Load Email Template<\/strong>.<\/p>\n\n<h4>2) Settings explained (My Newsletter \u2192 Settings)<\/h4>\n\n<ul>\n<li><p><strong>From name \/ From email<\/strong><br \/>\nUsed as the sender identity in outgoing messages. WordPress email is sent via <code>wp_mail()<\/code> and your mail transport decides the final headers (https:\/\/developer.wordpress.org\/reference\/functions\/wp_mail\/).<\/p><\/li>\n<li><p><strong>Reply\u2011To (optional)<\/strong><br \/>\nIf you want replies to go to a different inbox than \u201cFrom\u201d.<\/p><\/li>\n<li><p><strong>Max emails per cron run (batch size)<\/strong><br \/>\nLimits how many emails each WP\u2011Cron run tries to send. Smaller batches reduce timeouts on shared hosting.<br \/>\nWP\u2011Cron is traffic-driven by default (https:\/\/developer.wordpress.org\/plugins\/cron\/).<\/p><\/li>\n<li><p><strong>Footer HTML<\/strong><br \/>\nAppended to every message. Best practice is to include:<\/p>\n\n<ul>\n<li>your site name,<\/li>\n<li>a short reason why the recipient is receiving the email,<\/li>\n<li>and an unsubscribe link (the plugin can insert <code>{{unsubscribe_url}}<\/code>).<\/li>\n<\/ul><\/li>\n<li><p><strong>Logging (optional, v2.3.3)<\/strong>\nEnable logging when troubleshooting unexpected queue behavior or mail failures.<\/p>\n\n<ol>\n<li>Go to <strong>My Newsletter \u2192 Settings \u2192 Logging<\/strong> and enable the log file.<\/li>\n<li>Re-run sending (WP-Cron or \u201cRun queue now\u201d).<\/li>\n<li>Open <strong>My Newsletter \u2192 Logs<\/strong> to view, download, or clear the log.<\/li>\n<\/ol>\n\n<p>Logs are stored in <code>wp-content\/uploads\/my-newsletter\/wpnl.log<\/code>.<\/p><\/li>\n<\/ul>\n\n<h4>3) Creating a campaign (My Newsletter \u2192 Campaigns)<\/h4>\n\n<ol>\n<li><strong>Subject<\/strong>: what recipients will see.<\/li>\n<li><strong>Message body<\/strong>: use the editor; HTML is allowed.<\/li>\n<li><strong>Placeholders<\/strong>: you can personalize using:\n\n<ul>\n<li><code>{{recipient_name}}<\/code>, <code>{{recipient_email}}<\/code><\/li>\n<\/ul><\/li>\n<li><strong>Recipients<\/strong>: choose one:\n\n<ul>\n<li>Users (WP users)<\/li>\n<li>Commenters (emails from approved comments)<\/li>\n<li>Commenters for a specific post<\/li>\n<li>Mailing list (imported)<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<p>Then click the action button to queue recipients and start sending.<\/p>\n\n<h4>4) Recipient sources: what exactly is included<\/h4>\n\n<ul>\n<li><p><strong>Users<\/strong><br \/>\nUses WordPress user emails (typically <code>wp_users.user_email<\/code>). WordPress user data is stored in core tables (https:\/\/developer.wordpress.org\/apis\/wpdb\/).<\/p><\/li>\n<li><p><strong>Commenters<\/strong><br \/>\nUses emails from comment records (typically <code>wp_comments.comment_author_email<\/code>) and only approved comments are considered in typical implementations (WordPress comment basics: https:\/\/developer.wordpress.org\/reference\/functions\/get_comments\/).<\/p><\/li>\n<li><p><strong>Commenters on a specific post<\/strong><br \/>\nSame as Commenters, but filtered by post ID.<\/p><\/li>\n<li><p><strong>Mailing list (imported)<\/strong><br \/>\nUses subscribers stored by this plugin in its own table. This list is independent from WP users\/comments.<\/p><\/li>\n<\/ul>\n\n<h4>5) Mailing list import (My Newsletter \u2192 Mailing List)<\/h4>\n\n<p>You have two import methods: <strong>Upload file<\/strong> or <strong>Paste<\/strong>.<\/p>\n\n<h3>5A) Upload (CSV\/TXT)<\/h3>\n\n<p>Best and most reliable method.<\/p>\n\n<p><strong>Recommended columns<\/strong>\n* <code>email<\/code> (required)\n* <code>name<\/code> (optional)<\/p>\n\n<p><strong>CSV example<\/strong>\nemail,name\nana@example.com,Ana\nmarko@example.com,Marko<\/p>\n\n<p>The plugin will:\n* accept comma\/semicolon\/tab-delimited CSV (delimiter auto-detected),\n* accept a header row if it contains <code>email<\/code>,\n* validate emails with WordPress helpers like <code>sanitize_email()<\/code> and <code>is_email()<\/code> (https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_email\/ and https:\/\/developer.wordpress.org\/reference\/functions\/is_email\/),\n* deduplicate by email during the import batch,\n* skip emails that are already unsubscribed.<\/p>\n\n<p><strong>Export from Excel \/ Google Sheets<\/strong>\n* Export to CSV. XLSX support exists, but CSV is safer for complex sheets.<\/p>\n\n<h3>5B) Upload (XLSX)<\/h3>\n\n<p>XLSX support is intentionally minimal to keep the plugin lightweight.<\/p>\n\n<p>Requirements:\n* First worksheet (sheet1)\n* Column A = email\n* Column B = name (optional)\n* If cell A1 contains \u201cemail\u201d, that row is treated as header and skipped<\/p>\n\n<p>If your XLSX is more complex, export to CSV first.<\/p>\n\n<h3>5C) Paste emails (copy\/paste)<\/h3>\n\n<p>Paste supports:\n* one email per line,\n* comma\/semicolon separated emails,\n* <code>Name &lt;email@example.com&gt;<\/code>,\n* 2-column lines: <code>email,name<\/code> or <code>name,email<\/code> (comma\/tab\/semicolon).<\/p>\n\n<p>Examples:\nana@example.com\nmarko@example.com,Marko\nAna Example <a href=\"mailto:ana@example.com\">&#097;&#110;&#x61;&#064;&#x65;x&#097;&#x6d;&#112;&#x6c;e&#046;&#x63;&#111;&#x6d;<\/a>\nMarko Example <a href=\"mailto:marko@example.com\">&#x6d;&#097;&#114;&#x6b;&#x6f;&#064;&#101;&#x78;&#x61;&#109;&#112;&#x6c;&#x65;&#046;&#099;&#x6f;&#x6d;<\/a><\/p>\n\n<p>After import, the screen shows:\n* imported count,\n* invalid count,\n* duplicate count,\n* skipped unsubscribed count.<\/p>\n\n<h3>5D) Import workflow (Preview + merge rules)<\/h3>\n\n<ol>\n<li>Go to <strong>My Newsletter \u2192 Mailing List<\/strong>.<\/li>\n<li>Upload a file (CSV\/TXT\/XLSX) or paste emails.<\/li>\n<li>Click <strong>Preview import<\/strong>.<\/li>\n<li>Confirm you have lawful basis\/consent (required).<\/li>\n<li>Choose merge behavior:\n\n<ul>\n<li><strong>Update existing (recommended):<\/strong> update name\/source\/updated_at for existing emails.<\/li>\n<li><strong>Skip existing:<\/strong> only add new emails.<\/li>\n<\/ul><\/li>\n<li>Click <strong>Import now<\/strong>.<\/li>\n<\/ol>\n\n<p>After import, you can export and clean the list using:\n* Export subscribers CSV,\n* Delete selected (bulk),\n* Delete all matching search,\n* Delete by domain (e.g. <code>example.com<\/code>).<\/p>\n\n<h4>6) Viewing and managing the list<\/h4>\n\n<p>In <strong>My Newsletter \u2192 Mailing List<\/strong>, you can:\n* see the total subscriber count,\n* search by email or name,\n* browse paginated results,\n* export subscribers as CSV,\n* delete selected subscribers (bulk),\n* delete all subscribers matching the current search (with confirmation),\n* delete by domain (e.g. <code>example.com<\/code>) for quick cleanup.<\/p>\n\n<p>In <strong>Mailing List \u2192 Suppression list<\/strong>, you can:\n* view unsubscribed emails (suppressed),\n* export suppression list as CSV,\n* remove suppression (admin-only) if you need to re-subscribe someone manually.<\/p>\n\n<h4>7) WP\u2011Cron and reliable background sending<\/h4>\n\n<p>This plugin uses WP\u2011Cron to send queued emails in batches. WP\u2011Cron runs on site visits (traffic).\nOn low\u2011traffic sites, campaigns may send slowly (https:\/\/developer.wordpress.org\/plugins\/cron\/).<\/p>\n\n<p>For reliable sending on production:\n* Configure a real server cron to hit <code>wp-cron.php<\/code> at a fixed interval.\n  WordPress explains this approach here: https:\/\/developer.wordpress.org\/plugins\/cron\/#what-is-wp-cron.<\/p>\n\n<p>Admin tools:\n* In <strong>My Newsletter \u2192 Settings<\/strong>, use <strong>Run queue now<\/strong> (admin-only) to process one batch immediately for testing\/troubleshooting.\n* The Settings screen includes ready-to-copy cron examples (curl\/wget) for common hosting setups.<\/p>\n\n<h4>8) Deliverability (what matters most)<\/h4>\n\n<p>This plugin hands off email to WordPress via <code>wp_mail()<\/code> (https:\/\/developer.wordpress.org\/reference\/functions\/wp_mail\/).<br \/>\nDeliverability depends on your mail transport and DNS.<\/p>\n\n<p>If you care about inbox placement:\n* Use an SMTP provider (or transactional email service).\n* Use a sender on your own domain.\n* Configure SPF\/DKIM\/DMARC (vendor-specific docs).<\/p>\n\n<h4>9) Compliance and consent (your responsibility)<\/h4>\n\n<p>The plugin provides unsubscribe links, but it does not enforce consent or double opt\u2011in.<br \/>\nYou must only email people you have a lawful basis to contact and you must honor opt\u2011outs.<\/p>\n\n<ul>\n<li>FTC CAN\u2011SPAM overview: https:\/\/www.ftc.gov\/business-guidance\/resources\/can-spam-act-compliance-guide-business<\/li>\n<li>EU GDPR overview (lawful basis, consent, etc.): https:\/\/commission.europa.eu\/law\/law-topic\/data-protection\/reform\/what-does-general-data-protection-regulation-gdpr-govern_en<\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Standard WordPress upload (ZIP)<\/h4>\n\n<ol>\n<li>In WordPress admin, go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Upload the plugin ZIP package.<\/li>\n<li>Activate <strong>My Newsletter<\/strong>.<\/li>\n<li>Go to <strong>My Newsletter \u2192 Settings<\/strong> and configure sender details.<\/li>\n<li>Create your first campaign in <strong>My Newsletter<\/strong> and send a test email first.<\/li>\n<\/ol>\n\n<h4>Manual installation<\/h4>\n\n<ol>\n<li>Upload the <code>my-newsletter<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin in <strong>Plugins<\/strong>.<\/li>\n<li>Configure settings and send a test email first.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20use%20double%20opt-in%3F\"><h3>Does this plugin use double opt-in?<\/h3><\/dt>\n<dd><p>Not yet. Version 2.1.0 focuses on admin-triggered newsletter sending, background queue processing, secure unsubscribe handling, and list importing.<\/p><\/dd>\n<dt id=\"why%20is%20my%20campaign%20sending%20slowly%3F\"><h3>Why is my campaign sending slowly?<\/h3><\/dt>\n<dd><p>Because WP-Cron is traffic based (https:\/\/developer.wordpress.org\/plugins\/cron\/). If your site has little traffic, cron jobs run less frequently. Configure a real cron job for more reliable processing.<\/p><\/dd>\n<dt id=\"can%20i%20send%20to%20only%20commenters%20from%20one%20post%3F\"><h3>Can I send to only commenters from one post?<\/h3><\/dt>\n<dd><p>Yes. Choose <strong>Commenters on a specific post<\/strong> and select the post in the composer screen.<\/p><\/dd>\n<dt id=\"does%20it%20track%20opens%2Fclicks%3F\"><h3>Does it track opens\/clicks?<\/h3><\/dt>\n<dd><p>No. This plugin tracks send queue progress only (queued \/ sent \/ failed). It does not include analytics pixels or click tracking.<\/p><\/dd>\n<dt id=\"will%20unsubscribed%20addresses%20receive%20future%20campaigns%3F\"><h3>Will unsubscribed addresses receive future campaigns?<\/h3><\/dt>\n<dd><p>No. The plugin checks its unsubscribe table before queuing recipients.<\/p><\/dd>\n<dt id=\"what%20if%20%60wp_mail%28%29%60%20fails%3F\"><h3>What if `wp_mail()` fails?<\/h3><\/dt>\n<dd><p>Failed sends are marked as failed in the queue. For more reliable sending, configure SMTP and verify the sender domain (see <code>wp_mail()<\/code> docs: https:\/\/developer.wordpress.org\/reference\/functions\/wp_mail\/).<\/p><\/dd>\n<dt id=\"what%20file%20should%20i%20upload%20for%20mailing%20list%20import%3F\"><h3>What file should I upload for mailing list import?<\/h3><\/dt>\n<dd><p>CSV is best. XLSX works only for simple two-column sheets (A=email, B=name). Paste import is good for quick lists.<\/p><\/dd>\n<dt id=\"how%20do%20i%20import%20my%20mailing%20list%3F\"><h3>How do I import my mailing list?<\/h3><\/dt>\n<dd><p>Go to <strong>My Newsletter \u2192 Mailing List<\/strong>. Upload CSV\/TXT\/XLSX or paste emails, then <strong>Preview import<\/strong> and choose the merge rule before importing.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20an%20email%20is%20already%20unsubscribed%3F\"><h3>What happens if an email is already unsubscribed?<\/h3><\/dt>\n<dd><p>Imported emails that are currently suppressed (unsubscribed) are skipped by design. You can review them in <strong>Mailing List \u2192 Suppression list<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20export%20or%20delete%20subscribers%20in%20bulk%3F\"><h3>Can I export or delete subscribers in bulk?<\/h3><\/dt>\n<dd><p>Yes. You can export subscribers as CSV, delete selected rows, delete all matching your current search, or delete by domain.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.6.1<\/h4>\n\n<ul>\n<li>Added Templates JSON Import\/Export (backup\/migrate templates between sites) in My Newsletter \u2192 Templates.<\/li>\n<li>Updated plugin description and usage instructions for template library.<\/li>\n<\/ul>\n\n<h4>2.6.0<\/h4>\n\n<ul>\n<li>Added Manage Templates submenu (My Newsletter \u2192 Templates): create, edit\/rename, duplicate, and delete templates.<\/li>\n<li>Improved template workflow documentation (save\/load + manage).<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Added email templates: Save Email Template + Load Email Template in the campaign composer.<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>Added SMTP Test tool in Settings to send a test email and log the result.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>Built-in SMTP settings (Hostinger email compatible) so you can send newsletters without installing a separate SMTP plugin.<\/li>\n<li>Added Hostinger sending-limit guidance and recommended throttling notes on the Settings screen.<\/li>\n<li>Updated plugin description and documentation for mailing list import, SMTP, logging, and stop\/resume controls.<\/li>\n<\/ul>\n\n<h4>2.3.6<\/h4>\n\n<ul>\n<li>Optional SMTP settings (Host\/Port\/Encryption\/Auth\/Username\/Password) built into My Newsletter (no external SMTP plugin required).<\/li>\n<li>Uses WordPress PHPMailer hooks; password field is not displayed and is only updated when you enter a new value.<\/li>\n<\/ul>\n\n<h4>2.3.5<\/h4>\n\n<ul>\n<li>Fix: Stop\/Resume campaign actions no longer trigger a fatal error; add proper admin-post and AJAX handlers.<\/li>\n<\/ul>\n\n<h4>2.3.4<\/h4>\n\n<ul>\n<li>Added Stop\/Resume controls for campaigns (pause sending without deleting queued emails)<\/li>\n<li>Queue processing skips stopped\/paused campaigns and safely releases in-flight (sending) items<\/li>\n<\/ul>\n\n<h4>2.3.3<\/h4>\n\n<ul>\n<li>Added optional log file (uploads\/my-newsletter\/wpnl.log) with Logs screen (view\/download\/clear)<\/li>\n<li>Added queue run locking and \"sending\" claim status to reduce duplicate processing when cron overlaps<\/li>\n<li>Added send attempt\/success\/failure log entries to help diagnose large sends<\/li>\n<\/ul>\n\n<h4>2.3.2<\/h4>\n\n<ul>\n<li>Plugin Check fixes: filesystem handling via WP_Filesystem, CSV export without file handles, and SQL prepare improvements.<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Documentation update: clarified mailing list import &amp; management in Description and User Guide<\/li>\n<li>Added step-by-step import workflow section (Preview + merge rules) and updated list management guidance<\/li>\n<li>Updated FAQs for import, suppression behavior, and bulk export\/delete<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Added compliance UX in import preview (lawful basis \/ consent confirmation required)<\/li>\n<li>Added \"Delete all matching search\" (with confirmation) and \"Delete by domain\" tools for large lists<\/li>\n<li>Added Settings \u2192 Queue tools: \"Run queue now\" (admin-only) and Real cron setup examples<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<p>List management + suppression UI, plus import preview and merge rules.<\/p>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Added Mailing List screen with import via CSV\/TXT upload, simple XLSX upload, and paste<\/li>\n<li>Added \"Mailing list (imported)\" as a campaign recipient source (queued directly from DB for performance)<\/li>\n<li>Added new list table (<code>wpnl_list<\/code>) with safe upsert and uninstall cleanup<\/li>\n<li>Added detailed User Guide section to readme for repository reviewers and end users<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Fixed remaining Plugin Check errors (escaping, discouraged functions, and <code>wp_parse_url()<\/code> compatibility)<\/li>\n<li>Added <code>languages<\/code> directory to satisfy plugin header <code>Domain Path<\/code><\/li>\n<li>Updated readme metadata (<code>Tested up to<\/code>, tags) for repository review<\/li>\n<li>Cleaned uninstall routine variable prefixes and PHPCS annotations<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Plugin Check compatibility pass and cleanup<\/li>\n<li>Unified plugin text domain to <code>my-newsletter<\/code><\/li>\n<li>Cleaned plugin header metadata<\/li>\n<li>Replaced anonymous PHP callbacks with named methods<\/li>\n<li>Moved textdomain loading to proper hook flow<\/li>\n<li>Hardened AJAX handlers (nonce verification, capability checks, input unslashing\/sanitization)<\/li>\n<li>Improved PHPCS annotations for custom DB table queries and uninstall routine<\/li>\n<li>Added repository placeholder assets (icons\/banners)<\/li>\n<li>Bundled improved readme documentation<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Modernized rewrite \/ rework of the plugin structure<\/li>\n<li>Added background queue processing and campaign composer<\/li>\n<\/ul>","raw_excerpt":"Send newsletters to users, commenters, or an imported mailing list (CSV\/XLSX\/paste) with SMTP, templates, queue sending, logs, and unsubscribe.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/27948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=27948"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/georgijevic"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=27948"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=27948"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=27948"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=27948"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=27948"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=27948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}