CINXE.COM
Extension:BounceHandler - MediaWiki
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Extension:BounceHandler - MediaWiki</title> <script>(function(){var className="client-js vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )mediawikiwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"d3b170a8-e343-4267-81b8-454d14e911eb","wgCanonicalNamespace":"Extension","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":102,"wgPageName":"Extension:BounceHandler","wgTitle":"BounceHandler","wgCurRevisionId":6636666,"wgRevisionId":6636666,"wgArticleId":233746,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Extensions without an image","Extensions with release branches compatibility policy","Extensions with manual MediaWiki version","Stable extensions","Hook extensions","Database extensions","GPL licensed extensions","Extensions in Wikimedia version control","BeforeCreateEchoEvent extensions","EchoGetDefaultNotifiedUsers extensions","LoadExtensionSchemaUpdates extensions","UserMailerChangeReturnPath extensions","All extensions", "Extensions used on Wikimedia","Email extensions"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Extension:BounceHandler","wgRelevantArticleId":233746,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"mediawiki","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgTranslatePageTranslation":"source","wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"personal","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q21676812", "wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.translate.tag.languages":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","jquery.makeCollapsible.styles":"ready","ext.translate.edit.documentation.styles":"ready","ext.translate":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.pt":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","jquery.makeCollapsible","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.translate.pagetranslation.uls","ext.urlShortener.toolbar", "ext.centralauth.centralautologin","mmv.bootstrap","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","wikibase.client.vector-2022","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.pygments%2Ctranslate%2CwikimediaBadges%7Cext.translate.edit.documentation.styles%7Cext.translate.tag.languages%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cjquery.makeCollapsible.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="MediaWiki"> <meta property="og:title" content="Extension:BounceHandler - MediaWiki"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//m.mediawiki.org/wiki/Extension:BounceHandler"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Extension:BounceHandler&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/mediawiki.png"> <link rel="icon" href="/static/favicon/mediawiki.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="MediaWiki (en)"> <link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd"> <link rel="canonical" href="https://www.mediawiki.org/wiki/Extension:BounceHandler"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="MediaWiki Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-102 ns-subject mw-editable page-Extension_BounceHandler rootpage-Extension_BounceHandler skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/MediaWiki" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-mw-download" class="mw-list-item"><a href="/wiki/Download"><span>Get MediaWiki</span></a></li><li id="n-mw-extensions" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Category:Extensions"><span>Get extensions</span></a></li><li id="n-blog-text" class="mw-list-item"><a href="https://techblog.wikimedia.org/"><span>Tech blog</span></a></li><li id="n-mw-contribute" class="mw-list-item"><a href="/wiki/Special:MyLanguage/How_to_contribute"><span>Contribute</span></a></li> </ul> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support" > <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Contents" title="The place to find out"><span>User help</span></a></li><li id="n-mw-faq" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:FAQ"><span>FAQ</span></a></li><li id="n-mw-manual" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:Contents"><span>Technical manual</span></a></li><li id="n-mw-supportdesk" class="mw-list-item"><a href="/wiki/Project:Support_desk"><span>Support desk</span></a></li><li id="n-mw-communication" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Communication"><span>Communication</span></a></li> </ul> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development" > <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mw-developerportal" class="mw-list-item"><a href="https://developer.wikimedia.org/"><span>Developer portal</span></a></li><li id="n-svn-statistics" class="mw-list-item"><a href="/wiki/Development_statistics"><span>Code statistics</span></a></li> </ul> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org" > <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-portal" class="mw-list-item"><a href="/wiki/Project:Help" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-mw-translate" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translate content</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random page</span></a></li><li id="n-mw-discussion" class="mw-list-item"><a href="/wiki/Project:Village_Pump"><span>Village pump</span></a></li><li id="n-Sandboxlink-portlet-label" class="mw-list-item"><a href="/wiki/Project:Sandbox"><span>Sandbox</span></a></li> </ul> </div> </div> <div id="p-lang" class="vector-menu mw-portlet mw-portlet-lang" > <div class="vector-menu-heading"> In other languages </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q21676812#sitelinks-wikipedia" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/MediaWiki" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/mediawikiwiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="MediaWiki" src="/static/images/mobile/copyright/mediawikiwiki-wordmark.svg" style="width: 7.5em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search MediaWiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search MediaWiki" aria-label="Search MediaWiki" autocapitalize="sentences" title="Search MediaWiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-uls" class="mw-list-item active user-links-collapsible-item"><a data-mw="interface" href="#" class="uls-trigger cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span></a> </li> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Extension%3ABounceHandler" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Extension%3ABounceHandler" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Extension%3ABounceHandler" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Extension%3ABounceHandler" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Installation" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Installation"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Installation</span> </div> </a> <ul id="toc-Installation-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Configuration" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Configuration"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Configuration</span> </div> </a> <button aria-controls="toc-Configuration-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Configuration subsection</span> </button> <ul id="toc-Configuration-sublist" class="vector-toc-list"> <li id="toc-Adding_bouncehandler_router_and_transport_configuration_to_Exim" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Adding_bouncehandler_router_and_transport_configuration_to_Exim"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Adding bouncehandler router and transport configuration to Exim</span> </div> </a> <ul id="toc-Adding_bouncehandler_router_and_transport_configuration_to_Exim-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Adding_bouncehandler_configuration_to_Postfix" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Adding_bouncehandler_configuration_to_Postfix"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Adding bouncehandler configuration to Postfix</span> </div> </a> <ul id="toc-Adding_bouncehandler_configuration_to_Postfix-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-API" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#API"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>API</span> </div> </a> <ul id="toc-API-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-VERP_address" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#VERP_address"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>VERP address</span> </div> </a> <ul id="toc-VERP_address-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Parameters" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Parameters"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Parameters</span> </div> </a> <ul id="toc-Parameters-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">Extension</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">BounceHandler</span></h1> <div class="mw-indicators"> <div id="mw-indicator-phabricator-project" class="mw-indicator"><div class="mw-parser-output"><div class="mw-parser-output"><style data-mw-deduplicate="TemplateStyles:r6605561">.mw-parser-output .tpl-badge{background-color:var(--background-color-progressive-subtle,#eaf3ff);color:var(--color-base,#202122);border-radius:10px;display:inline-block;font-size:90%;padding:5px 8px}</style><div class="tpl-badge"><a href="/wiki/Special:MyLanguage/Phabricator" title="Special:MyLanguage/Phabricator">Issue tracker</a>: <a href="https://phabricator.wikimedia.org/tag/mediawiki-extensions-bouncehandler/" class="extiw" title="phab:tag/mediawiki-extensions-bouncehandler/"><b>#MediaWiki-extensions-BounceHandler</b></a></div></div></div></div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-extension" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Extension:BounceHandler" title="View the subject page [c]" accesskey="c"><span>Extension</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Extension_talk:BounceHandler" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Extension:BounceHandler"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Extension:BounceHandler"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Extension:BounceHandler" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Extension:BounceHandler" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&oldid=6636666" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=Extension%3ABounceHandler&id=6636666&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FExtension%3ABounceHandler"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FExtension%3ABounceHandler"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Extension%3ABounceHandler"><span>Create a book</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Extension%3ABounceHandler&action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Extension:BounceHandler&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q21676812" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div id="siteSub" class="noprint">From mediawiki.org</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-pt-translate-header noprint nomobile" dir="ltr" lang="en"><a href="/w/index.php?title=Special:Translate&group=page-Extension%3ABounceHandler&action=page&filter=&action_source=translate_page" title="Special:Translate">Translate this page</a></div><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="mw-pt-languages noprint navigation-not-searchable" lang="en" dir="ltr"><div class="mw-pt-languages-label">Languages:</div><ul class="mw-pt-languages-list"><li><a href="/wiki/Extension:BounceHandler/de" class="mw-pt-progress mw-pt-progress--med" title="Erweiterung:BounceHandler (27% translated)" lang="de" dir="ltr">Deutsch</a></li> <li><a href="/wiki/Extension:BounceHandler/de-formal" class="mw-pt-progress mw-pt-progress--low" title="Extension:BounceHandler/de-formal (4% translated)" lang="de-x-formal" dir="ltr">Deutsch (Sie-Form)</a></li> <li><span class="mw-pt-languages-ui mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete" lang="en" dir="ltr">English</span></li> <li><a href="/wiki/Extension:BounceHandler/tr" class="mw-pt-progress mw-pt-progress--high" title="Extension:BounceHandler (96% translated)" lang="tr" dir="ltr">Türkçe</a></li> <li><a href="/wiki/Extension:BounceHandler/da" class="mw-pt-progress mw-pt-progress--low" title="Extension:BounceHandler/da (13% translated)" lang="da" dir="ltr">dansk</a></li> <li><a href="/wiki/Extension:BounceHandler/es" class="mw-pt-progress mw-pt-progress--med" title="Extensión:BounceHandler (18% translated)" lang="es" dir="ltr">español</a></li> <li><a href="/wiki/Extension:BounceHandler/fr" class="mw-pt-progress mw-pt-progress--med" title="Extension:BounceHandler (31% translated)" lang="fr" dir="ltr">français</a></li> <li><a href="/wiki/Extension:BounceHandler/pl" class="mw-pt-progress mw-pt-progress--med" title="Extension:BounceHandler/pl (18% translated)" lang="pl" dir="ltr">polski</a></li> <li><a href="/wiki/Extension:BounceHandler/pt-br" class="mw-pt-progress mw-pt-progress--med" title="Extensão:BounceHandler (24% translated)" lang="pt-BR" dir="ltr">português do Brasil</a></li> <li><a href="/wiki/Extension:BounceHandler/be-tarask" class="mw-pt-progress mw-pt-progress--low" title="Пашырэньне:BounceHandler (3% translated)" lang="be-tarask" dir="ltr">беларуская (тарашкевіца)</a></li> <li><a href="/wiki/Extension:BounceHandler/ru" class="mw-pt-progress mw-pt-progress--med" title="Extension:BounceHandler/ru (23% translated)" lang="ru" dir="ltr">русский</a></li> <li><a href="/wiki/Extension:BounceHandler/hi" class="mw-pt-progress mw-pt-progress--low" title="Extension:BounceHandler/hi (4% translated)" lang="hi" dir="ltr">हिन्दी</a></li> <li><a href="/wiki/Extension:BounceHandler/zh" class="mw-pt-progress mw-pt-progress--med" title="扩展:BounceHandler (23% translated)" lang="zh" dir="ltr">中文</a></li> <li><a href="/wiki/Extension:BounceHandler/ja" class="mw-pt-progress mw-pt-progress--med" title="Extension:BounceHandler (35% translated)" lang="ja" dir="ltr">日本語</a></li></ul></div> <style data-mw-deduplicate="TemplateStyles:r6651102">.mw-parser-output .infobox{box-sizing:border-box;border:2px solid var(--border-color-base,#a2a9b1);width:280px;border-collapse:collapse;border-spacing:0;background-color:white;color:#333;clear:right;float:right;margin:0 0 0.5em 0.5em}.mw-parser-output .infobox-rtl{clear:left;float:left;margin:0 0.5em 0.5em 0}.mw-parser-output .infobox th{text-align:left;padding:0.2em 0.5em;vertical-align:top}.mw-parser-output .infobox-rtl th{text-align:right}@media(max-width:719px){body.mediawiki .mw-parser-output .infobox{float:none;clear:both;width:100%;margin:0 0 .5em 0}}.mw-parser-output .infobox td{border:none;padding:0.2em 0.5em;vertical-align:top}.mw-parser-output .infobox-header{background-color:#a2a9b1;color:#FFF;text-align:left}.mw-parser-output .infobox-header a{color:#FFF}.mw-parser-output .infobox-header td,.mw-parser-output .infobox-header th{padding:0.5em 0.5em}.mw-parser-output .infobox-header img{padding:0 0.2em 0 0.5em}@media screen{html.skin-theme-clientpref-night .mw-parser-output .infobox{background-color:inherit;color:inherit}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .infobox{background-color:inherit;color:inherit}}</style><style data-mw-deduplicate="TemplateStyles:r5577029">.mw-parser-output .ext-infobox>tbody>tr>td:first-child{vertical-align:top}.mw-parser-output .ext-infobox>tbody>tr>td abbr{white-space:nowrap}.mw-parser-output .ext-infobox .mw-collapsible-header,.mw-parser-output .ext-infobox .mw-collapsible-toggle{font-weight:bold}.mw-parser-output .ext-infobox .mw-collapsible-content{margin-top:.2em;padding-top:.2em}.mw-parser-output .ext-infobox-header>th,.mw-parser-output .ext-infobox caption,.mw-parser-output .ext-infobox-image,.mw-parser-output .ext-infobox-translate{text-align:center}.mw-parser-output .ext-infobox-name{font-size:130%;line-height:100%}.mw-parser-output .ext-infobox-type{min-width:7em}</style><style data-mw-deduplicate="TemplateStyles:r6424453">.mw-parser-output .ext-status-unstable,.mw-parser-output .ext-status-unstable td{border-color:#d33}.mw-parser-output .ext-status-unstable .ext-infobox-header{background-color:#d33;color:#fff}.mw-parser-output .ext-status-unstable .ext-infobox-header a{color:#fff}.mw-parser-output .ext-status-experimental,.mw-parser-output .ext-status-experimental td{border-color:#ff4500}.mw-parser-output .ext-status-experimental .ext-infobox-header{background-color:#ff4500;color:#FFF}.mw-parser-output .ext-status-experimental .ext-infobox-header a{color:#FFF}.mw-parser-output .ext-status-beta,.mw-parser-output .ext-status-beta td{border-color:#fc3}.mw-parser-output .ext-status-beta .ext-infobox-header{color:#000;background-color:#fc3}.mw-parser-output .ext-status-beta .ext-infobox-header a{color:#000}.mw-parser-output .ext-status-stable,.mw-parser-output .ext-status-stable td{border-color:#00af89}.mw-parser-output .ext-status-stable .ext-infobox-header{background-color:#068468;color:#FFF}.mw-parser-output .ext-status-stable .ext-infobox-header a{color:#fff}.mw-parser-output .ext-status-unmaintained,.mw-parser-output .ext-status-unmaintained td{border-color:#ac6600}.mw-parser-output .ext-status-unmaintained .ext-infobox-header{background-color:#ac6600;color:#FFF}.mw-parser-output .ext-status-unmaintained .ext-infobox-header a{color:#fff}</style> <table class="infobox infobox-ltr ext-infobox ext-status-stable"> <caption><b><a href="/wiki/Special:MyLanguage/Manual:Extensions" title="Special:MyLanguage/Manual:Extensions">MediaWiki extensions manual</a><span style="display:none"><a href="/wiki/Manual:Extensions" title="Manual:Extensions"> </a></span></b></caption> <tbody><tr class="infobox-header ext-infobox-header notheme"> <th colspan="2"><figure class="mw-halign-left" typeof="mw:File"><a href="/wiki/Special:MyLanguage/Template:Extension#Content" title="Special:MyLanguage/Template:Extension"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/1/1b/OOjs_UI_icon_advanced-invert.svg/40px-OOjs_UI_icon_advanced-invert.svg.png" decoding="async" width="40" height="40" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/1b/OOjs_UI_icon_advanced-invert.svg/60px-OOjs_UI_icon_advanced-invert.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/1/1b/OOjs_UI_icon_advanced-invert.svg/80px-OOjs_UI_icon_advanced-invert.svg.png 2x" data-file-width="20" data-file-height="20" /></a><figcaption></figcaption></figure> <span class="ext-infobox-name">BounceHandler</span><br /> <a href="/wiki/Special:MyLanguage/Extension_status" title="Special:MyLanguage/Extension status">Release status:</a><span style="display:none"><a href="/wiki/Extension_status" title="Extension status"> </a></span> stable</th> </tr> <tr> <td class="ext-infobox-type"><b><a href="/wiki/Special:MyLanguage/Template:Extension#type" title="Special:MyLanguage/Template:Extension">Implementation</a><span style="display:none"><a href="/wiki/Template:Extension#type" title="Template:Extension"> </a></span></b></td> <td><a href="/wiki/Special:MyLanguage/Manual:Hooks" title="Special:MyLanguage/Manual:Hooks">Hook</a><span style="display:none"><a href="/wiki/Manual:Hooks" title="Manual:Hooks"> </a></span>, <a href="/wiki/Special:MyLanguage/Manual:Database_layout" title="Special:MyLanguage/Manual:Database layout">Database</a><span style="display:none"><a href="/wiki/Manual:Database_layout" title="Manual:Database layout"> </a></span> </td></tr><tr> <td><b><a href="/wiki/Special:MyLanguage/Template:Extension#description" title="Special:MyLanguage/Template:Extension">Description</a><span style="display:none"><a href="/wiki/Template:Extension#description" title="Template:Extension"> </a></span></b></td> <td>Allows users to handle email bounces</td> </tr> <tr> <td><b><a href="/wiki/Special:MyLanguage/Template:Extension#username" title="Special:MyLanguage/Template:Extension">Author(s)</a><span style="display:none"><a href="/wiki/Template:Extension#username" title="Template:Extension"> </a></span></b></td> <td> <ul><li><a href="/wiki/User:01tonythomas" title="User:01tonythomas">Tony Thomas</a></li> <li><a href="/wiki/User:Legoktm" title="User:Legoktm">Kunal Mehta</a></li> <li>Jeff Green</li> <li><a href="/wiki/User:Reedy" title="User:Reedy">Sam Reed</a></li></ul></td> </tr> <tr> <td><b><a href="/wiki/Special:MyLanguage/Template:Extension#version" title="Special:MyLanguage/Template:Extension">Latest version</a><span style="display:none"><a href="/wiki/Template:Extension#version" title="Template:Extension"> </a></span></b></td> <td>1.0 (Continuous updates)</td> </tr> <tr> <td><b><a href="/wiki/Special:MyLanguage/Compatibility#mediawiki_extensions" title="Special:MyLanguage/Compatibility">Compatibility policy</a><span style="display:none"><a href="/wiki/Compatibility#mediawiki_extensions" title="Compatibility"> </a></span></b></td> <td>Snapshots releases along with MediaWiki. Master is not backward compatible.</td> </tr> <tr> <td><a href="/wiki/Special:MyLanguage/Template:Extension#mediawiki" title="Special:MyLanguage/Template:Extension"><b>MediaWiki</b></a><span style="display:none"><a href="/wiki/Template:Extension#mediawiki" title="Template:Extension"> </a></span></td> <td>1.29+ </td> </tr> <tr> <td><a href="/wiki/Special:MyLanguage/Template:Extension#php" title="Special:MyLanguage/Template:Extension"><b>PHP</b></a><span style="display:none"><a href="/wiki/Template:Extension#php" title="Template:Extension"> </a></span></td> <td>5.4+</td> </tr> <tr> <td><a href="/wiki/Special:MyLanguage/Template:Extension#needs-updatephp" title="Special:MyLanguage/Template:Extension"><abbr title="'php update.php' needed after installation"><b>Database changes</b></abbr></a><span style="display:none"><a href="/wiki/Template:Extension#needs-updatephp" title="Template:Extension"> </a></span></td> <td>Yes</td> </tr> <tr> <td><b><a href="/wiki/Special:MyLanguage/Template:Extension#table1" title="Special:MyLanguage/Template:Extension">Tables</a><span style="display:none"><a href="/wiki/Template:Extension#table1" title="Template:Extension"> </a></span></b></td> <td><a href="/wiki/Special:MyLanguage/Extension:BounceHandler/bounce_records_table" title="Special:MyLanguage/Extension:BounceHandler/bounce records table">bounce_records</a><span style="display:none"><a href="/wiki/Extension:BounceHandler/bounce_records_table" title="Extension:BounceHandler/bounce records table"> </a></span></td> </tr> <tr> <td><b><a href="/wiki/Special:MyLanguage/Template:Extension#license" title="Special:MyLanguage/Template:Extension">License</a><span style="display:none"><a href="/wiki/Template:Extension#license" title="Template:Extension"> </a></span></b></td> <td><a rel="nofollow" class="external text" href="//www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html">GNU General Public License 2.0 or later</a></td> </tr><tr> <td><b>Download</b></td> <td><div class="plainlinks"><a href="/wiki/Special:ExtensionDistributor/BounceHandler" title="Special:ExtensionDistributor/BounceHandler"><b>Download extension</b></a> <br />Git <sup>[<a href="/wiki/Special:MyLanguage/Download_from_Git" title="Special:MyLanguage/Download from Git">?</a>]</sup>: <ul><li><span class="plainlinks"><a rel="nofollow" class="external text" href="https://github.com/wikimedia/mediawiki-extensions-BounceHandler/archive/master.tar.gz">Download Git master</a></span></li> <li><a href="https://gerrit.wikimedia.org/g/mediawiki/extensions/BounceHandler" class="extiw" title="git:mediawiki/extensions/BounceHandler">browse repository</a> (<a rel="nofollow" class="external text" href="https://github.com/wikimedia/mediawiki-extensions-BounceHandler">GitHub</a>)</li> <li><a href="https://gerrit.wikimedia.org/g/mediawiki/extensions/BounceHandler/%2Blog/master" class="extiw" title="git:mediawiki/extensions/BounceHandler/+log/master">commit history</a></li> <li><a rel="nofollow" class="external text" href="https://github.com/wikimedia/mediawiki-extensions-BounceHandler/graphs/contributors">repository contributors (GitHub)</a></li> <li><a href="https://gerrit.wikimedia.org/r/q/project:mediawiki/extensions/BounceHandler" class="extiw" title="gerrit:q/project:mediawiki/extensions/BounceHandler">code review</a></li></ul></div></td> </tr> <tr> <td class="mw-collapsible mw-collapsed" colspan="2"> <div class="mw-collapsible-header"><a href="/wiki/Special:MyLanguage/Template:Extension#parameters" title="Special:MyLanguage/Template:Extension">Parameters</a><span style="display:none"><a href="/wiki/Template:Extension#parameters" title="Template:Extension"> </a></span></div> <div class="mw-collapsible-content"> <ul><li><span class="configvariable">$wgGenerateVERP</span></li> <li><span class="configvariable">$wgVERPAcceptTime</span></li> <li><span class="configvariable">$wgBounceHandlerSharedDB</span></li> <li><span class="configvariable">$wgUnrecognizedBounceNotify</span></li> <li><span class="configvariable">$wgBounceHandlerCluster</span></li> <li><span class="configvariable">$wgBounceHandlerUnconfirmUsers</span></li> <li><span class="configvariable">$wgVERPprefix</span></li> <li><span class="configvariable">$wgVERPdomainPart</span></li> <li><span class="configvariable">$wgBounceRecordMaxAge</span></li> <li><span class="configvariable">$wgVERPalgorithm</span></li> <li><span class="configvariable">$wgBounceHandlerInternalIPs</span></li> <li><span class="configvariable">$wgBounceRecordLimit</span></li> <li><span class="configvariable">$wgVERPsecret</span></li> <li><span class="configvariable">$wgBounceRecordPeriod</span></li></ul></div></td> </tr> <tr> <td class="mw-collapsible mw-collapsed" colspan="2"> <div class="mw-collapsible-header"><a href="/wiki/Special:MyLanguage/Template:Extension#hook" title="Special:MyLanguage/Template:Extension">Hooks used</a><span style="display:none"><a href="/wiki/Template:Extension#hook" title="Template:Extension"> </a></span></div> <style data-mw-deduplicate="TemplateStyles:r6219282">.mw-parser-output .plainlist ul{line-height:inherit;list-style:none none;margin:0}.mw-parser-output .plainlist ul li{margin-bottom:0}</style><div class="plainlist mw-collapsible-content"><ul><li><a href="/wiki/Special:MyLanguage/Manual:Hooks/BeforeCreateEchoEvent" title="Special:MyLanguage/Manual:Hooks/BeforeCreateEchoEvent">BeforeCreateEchoEvent</a><span style="display:none"><a href="/wiki/Manual:Hooks/BeforeCreateEchoEvent" class="mw-redirect" title="Manual:Hooks/BeforeCreateEchoEvent"> </a></span></li><li><a href="/wiki/Special:MyLanguage/Manual:Hooks/EchoGetDefaultNotifiedUsers" title="Special:MyLanguage/Manual:Hooks/EchoGetDefaultNotifiedUsers">EchoGetDefaultNotifiedUsers</a><span style="display:none"><a href="/wiki/Manual:Hooks/EchoGetDefaultNotifiedUsers" class="mw-redirect" title="Manual:Hooks/EchoGetDefaultNotifiedUsers"> </a></span></li><li><a href="/wiki/Special:MyLanguage/Manual:Hooks/LoadExtensionSchemaUpdates" title="Special:MyLanguage/Manual:Hooks/LoadExtensionSchemaUpdates">LoadExtensionSchemaUpdates</a><span style="display:none"><a href="/wiki/Manual:Hooks/LoadExtensionSchemaUpdates" title="Manual:Hooks/LoadExtensionSchemaUpdates"> </a></span></li><li><a href="/wiki/Special:MyLanguage/Manual:Hooks/UserMailerChangeReturnPath" title="Special:MyLanguage/Manual:Hooks/UserMailerChangeReturnPath">UserMailerChangeReturnPath</a><span style="display:none"><a href="/wiki/Manual:Hooks/UserMailerChangeReturnPath" title="Manual:Hooks/UserMailerChangeReturnPath"> </a></span></li></ul></div> </td> </tr> <tr> <td class="mw-collapsible mw-collapsed" colspan="2"> <div class="mw-collapsible-header"><a href="/wiki/Special:MyLanguage/Template:Extension#newhook" title="Special:MyLanguage/Template:Extension">Hooks provided</a><span style="display:none"><a href="/wiki/Template:Extension#newhook" title="Template:Extension"> </a></span></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r6219282"><div class="plainlist mw-collapsible-content"><ul><li><a href="/wiki/Special:MyLanguage/Extension:BounceHandler/Hooks/VERPAddressGenerate" title="Special:MyLanguage/Extension:BounceHandler/Hooks/VERPAddressGenerate">VERPAddressGenerate</a><span style="display:none"><a href="/wiki/Extension:BounceHandler/Hooks/VERPAddressGenerate" title="Extension:BounceHandler/Hooks/VERPAddressGenerate"> </a></span></li></ul></div> </td> </tr> <tr> <td title="This only includes downloads from Special:ExtensionDistributor. Other download methods such as git or bundled extensions are not included."><b>Quarterly downloads</b></td> <td>2 (Ranked 133<sup>rd</sup>)</td> </tr> <tr> <td title=""><a rel="nofollow" class="external text" href="https://wikiapiary.com/wiki/Extension:BounceHandler"><b>Public wikis using</b></a></td> <td>847 (Ranked 296<sup>th</sup>)</td> </tr> <tr> <td colspan="2" class="ext-infobox-translate"> <a href="https://translatewiki.net/wiki/Special:Translate/ext-bouncehandler" class="extiw" title="translatewiki:Special:Translate/ext-bouncehandler">Translate the BounceHandler extension</a> if it is available at translatewiki.net</td> </tr><tr class="mw-empty-elt"> </tr> <tr> <td> <b><a href="/wiki/Special:MyLanguage/Phabricator" title="Special:MyLanguage/Phabricator">Issues</a><span style="display:none"><a href="/wiki/Phabricator" title="Phabricator"> </a></span></b></td> <td><a href="https://phabricator.wikimedia.org/tag/mediawiki-extensions-bouncehandler" class="extiw" title="phab:tag/mediawiki-extensions-bouncehandler">Open tasks</a> · <a class="external text" href="https://phabricator.wikimedia.org/maniphest/task/create/?projects=MediaWiki-extensions-BounceHandler">Report a bug</a></td> </tr> </tbody></table> <p>The <b>BounceHandler</b> extension allows wikis to handle bounce emails efficiently, by: </p> <ul><li>Generate a <a href="/wiki/VERP" title="VERP">VERP</a> "<a href="https://en.wikipedia.org/wiki/VERP" class="extiw" title="w:VERP">Variable envelope Return-Path</a>" on <code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nx">UserMailer</span><span class="o">::</span><span class="na">send</span></code> email invocations.</li> <li>Bounces can be directly fed to the <code>bouncehandler</code> API from the MTA using a curl POST request</li></ul> <p>As a result, users whose address is in error are un-subscribed and they are notified through Echo about this the next time they connect on the wiki. More exactly, their address is un-confirmed, and in case MediaWiki requires confirmed emails no emails will be further sent. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Installation">Installation</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=1" title="Edit section: Installation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a href="/wiki/Special:ExtensionDistributor/BounceHandler" title="Special:ExtensionDistributor/BounceHandler">Download</a> and move the extracted <code>BounceHandler</code> folder to your <code>extensions/</code> directory.<br />Developers and code contributors should install the extension <a href="/wiki/Special:MyLanguage/Download_from_Git" title="Special:MyLanguage/Download from Git">from Git</a> instead, using:<code class="mw-code mw-highlight" style="display:block">cd extensions/<br />git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BounceHandler</code></li> <li>Add the following code at the bottom of your <a href="/wiki/Special:MyLanguage/Manual:LocalSettings.php" title="Special:MyLanguage/Manual:LocalSettings.php">LocalSettings.php</a><span style="display:none"><a href="/wiki/Manual:LocalSettings.php" title="Manual:LocalSettings.php"> </a></span> file: <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="nx">wfLoadExtension</span><span class="p">(</span> <span class="s1">'BounceHandler'</span> <span class="p">);</span> </pre></div></li> <li>Run the <b><a href="/wiki/Special:MyLanguage/Manual:Update.php" title="Special:MyLanguage/Manual:Update.php">update script</a></b> which will automatically create the necessary database tables that this extension needs.</li> <li><span typeof="mw:File"><span><img alt="Yes" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/f6/OOjs_UI_icon_check-constructive.svg/15px-OOjs_UI_icon_check-constructive.svg.png" decoding="async" width="15" height="15" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/f6/OOjs_UI_icon_check-constructive.svg/23px-OOjs_UI_icon_check-constructive.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/f6/OOjs_UI_icon_check-constructive.svg/30px-OOjs_UI_icon_check-constructive.svg.png 2x" data-file-width="20" data-file-height="20" /></span></span> <b>Done</b> – Navigate to <a href="/wiki/Special:Version" title="Special:Version">Special:Version</a> on your wiki to verify that the extension is successfully installed.</li></ul> <div class="mw-heading mw-heading2"><h2 id="Configuration">Configuration</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=2" title="Edit section: Configuration"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The extension requires the Mail Transfer Agent (MTA) installed in your mail server to HTTP POST the incoming bounce email to the extension API named as <code>bouncehandler</code>. This can be done by adding the corresponding configurations to your MTA configuration. </p> <div class="mw-heading mw-heading4"><h4 id="Adding_bouncehandler_router_and_transport_configuration_to_Exim">Adding bouncehandler router and transport configuration to Exim</h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=3" title="Edit section: Adding bouncehandler router and transport configuration to Exim"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>You can redirect all your bounce emails to the bouncehandler API directly to do the processing. You can edit your <a href="https://en.wikipedia.org/wiki/Exim" class="extiw" title="w:Exim">Exim</a> configurations to route all bounce emails to a bounce-handler-router and do HTTP POST to the extension API, which is the recommended method. </p><p>Add this to your <code>/etc/exim4/exim4.conf</code> </p><p>Under the variable declaration section: </p> <div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span></span><span class="n">VERP_BOUNCE_LOCALPART_REGEXP</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">\</span><span class="n">N</span><span class="o">^</span><span class="n">wiki</span><span class="o">-</span><span class="p">[</span><span class="o">\</span><span class="n">w</span><span class="o">.</span><span class="p">]</span><span class="o">+-\</span><span class="n">w</span><span class="o">+-\</span><span class="n">w</span><span class="o">+-</span><span class="p">[</span><span class="o">+/\</span><span class="n">w</span><span class="p">]</span><span class="o">+</span><span class="nv">$</span><span class="err">\</span><span class="nv">N</span> </pre></div> <p>under router configuration: </p> <div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span></span><span class="c1"># Route bounce emails</span> <span class="n">mw_verp_api:</span> <span class="w"> </span><span class="n">driver</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">accept</span> <span class="w"> </span><span class="n">domains</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">+</span><span class="n">verp_domains</span> <span class="w"> </span><span class="n">condition</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$</span><span class="p">{</span><span class="k">if</span><span class="w"> </span><span class="n">match</span><span class="p">{</span><span class="nv">$local_part</span><span class="p">}{</span><span class="n">VERP_BOUNCE_LOCALPART_REGEXP</span><span class="p">}{</span><span class="n">true</span><span class="p">}{</span><span class="n">false</span><span class="p">}}</span> <span class="w"> </span><span class="n">transport</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mwverpbounceprocessor</span> </pre></div> <p>under transports, we need to write the configuration that would HTTP POST to our <strong>bouncehandler</strong> API </p> <div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span></span><span class="c1"># POST VERP bounce emails to a MediaWiki 'bouncehandler' API 822</span> <span class="n">mwverpbounceprocessor:</span> <span class="w"> </span><span class="n">driver</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">pipe</span> <span class="w"> </span><span class="n">command</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sr">/usr/</span><span class="n">bin</span><span class="sr">/curl --interface 127.0.0.1 -H 'Host: mywiki.org' http://mywiki.org/</span><span class="n">api</span><span class="o">.</span><span class="n">php</span><span class="w"> </span><span class="o">-</span><span class="n">d</span><span class="w"> </span><span class="s">"action=bouncehandler"</span><span class="w"> </span><span class="o">-</span><span class="n">d</span><span class="w"> </span><span class="s">"format=json"</span><span class="w"> </span><span class="o">--</span><span class="n">data</span><span class="o">-</span><span class="n">urlencode</span><span class="w"> </span><span class="s">"email@-"</span><span class="w"> </span><span class="o">-</span><span class="n">o</span><span class="w"> </span><span class="sr">/dev/</span><span class="n">null</span> <span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nobody</span> <span class="w"> </span><span class="n">group</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nogroup</span> </pre></div> <p>You can find more details in this <a rel="nofollow" class="external text" href="https://fosstalks.wordpress.com/2014/07/11/post-ing-bounce-email-to-a-mediawiki-api-directly-from-exim/">blog-post "POST-ing bounce email to a Mediawiki API directly from exim"</a>. </p> <div class="mw-heading mw-heading4"><h4 id="Adding_bouncehandler_configuration_to_Postfix">Adding bouncehandler configuration to Postfix</h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=4" title="Edit section: Adding bouncehandler configuration to Postfix"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>This section shows how the BounceHandler extension can be configured to handle bounced emails from Postfix, unlike the above section which shows how to do the same with Exim. </p><p>First of all, please make sure that Postfix & the package "postfix-pcre" are installed. Once these two installed, open up /etc/postfix/main.cf and add the following in the end of the file: </p> <div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>virtual_alias_maps = pcre:/etc/postfix/virtual </pre></div> <p>Also, make sure that alias_maps is set to the following: </p> <div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>alias_maps = hash:/etc/aliases </pre></div> <p>Save & close that file, and then create a new file called etc/postfix/virtual, , and add the following ode </p> <div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>/wiki-[a-z0-9_.]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9+\/=]+@yourdomainname.ext/ curl_email </pre></div> <style data-mw-deduplicate="TemplateStyles:r6651107">.mw-parser-output .note{background-position:left 7px top 50%;padding:0.5em 0.5em 0.5em 40px;margin:0.5em 0;overflow:hidden;background-color:#f8f9fa;color:#333;background-repeat:no-repeat;border:1px solid #ddd}.mw-parser-output .note-inline{display:inline-block;vertical-align:middle}.mw-parser-output .note-info{background-color:#eaf3ff;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/e/ec/OOjs_UI_icon_information-progressive.svg");background-size:25px;border-color:#a3caff;padding-left:40px;min-height:25px}.mw-parser-output .note-reminder{background-color:#fff9ea;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/a/a8/OOjs_UI_icon_lightbulb-yellow.svg");background-size:25px;border-color:#fc3;min-height:25px}.mw-parser-output .note-warn{background-color:#fff9ea;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/3/3b/OOjs_UI_icon_alert-warning.svg");background-size:25px;border-color:#fc3;min-height:25px}.mw-parser-output .note-error{background-color:#fee7e6;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/b/bf/OOjs_UI_icon_notice-destructive.svg");background-size:25px;border-color:#c33;min-height:25px}@media screen{html.skin-theme-clientpref-night .mw-parser-output .note{background-color:transparent;color:inherit}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .note{background-color:transparent;color:inherit}}</style><div role="note" class="note note-info">You need to replace yourdomainname.ext with your own domain name.</div> <p>This will tell Postfix that all the bounced emails (the ones which have return path matching with the above regex expression) should be passed on to the command specified in the alias 'curl_email'. </p><p>Now we need to define curl_email as our alias, so save & close this file, open up /etc/aliases and add the following: </p> <div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>curl_email: "|curl --interface 127.0.0.1 -d action=bouncehandler -d format=json --data-urlencode email@- http://yourdomain.ext/path-to-mediawiki-install/api.php" </pre></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r6651107"><div role="note" class="note note-info">You need to provide the full domain name in place of yourdomain.ext and the full path to your MediaWiki Installation in place of /path-to-mediawiki-install.</div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r6651107"><div role="note" class="note note-info">If unlogged users don’t have the right 'read', the connections from 127.0.0.1 should anyway be granted the right 'read' to be able to submit bounces to MediaWiki API.</div> <p>Save & close that file, and now type the following commands, to map your /etc/postfix/ to postfix, and then restart postfix: </p> <div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span>sudo<span class="w"> </span>postmap<span class="w"> </span>/etc/postfix/virtual sudo<span class="w"> </span>postalias<span class="w"> </span>/etc/aliases sudo<span class="w"> </span>/etc/init.d/postfix<span class="w"> </span>reload sudo<span class="w"> </span>/etc/init.d/postfix<span class="w"> </span>restart </pre></div> <p>Save and close this file, and head over to your MediaWiki's LocalSettings.php and make sure add the following line: </p> <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">$wgJobRunRate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> </pre></div> <p>Once that is done, save and close this file. To test if this works, send an email to an invalid email to your server and then run: </p> <div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span>php<span class="w"> </span>maintenance/runJobs.php </pre></div> <p>To check if your email bounces were captured, check the <code>bounce_records</code> table in your MediaWiki database, and /var/log/mail.log for further testing. </p> <div class="mw-heading mw-heading2"><h2 id="API">API</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=5" title="Edit section: API"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The BounceHandler extension installs an API <code>bouncehandler</code> to receive the HTTP POST from the mail server. The API has a parameter <code>email</code> to which the entire bounce email is URL encoded to. This helps in avoiding the use of a separate bounce collector inbox or other IMAP features for the extension to work. </p><p>Example API call: </p><p><code><a rel="nofollow" class="external free" href="http://example.org/api.php?action=bouncehandler&email=This%20is%20a%20test%20email">http://example.org/api.php?action=bouncehandler&email=This%20is%20a%20test%20email</a></code> This would send a bounce email with the body <code>This is a test email</code> for processing. </p> <div class="mw-heading mw-heading2"><h2 id="VERP_address">VERP address</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=6" title="Edit section: VERP address"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The extension creates a unique <a href="https://en.wikipedia.org/wiki/VERP" class="extiw" title="w:VERP">w:VERP</a> address as the Return Path header to every single email send from the wiki installation. The generated VERP address is of the form </p> <pre>wiki-testwiki-2a-nanrfx-Tn14EQZWaotS2XNn@verpwebhost.wmflabs.org </pre> <p>The general template of the generated VERP address is: </p> <pre>$prefix-$wikiName-base36( $userID )-base36( $timestamp )-base64( hash( $algorithm, $key, $data ) )@$email_domain </pre> <table class="wikitable prettytable"> <tbody><tr> <th>Variable </th> <th>Description </th></tr> <tr> <td>$prefix </td> <td>The prefix applied to every VERP email. Default to <strong> wiki</strong> </td></tr> <tr> <td>$wikiName </td> <td>The name of the Wiki on which the extension is running </td></tr> <tr> <td>$userID </td> <td>The user id (int) of the recipient from the MediaWiki <code>user</code> table </td></tr> <tr> <td>$timestamp </td> <td>The unix time-stamp value at the time of the VERP address generation </td></tr> <tr> <td>$data </td> <td>The string resulting as the concatenation of $prefix,'-',$wikiId,'-',base_convert( $userID, 10, 36),'-' and base_convert( $timestamp, 10, 36) </td></tr> <tr> <td>$algorithm </td> <td>The hashing php-hmac algorithm used to prepare the hash of $prefix </td></tr> <tr> <td>$key </td> <td>The key used to prepare the hash using the hmac algorithm </td></tr> <tr> <td>$email_domain </td> <td>The domain part of the VERP email address </td></tr> </tbody></table> <div class="mw-heading mw-heading2"><h2 id="Parameters">Parameters</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Extension:BounceHandler&action=edit&section=7" title="Edit section: Parameters"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <table class="wikitable prettytable"> <tbody><tr> <th>Configuration </th> <th>Default </th> <th>Description </th></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgVERPalgorithm</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="s1">'md5'</span></code> </td> <td>The PHP hashing algorithm you need to employ to generate the VERP return-path address. Can be md5, sha256 <i>etc.</i> More details at <a rel="nofollow" class="external autonumber" href="https://php.net/function.hash-hmac">[1]</a> </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgVERPsecret</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="s1">'MediaWikiVERP'</span></code> </td> <td>The secret key you need to pass to the PHP HMAC function </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgVERPAcceptTime</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="mi">259200</span></code><br />(3 days) </td> <td>The threshold time (in seconds) until we are expecting a bounce. Setting it < 3 days will make sure you respond only to the valid bounces. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgVERPprefix</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="s1">'wiki'</span></code> </td> <td>The prefix of the bounce addresses. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgVERPdomainPart</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">null</span></code> </td> <td>The domain part of the bounce addresses. <code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">null</span></code> is equivalent to <code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgServerName</span></code> </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceRecordPeriod</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="mi">604800</span></code><br />(1 week) </td> <td>The Bounce allowed period (in seconds). Setting it to a week makes sure that we consider a weeks bounce frequency before taking un-subscribe actions. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceRecordLimit</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="mi">10</span></code> </td> <td>Allowed bounces in the given time period. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceHandlerInternalIPs</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="p">[</span> <span class="s1">'127.0.0.1'</span><span class="p">,</span> <span class="s1">'::1'</span> <span class="p">]</span></code> </td> <td>The internal IPs that are allowed to use the API. Make sure this is configured correctly, so that no outside user can cause unwanted email un-subscriptions. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceHandlerUnconfirmUsers</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">false</span></code> </td> <td>Set to <code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">true</span></code> to enable unsubcriptions when bounces are above the threshold. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceRecordMaxAge</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="mi">5184000</span></code><br />(60 days) </td> <td>The period (in seconds) where are kept the records of bounces. Older bounces records are deleted. <code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">false</span></code> to deactivate deletion. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceHandlerSharedDB</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">false</span></code> </td> <td>(to be documented) </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgBounceHandlerCluster</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">false</span></code> </td> <td>(to be documented) </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgUnrecognizedBounceNotify</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">null</span></code> </td> <td>Array of email addresses where unrecognized bounces are sent. </td></tr> <tr> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="nv">$wgGenerateVERP</span></code> </td> <td><code class="mw-highlight mw-highlight-lang-php mw-content-ltr" style="" dir="ltr"><span class="k">true</span></code> </td> <td>Activate VERP addresses. </td></tr></tbody></table> <style data-mw-deduplicate="TemplateStyles:r6651108">.mw-parser-output table.ombox{margin:4px 10%;border-collapse:collapse;border:1px solid #a2a9b1;background-color:#f8f9fa;color:#333;box-sizing:border-box}.mw-parser-output .ombox td.mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ombox th.mbox-text,.mw-parser-output .ombox td.mbox-text{border:none;padding:0.25em 0.9em;width:100%}.mw-parser-output .ombox td.mbox-image{border:none;text-align:center;padding:2px 0 2px 0.9em}.mw-parser-output .ombox td.mbox-imageright{border:none;text-align:center;padding:2px 0.9em 2px 0}.mw-parser-output table.ombox-notice{border-color:#a2a9b1}.mw-parser-output table.ombox-speedy{background-color:#fee7e6;color:#333}.mw-parser-output table.ombox-speedy,.mw-parser-output table.ombox-delete{border-color:#b32424;border-width:2px}.mw-parser-output table.ombox-content{border-color:#f28500}.mw-parser-output table.ombox-style{border-color:#fc3}.mw-parser-output table.ombox-move{border-color:#9932cc}.mw-parser-output table.ombox-protection{border-color:#a2a9b1;border-width:2px}html body.mediawiki .mw-parser-output .ombox.mbox-small{clear:right;float:right;margin:4px 0 4px 1em;box-sizing:border-box;width:238px;font-size:88%;line-height:1.25em}@media screen{html.skin-theme-clientpref-night .mw-parser-output table.ombox{background-color:transparent;color:inherit}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output table.ombox{background-color:transparent;color:inherit}}</style><table class="ombox ombox-notice plainlinks" role="presentation" style="clear: both; margin-top: 0; margin-bottom: 0;"><tbody><tr><td class="mbox-image"><span class="skin-invert-image" typeof="mw:File"><span><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Wikimedia-logo_black.svg/40px-Wikimedia-logo_black.svg.png" decoding="async" width="40" height="40" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Wikimedia-logo_black.svg/60px-Wikimedia-logo_black.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Wikimedia-logo_black.svg/80px-Wikimedia-logo_black.svg.png 2x" data-file-width="512" data-file-height="512" /></span></span></td><td class="mbox-text">This extension is being used on one or more <a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_projects" class="extiw" title="m:Special:MyLanguage/Wikimedia projects">Wikimedia projects</a>. This probably means that the extension is stable and works well enough to be used by such high-traffic websites. Look for this extension's name in Wikimedia's <a class="external text" href="https://noc.wikimedia.org/conf/highlight.php?file=CommonSettings.php">CommonSettings.php</a> and <a class="external text" href="https://noc.wikimedia.org/conf/highlight.php?file=InitialiseSettings.php">InitialiseSettings.php</a> configuration files to see where it's installed. A full list of the extensions installed on a particular wiki can be seen on the wiki's <a href="/wiki/Special:Version" title="Special:Version">Special:Version</a> page.</td></tr></tbody></table> <!-- NewPP limit report Parsed by mw‐api‐int.codfw.main‐849f99967d‐cq787 Cached time: 20241124152047 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1, show‐toc] CPU time usage: 0.647 seconds Real time usage: 0.802 seconds Preprocessor visited node count: 5705/1000000 Post‐expand include size: 59568/2097152 bytes Template argument size: 12815/2097152 bytes Highest expansion depth: 18/100 Expensive parser function count: 46/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 23769/5000000 bytes Lua time usage: 0.254/10.000 seconds Lua memory usage: 14177365/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 562.234 1 -total 78.69% 442.419 1 Template:Extension 19.86% 111.675 43 Template:Ll 18.09% 101.727 55 Template:Pagelang 16.36% 91.995 98 Template:Translatable 6.96% 39.141 33 Template:Phpi 6.41% 36.014 1 Template:OnWikimedia 6.13% 34.466 33 Template:Inline-code 5.56% 31.247 1 Template:Mbox 5.08% 28.568 1 Template:WikimediaDownload --> <!-- Saved in parser cache with key mediawikiwiki:pcache:idhash:233746-0!canonical and timestamp 20241124152047 and revision id 6636666. Rendering was triggered because: api-parse --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://www.mediawiki.org/w/index.php?title=Extension:BounceHandler&oldid=6636666">https://www.mediawiki.org/w/index.php?title=Extension:BounceHandler&oldid=6636666</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Categories</a>: <ul><li><a href="/wiki/Category:Stable_extensions" title="Category:Stable extensions">Stable extensions</a></li><li><a href="/wiki/Category:Hook_extensions" title="Category:Hook extensions">Hook extensions</a></li><li><a href="/wiki/Category:Database_extensions" title="Category:Database extensions">Database extensions</a></li><li><a href="/wiki/Category:GPL_licensed_extensions" title="Category:GPL licensed extensions">GPL licensed extensions</a></li><li><a href="/wiki/Category:Extensions_in_Wikimedia_version_control" title="Category:Extensions in Wikimedia version control">Extensions in Wikimedia version control</a></li><li><a href="/wiki/Category:BeforeCreateEchoEvent_extensions" title="Category:BeforeCreateEchoEvent extensions">BeforeCreateEchoEvent extensions</a></li><li><a href="/wiki/Category:EchoGetDefaultNotifiedUsers_extensions" title="Category:EchoGetDefaultNotifiedUsers extensions">EchoGetDefaultNotifiedUsers extensions</a></li><li><a href="/wiki/Category:LoadExtensionSchemaUpdates_extensions" title="Category:LoadExtensionSchemaUpdates extensions">LoadExtensionSchemaUpdates extensions</a></li><li><a href="/wiki/Category:UserMailerChangeReturnPath_extensions" title="Category:UserMailerChangeReturnPath extensions">UserMailerChangeReturnPath extensions</a></li><li><a href="/wiki/Category:All_extensions" title="Category:All extensions">All extensions</a></li><li><a href="/wiki/Category:Extensions_used_on_Wikimedia" title="Category:Extensions used on Wikimedia">Extensions used on Wikimedia</a></li><li><a href="/wiki/Category:Email_extensions" title="Category:Email extensions">Email extensions</a></li></ul></div><div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">Hidden categories: <ul><li><a href="/wiki/Category:Extensions_without_an_image" title="Category:Extensions without an image">Extensions without an image</a></li><li><a href="/wiki/Category:Extensions_with_release_branches_compatibility_policy" title="Category:Extensions with release branches compatibility policy">Extensions with release branches compatibility policy</a></li><li><a href="/wiki/Category:Extensions_with_manual_MediaWiki_version" title="Category:Extensions with manual MediaWiki version">Extensions with manual MediaWiki version</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 13 July 2024, at 12:08.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. Text in <a class="external text" href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">the Help: namespace</a> is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/publicdomain/zero/1.0/">Creative Commons CC0 License</a>. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Project:About">About mediawiki.org</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Project:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/www.mediawiki.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//m.mediawiki.org/w/index.php?title=Extension:BounceHandler&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-nbpzk","wgBackendResponseTime":106,"wgPageParseReport":{"limitreport":{"cputime":"0.647","walltime":"0.802","ppvisitednodes":{"value":5705,"limit":1000000},"postexpandincludesize":{"value":59568,"limit":2097152},"templateargumentsize":{"value":12815,"limit":2097152},"expansiondepth":{"value":18,"limit":100},"expensivefunctioncount":{"value":46,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":23769,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 562.234 1 -total"," 78.69% 442.419 1 Template:Extension"," 19.86% 111.675 43 Template:Ll"," 18.09% 101.727 55 Template:Pagelang"," 16.36% 91.995 98 Template:Translatable"," 6.96% 39.141 33 Template:Phpi"," 6.41% 36.014 1 Template:OnWikimedia"," 6.13% 34.466 33 Template:Inline-code"," 5.56% 31.247 1 Template:Mbox"," 5.08% 28.568 1 Template:WikimediaDownload"]},"scribunto":{"limitreport-timeusage":{"value":"0.254","limit":"10.000"},"limitreport-memusage":{"value":14177365,"limit":52428800}},"cachereport":{"origin":"mw-api-int.codfw.main-849f99967d-cq787","timestamp":"20241124152047","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>