Subscribe / Unsubscribe Extension (e.g. for Newsletter), depends on tt_address

Installs: 1 250

Dependents: 0

Suggesters: 0

Security: 0

Stars: 2

Watchers: 5

Forks: 5

Open Issues: 9



  • Subcribe and unsubscribe for newsletters for TYPO3 >= 9.5
  • Depends on tt_address
  • Scheduler task to delete unconfirmed subscribers after a while (since v3.1.0)

What does it do?

  • Provides a plugin to double optin subscribe
  • Provides a plugin to double optin unsubscribe
  • Provides field in tt_address to generate unsubscribe link in direct_mail mailings

Breaking in 5.0

  • If you use the default templates and styles you have to add the class form-input to input fields and form-checkbox to the checkboxes. Ther former approach overrode the appearance of every checkbox on pages, where the static template of this extension was included.


This extension changes the behaviour of tt_address and disables the soft delete feature which means that deleted records are removed from the database directly instead of being marked as deleted.

This might lead to problems if you already have an existing set of records in the table tt_address.

To mitigate this behaviour you can purge all deleted records from tt_address.
Or you can reenable the original behaviour by adding this code to Configuration/TCA/Overrides/tt_address.php in your sitepackage:

$GLOBALS['TCA']['tt_address']['ctrl']['delete'] = 'deleted';

Removed hard deletion of tt_address records. Because of the field "delete" wouldn't be generated otherwise. Use Scheduler Task to delete soft-deleted records instead.


  • Install via extension manager or
  • Install via composer
  • Include static template


Parameter Description Type, Validation Default
dataProtectionPage Uid of page with information about the data protection policy integer 1
adminEmail Email address in admin notification mails string, email, mandatory
adminName Name in admin notification mails string Your admin name
senderEmail Email address in confirmation mails string, email, mandatory noreply@domain.tld
senderName Name in confirmation mails string Your sender name
newsletterName Title of the newsletter / subscription list string Newsletter
showFields Additional fields to show in subscription form (gender,firstName,lastName,company).
email and dataProtection are always shown.
string null
subscribePageUid Uid of page with subscription form. Used for links in templates and mails. string null
useSimpleSpamPrevention whether there should be a simple spam preventition using javascript and session (with session cookie) bool 1
spamTimeout time in seconds to wait before form gets rendered again if spam check fails int 5
useHCaptcha whether hCaptcha ( should be used, needs further configuration bool 0
hCaptchaSiteKey hCaptcha site key, only if hCaptcha is used string 10000000-ffff-ffff-ffff-000000000001
hCaptchaSecretKey hCaptcha secret key, only if hCaptcha is used string 0x0000000000000000000000000000000000000000
sendAdminInfo whether the admin should get an info mail on every confirmation bool 0
mailTemplateRootPath path to the mail templates, root for different languages (e.g. en, de, dk) string EXT:newsletter_subscribe/Resources/Private/Templates/Mail/
mailLayoutRootPath path to the mail layouts used from the templates string EXT:core/Resources/Private/Layouts/
overrideFlexformSettingsIfEmpty Fields, which should be overridden from typosrcipt if left blank in the flexform (like in tx_news, thx to Georg Ringer!). string adminEmail, adminName, subscribePageUid, mailTemplateRootPath, dataProtectionPage, adminName, showFields, newsletterName

Site config (for nicer link in subscriber mails)

    type: Extbase
    extension: NewsletterSubscribe
    plugin: Unsubscribe
        routePath: '/unsubscribe/{unsubscribe}/{uid}'
        _controller: 'Subscribe::unsubscribe'
          unsubscribe: subscriptionHash
          uid: uid
    type: Extbase
    extension: NewsletterSubscribe
    plugin: Subscribe
        routePath: '/confirm/create'
        _controller: 'Subscribe::createConfirmation'
        routePath: '/confirm/{confirm}/{uid}'
        _controller: 'Subscribe::doConfirm'
          confirm: subscriptionHash
          uid: uid
        routePath: '/undosubscribe/{unsubscribe}/{uid}'
        _controller: 'Subscribe::undosubscribe'
          unsubscribe: subscriptionHash
          uid: uid

Unsubscribe link in direct_mail

  1. First add the field subscription_hash to the fields of direct mail in the extension configuration of direct mail: direct mail configuration
  2. Add the link in your mail template:
    <a href="http://www.domain.tld/page/undosubscribe/###USER_subscription_hash###/###USER_uid###">unsubscribe</a> where this undosubscribe/###USER_subscription_hash###/###USER_uid###" is the important part.
    Note: The subscribe plugin must be inserted on the page "page" in that url.

Salutation in direct_mail

  1. Add 'salutation' field (see above 'subscription_hash')
  2. Add ###USER_salutation### on the page

Scheduler Tasks / Console Commands

There are scheduler tasks / console commands available (TYPO3 v10 only) to fill empty database fields in tt_address:

  • newslettersubscribe:fillsalutation
    Updates the salutation field based on the sys_language_uid and gender fields of the tt_address records. The salutation can be configured via TypoScript.
  • newslettersubscribe:fillsubscriptionhash
    Updates the subscription_hash field. This is especially handy if there are subscriptions added manually in the TYPO3 backend or you have legacy data in tt_address. The subscription_hash is necessary for the unsubscribe link in direct_mail to work.

To do

  • creating ajax submit
  • update documentation