{"id":363600,"date":"2026-09-06T15:03:19","date_gmt":"2026-09-06T15:03:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/neuedaten-privacy-mail-log\/"},"modified":"2026-09-06T15:02:49","modified_gmt":"2026-09-06T15:02:49","slug":"neuedaten-privacy-mail-log","status":"publish","type":"plugin","link":"https:\/\/sa.wordpress.org\/plugins\/neuedaten-privacy-mail-log\/","author":23555043,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.7","requires_php":"7.4","requires_plugins":null,"header_name":"Neuedaten Privacy Mail Log","header_author":"Bastian Schwabe","header_description":"Mail logging with anonymization and GDPR-friendly retention. Logs every email sent through wp_mail() and lets you decide how long personal data is kept.","assets_banners_color":"a18ef8","last_updated":"2026-09-06 15:02:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/neuedaten\/wordpress-privacy-mail-log","header_author_uri":"https:\/\/neuedaten.de\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":42,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"bastianschwabe","date":"2026-09-06 15:02:49","revision":3683581}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3683580,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3683580,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3683580,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3683580,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3683580,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3683580,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3683580,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3683580,"resolution":"3","location":"assets","locale":"","width":2560,"height":1600},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3683580,"resolution":"4","location":"assets","locale":"","width":2560,"height":1600}},"screenshots":{"1":"The mail log with search, status filter and bulk actions.","2":"The detail view of a logged email, rendered in a sandbox.","3":"The settings screen with per-field anonymization and retention periods.","4":"The test email screen."}},"plugin_section":[],"plugin_tags":[154545,26736,131785,212757,396],"plugin_category":[54],"plugin_contributors":[278365],"plugin_business_model":[],"class_list":["post-363600","plugin","type-plugin","status-publish","hentry","plugin_tags-dsgvo","plugin_tags-email-log","plugin_tags-gdpr","plugin_tags-mail-log","plugin_tags-privacy","plugin_category-security-and-spam-protection","plugin_contributors-bastianschwabe","plugin_committers-bastianschwabe"],"banners":{"banner":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/banner-772x250.png?rev=3683580","banner_2x":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/banner-1544x500.png?rev=3683580","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/icon.svg?rev=3683580","icon":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/icon.svg?rev=3683580","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/screenshot-1.png?rev=3683580","caption":"The mail log with search, status filter and bulk actions."},{"src":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/screenshot-2.png?rev=3683580","caption":"The detail view of a logged email, rendered in a sandbox."},{"src":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/screenshot-3.png?rev=3683580","caption":"The settings screen with per-field anonymization and retention periods."},{"src":"https:\/\/ps.w.org\/neuedaten-privacy-mail-log\/assets\/screenshot-4.png?rev=3683580","caption":"The test email screen."}],"raw_content":"<!--section=description-->\n<p>Privacy Mail Log records every email sent through <code>wp_mail()<\/code>: recipients, subject, body, attachments (file names only), and whether the send succeeded or failed. Unlike most mail loggers, it treats the log itself as what it is \u2014 a growing collection of personal data \u2014 and gives you the tools to keep it small.<\/p>\n\n<p>You decide per field whether the recipient name, the recipient email address, the subject and the body are anonymized: never, after a retention period, or immediately when the entry is written. Immediately anonymized data never reaches the database at all. A second retention stage deletes old entries completely. Anonymization is irreversible.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Logs every email sent through <code>wp_mail()<\/code>, including failed sends with their error message<\/li>\n<li>Log view with search, status filter and bulk delete; HTML emails are rendered in a sandbox that blocks scripts and forms<\/li>\n<li>Per-field anonymization: recipient name, recipient email address, subject and body \u2014 each set to never, after the retention period, or immediately<\/li>\n<li>Metadata-only mode: set the body to \"Immediately\" and the message content is never stored<\/li>\n<li>Three replacement styles for email addresses: a plain placeholder, a stable hash (still countable and searchable), or keeping just the domain<\/li>\n<li>Two-stage retention via WP-Cron: anonymize after a number of days, delete completely after a longer period<\/li>\n<li>Integrates with the WordPress privacy tools: personal data exports include matching log entries, and erasure requests anonymize them<\/li>\n<li>Test email screen to verify that logging works on your site<\/li>\n<li>Attachments are stored as file names only, never as files<\/li>\n<li>No dependencies, no external requests, no tracking<\/li>\n<\/ul>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>The log stores personal data: email addresses, names, subjects and message bodies of the emails your site sends. What is stored and for how long is under your control:<\/p>\n\n<ul>\n<li>Fields set to \"Immediately\" are anonymized before the entry is written, so that data never reaches the database.<\/li>\n<li>The retention cron anonymizes entries after a configurable number of days (default 30) and deletes them completely after a longer period (default 90 days).<\/li>\n<li>Personal data export requests (Tools \u2192 Export Personal Data) include matching log entries; erasure requests (Tools \u2192 Erase Personal Data) irreversibly anonymize them while the send record itself remains.<\/li>\n<li>Attachments are recorded as file names only. The plugin makes no external requests.<\/li>\n<\/ul>\n\n<p>Privacy Mail Log is a tool, not a compliance guarantee. Whether your use of it complies with the GDPR\/DSGVO or any other regulation depends on your configuration, your retention periods and your processes as the site operator. This is not legal advice.<\/p>\n\n<p><strong>For developers<\/strong><\/p>\n\n<ul>\n<li><code>neuedaten_pml_logged<\/code> \u2014 action fired after an email has been written to the log, with the entry id and the stored values<\/li>\n<li><code>neuedaten_pml_settings<\/code> \u2014 filter the resolved plugin settings<\/li>\n<li><code>neuedaten_pml_capability<\/code> \u2014 filter the capability required for all plugin screens (default <code>manage_options<\/code>)<\/li>\n<li><code>neuedaten_pml_retention_batch_size<\/code> \u2014 filter how many entries each retention stage processes per cron run (default 500)<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it through the Plugins screen.<\/li>\n<li>Activate the plugin. From now on every email sent through <code>wp_mail()<\/code> is logged.<\/li>\n<li>Go to <strong>Mail Log \u2192 Settings<\/strong> and choose your anonymization and retention periods.<\/li>\n<li>Use <strong>Mail Log \u2192 Test Email<\/strong> to send yourself a test email and check the log entry.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20capture%20emails%20sent%20by%20smtp%20plugins%3F\"><h3>Does it capture emails sent by SMTP plugins?<\/h3><\/dt>\n<dd><p>Emails are captured through the WordPress mail hooks (<code>pre_wp_mail<\/code>, <code>wp_mail_succeeded<\/code>, <code>wp_mail_failed<\/code>). SMTP plugins that build on <code>wp_mail()<\/code> are captured. A plugin that replaces the mail function entirely without firing these hooks bypasses the log.<\/p><\/dd>\n<dt id=\"what%20does%20the%20%22pending%22%20status%20mean%3F\"><h3>What does the \"Pending\" status mean?<\/h3><\/dt>\n<dd><p>The email was handed over for sending, but neither the success nor the failure signal arrived \u2014 typically because another plugin took over the delivery and did not report back. The email may well have been sent.<\/p><\/dd>\n<dt id=\"what%20happens%20on%20a%20personal%20data%20erasure%20request%3F\"><h3>What happens on a personal data erasure request?<\/h3><\/dt>\n<dd><p>All log entries addressed to the requested email address are irreversibly anonymized: recipient name and address, subject and body are replaced. The entry itself remains, so send statistics stay intact while no personal data is left.<\/p><\/dd>\n<dt id=\"how%20do%20i%20stop%20the%20body%20from%20being%20stored%20at%20all%3F\"><h3>How do I stop the body from being stored at all?<\/h3><\/dt>\n<dd><p>Set <strong>Body<\/strong> to <em>Immediately<\/em> on the settings screen. The message content is then replaced before the entry is written and never reaches the database \u2014 only metadata is logged.<\/p><\/dd>\n<dt id=\"is%20anonymization%20reversible%3F\"><h3>Is anonymization reversible?<\/h3><\/dt>\n<dd><p>No. The original values are overwritten in the database. There is no way to restore them.<\/p><\/dd>\n<dt id=\"does%20using%20this%20plugin%20make%20my%20site%20gdpr%20compliant%3F\"><h3>Does using this plugin make my site GDPR compliant?<\/h3><\/dt>\n<dd><p>No plugin can promise that. Privacy Mail Log gives you the tools \u2014 configurable retention, per-field anonymization, integration with the WordPress privacy tools \u2014 but compliance depends on your configuration and your processes. When in doubt, ask a professional.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Mail logging with anonymization and GDPR-friendly retention. Log every email your site sends \u2014 and decide how long personal data is kept.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/363600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=363600"}],"author":[{"embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bastianschwabe"}],"wp:attachment":[{"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=363600"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=363600"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=363600"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=363600"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=363600"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=363600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}