Your WordPress site sends emails. Sometimes, it sends a lot of emails. Password resets, commentUser feedback or discussion attached to a post or page, mana... More moderation alerts, automatic update reports, data privacy confirmations,… the list goes on.
But what does WordPress actually send? When? And, more importantly, which ones do you actually need?
This guide documents every single email sent by WordPress coreCore The foundational files and code of WordPress itself, ma... More (based on the definitive wp_mail documentation), explains why each exists, and shows you exactly how to disable the ones you don’t want.
All emails sent by WordPress go through the wp_mail() function. This is a pluggable function, meaning you can override it entirely with a custom pluginSoftware that adds specific features or functionality to a W... More.
Global filters that affect every email:
| Filter | Purpose |
|---|---|
wp_mail_from | Change the “From” email address |
wp_mail_from_name | Change the “From” name |
wp_mail_content_type | Change email format (text/html) |
pre_wp_mail | Intercept or prevent an email before it’s sent |
Global actions:
phpmailer_init: Modify the PHPMailer object directlywp_mail_succeeded: Run code after an email sends successfullywp_mail_failed: Run code if an email failsWhen it sends: A visitor submits a commentUser feedback or discussion attached to a post or page, mana... More that gets held for moderation.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More + PostDynamic, time-based content (e.g., blog entries) displayed i... More Author (if they can edit comments)
Subject: [Site Name] Please moderate: "Comment Title"
How to disable:
false from the notify_moderator filterwp_new_comment_notify_moderator from the comment_post hookHook A point in WordPress code where developers can "hook" c... MoreWhen it sends:
Sent to: PostDynamic, time-based content (e.g., blog entries) displayed i... More Author
Subject: [Site Name] Comment: "Comment Title" (or Pingback/Trackback/Note variations)
How to disable:
false from the notify_post_author filterwp_new_comment_notify_postauthor from the comment_post hookHook A point in WordPress code where developers can "hook" c... MoreVerdict: Keep these if you run a blog with active commenting. Disable if comments are rare or spam-heavy.
When it sends: Someone (usually an adminThe admin (administrator) is the highest user role with full... More) tries to change the Administration Email Address in Settings → General.
Sent to: The proposed new email address (for confirmation)
Subject: [Site Name] New Admin Email Address
How to disable: Remove update_option_new_admin_email from the add_option_new_admin_email and update_option_new_admin_email hooks.
Verdict: Keep this. It prevents account takeover if an attacker gains adminThe admin (administrator) is the highest user role with full... More access.
When it sends: After someone clicks the confirmation link from the email above.
Sent to: The old adminThe admin (administrator) is the highest user role with full... More email address (notification of change)
Subject: [Site Name] Admin Email Changed
How to disable: Return false from the send_site_admin_email_change_email filter.
Verdict: Keep this. You want to know if your adminThe admin (administrator) is the highest user role with full... More email has been changed without your knowledge.
Same as above, but for multisiteA WordPress feature allowing multiple sites to run under a s... More network adminThe admin (administrator) is the highest user role with full... More email. Disable similarly using send_network_admin_email_change_email filter.
When it sends: A user clicks “Lost your password?” and submits their email.
Sent to: The user requesting the reset
Subject: [Site Name] Password Reset
How to disable:
false from the send_retrieve_password_email filterretrieve_password_message filterVerdict: Keep this. If you disable it, users cannot reset their own passwords.
When it sends: A user successfully resets their password via the “Lost your password?” flow.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More
Subject: [Site Name] Password Changed
How to disable:
wp_password_change_notification from the after_password_reset hookHook A point in WordPress code where developers can "hook" c... Morewp_password_change_notification() functionVerdict: Optional. Useful for security monitoring, but noisy on large sites.
When it sends: A logged-in user changes their password from their profile screen.
Sent to: The user themselves
Subject: [Site Name] Password Changed
How to disable: Return false from the send_password_change_email filter.
Verdict: Keep this. Users should know when their password has been changed (in case it wasn’t them).
When it sends: A logged-in user tries to change their email address on their profile screen.
Sent to: The proposed new email address (for confirmation)
Subject: [Site Name] Email Change Request
How to disable: Remove send_confirmation_on_profile_email() from the personal_options_update hookHook A point in WordPress code where developers can "hook" c... More.
Verdict: Keep this. Email change confirmation prevents account hijacking.
When it sends: After the user clicks the confirmation link from the email above.
Sent to: The user’s old email address (notification)
Subject: [Site Name] Email Changed
How to disable: Return false from the send_email_change_email filter.
Verdict: Keep this. Tells the user their email has changed (in case it was fraud).
When it sends: An adminThe admin (administrator) is the highest user role with full... More creates or resends a personal data request from Tools → Export/Erase Personal Data.
Sent to: The requester’s email address
Subject: [Site Name] Confirm Action: Export Personal Data (or Erasure)
How to disable: Unknown, may require removing the adminThe admin (administrator) is the highest user role with full... More pages entirely.
Verdict: Keep this. Required for GDPR compliance.
When it sends: The user clicks the confirmation link from the email above.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More (single site) or Network AdminThe admin (administrator) is the highest user role with full... More (multisiteA WordPress feature allowing multiple sites to run under a s... More)
Subject: [Site Name] Action Confirmed: Export Personal Data
How to disable: Remove _wp_privacy_send_request_confirmation_notification() from the user_request_action_confirmed hookHook A point in WordPress code where developers can "hook" c... More.
Verdict: Keep this. Admins need to know when a request is ready to process.
When it sends: An adminThe admin (administrator) is the highest user role with full... More clicks “Send Export Link” next to a confirmed export request.
Sent to: The requester’s email address
Subject: [Site Name] Personal Data Export
How to disable: Remove wp_privacy_send_personal_data_export_email() from the wp_privacy_personal_data_export_page hookHook A point in WordPress code where developers can "hook" c... More.
Verdict: Keep this. Required to fulfill the request.
When it sends: An adminThe admin (administrator) is the highest user role with full... More clicks “Erase Personal Data” or “Force Erase Personal Data” next to a request.
Sent to: The requester’s email address
Subject: [Site Name] Erasure Request Fulfilled
How to disable: Remove _wp_privacy_send_erasure_fulfillment_notification() from the wp_privacy_personal_data_erased hookHook A point in WordPress code where developers can "hook" c... More.
Verdict: Keep this. Required for GDPR compliance.
When it sends: Background automatic updates for plugins/themes complete, either successfully or with failures.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More (single site) or Network AdminThe admin (administrator) is the highest user role with full... More (multisiteA WordPress feature allowing multiple sites to run under a s... More)
Subject: Varies:
[Site Name] Some plugins and themes have automatically updated[Site Name] Some plugins have failed to updateHow to disable: Return false from auto_plugin_update_send_email or auto_theme_update_send_email filters.
Verdict: Keep failure emails, disable success emails. You need to know when updates fail. You don’t need to know when they work.
When it sends: Background automatic updates for WordPress coreCore The foundational files and code of WordPress itself, ma... More complete, success or failure.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More or Network AdminThe admin (administrator) is the highest user role with full... More
Subject: Varies:
[Site Name] Your site has updated to WordPress X.X[Site Name] WordPress X.X is available. Please update![Site Name] URGENT: Your site may be down due to a failed updateHow to disable: Return false from the auto_core_update_send_email filter.
Verdict: Keep failure/urgent emails, disable success emails. The “URGENT” email is critical, it means your site may be down.
When it sends: You’re using a development version of WordPress, it’s not under version control, and an update completes or fails.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More or Network AdminThe admin (administrator) is the highest user role with full... More
Subject: [Site Name] Background Update Failed or Background Update Finished
How to disable: Return false from the automatic_updates_send_debug_email filter.
Verdict: Disable this unless you’re actively developing WordPress coreCore The foundational files and code of WordPress itself, ma... More.
WordPress MultisiteA WordPress feature allowing multiple sites to run under a s... More sends a complex web of emails when:
How to disable most of them:
registrationnotification option valuefalse from specific filters like wpmu_signup_user_notification, wpmu_welcome_user_notification, newblog_notify_siteadmin, etc.Verdict for most site owners: These are essential for multisiteA WordPress feature allowing multiple sites to run under a s... More user management. Disable only if you have a custom onboarding flow.
When it sends: WordPress is initially installed.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More
Subject: New WordPress Site
How to disable: Overwrite the pluggable wp_new_blog_notification() function.
Verdict: One-time email. No need to disable, you only see it once.
When it sends: A fatal error occurs in a pluginSoftware that adds specific features or functionality to a W... More or themeTheme A collection of files that determine a site's design, ... More, and Recovery Mode is not active.
Sent to: Site AdminThe admin (administrator) is the highest user role with full... More (or the email defined in RECOVERY_MODE_EMAIL constant)
Subject: [Site Name] Your Site is Experiencing a Technical Issue
How to disable:
WP_DISABLE_FATAL_ERROR_HANDLER as truefalse from the wp_fatal_error_handler_enabled filterVerdict: DO NOT DISABLE. This email tells you your site is broken. You need it.
You have several methods, from simplest to most advanced.
Settings → Discussion → “Email me whenever”, uncheck options for commentUser feedback or discussion attached to a post or page, mana... More emails.
Plugins like “Disable Emails” or “Email Control” let you block specific email types via UI.
Add to your theme’s functions.php or a custom pluginSoftware that adds specific features or functionality to a W... More:
php
// Disable password change notification to adminThe admin (administrator) is the highest user role with full... More
add_filter('send_password_change_email', '__return_false');
// Disable automatic update success emails (keep failures)
add_filter('auto_plugin_update_send_email', function($send, $type, $data) {
return $type === 'fail' ? $send : false;
}, 10, 3);
php
remove_action('comment_post', 'wp_new_comment_notify_moderator');
Create a file in wp-content/mu-plugins/disable-emails.php:
php
<?php
function wp_new_user_notification($user_id, $deprecated = null, $notify = '') {
// Do nothing, email never sends
}
WordPress sends emails for good reasons: security, user management, legal compliance, and site reliability. But not every site needs every email.
Start with these changes:
And remember: all emails pass through wp_mail(). A single filter can catch them all:
php
add_filter('pre_wp_mail', function($null, $atts) {
// Log, modify, or block every email
return $null;
}, 10, 2);
Now you know exactly what WordPress is sending, and how to stop it when you need to.