Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


The project has been sponsored by Swisscom, and initiated by Web Essentials. Thanks for your support!

This is a tool which adjusts Neos in a way such that it can be used to send Newsletters.

Is is comprised of two parts:

  • a Go Daemon which does the actual Mail-Sending
  • a Neos package this package which provides the User Interface

This is a newsletter sending infrastructure based on Neos. The actual newsletter-sending is handled through Redis and a Go-Daemon, which can be found at


  • Performant and distributed mail sending through SMTP or Mandrill
  • All Newsletter content is manageable through Neos
  • Allow to replace arbitrary content in the newsletter with custom recipient-specific fields.
  • Recipient-specific fields can be previewed in the Desktop preview mode.
  • Support for multiple languages
  • Allowance to seggregate the recipient list arbitrarily to tightly control whom newsletters should be sent to, using the jq query language
  • Custom receiver sources possible
  • Supports Unsubscribe lists in a privacy-preserving manner, not storing email addresses but their hashes
  • Parallel email sending possible by starting multiple Go daemons simultaneously
  • Auto-Inline CSS style sheets for maximum compatibility


The following things are *not yet implemented, but might be implemented in further projects:

  • Sign Up for new Newsletters


  • Install the mailer sending daemon which is written in Go
  • Install Redis
  • Install jq and ensure it exists on the PATH.

Installation / Set Up

  • Install this package through packagist:

    cd path/to/your/NeosDistribution
    composer require sandstorm/newsletter
  • Ensure you have the Routes included, so that means Configuration/Routes.yaml should contain the following before the Neos routes:

    name: 'Newsletter'
    uriPattern: 'neos/newsletter/<NewsletterSubroutes>'
        package: 'Sandstorm.Newsletter'
  • Create a neos page template, using the TypoScript object Sandstorm.Newsletter:NewsletterPage. Also, ensure to include the Sandstorm.Newsletter:SampleDataWidget somewhere in your page.

    As an example, you can use the following TypoScript snippet:

    page = Sandstorm.Newsletter:NewsletterPage
    page.sampleDataWidget = Sandstorm.Newsletter:SampleDataWidget

Receiver Sources and Receiver Groups

Internally, the system uses files for representing receiver lists. Each line in a file represents a single receiver, and is a JSON object containing arbitrary properties (where one must be at least the email address, of course).

  • A receiver source is essentially one source for receivers. Currently, we support both line-by-line JSON and CSV files; but you might want to create your own Receiver Source lateron.

  • If you use multiple languages, the receiver source also contains a rule how the lines are segregated into the different languages.

  • The receiver group is an additional subset of receivers inside a receiver source, so you could create a "male" or "female" receiver source if you like.

Usage in Neos

  • First, go to the Newsletter Receiver Management module and create a new receiver source; in our example choose the type CSV Upload*[]:

  • Then, upload the Documentation/example.csv file. It defines the fields firstName, lastName, email, gender and language and contains just three receivers.

  • If you have a languages content dimension configured, set the correct filters; e.g:

    • German: language == "de"
    • French: language == "fr"
    • (others): false (as the input file does not contain these languages)
  • (optionally) create a receiver group for "Male", with the filter gender == "male", and vice versa for female.

  • Now, in the Content module of Neos, create a new Document of type Newsletter. In the inspector, first select a Receiver Group. Optionally define email subjects etc; and create your content as you like.

  • If your content e.g. includes {firstName}, this will be replaced with the actual first name of the email recipient. You can preview this by switching to the Desktop mode in preview central.

  • Enjoy!

Getting Help

If you get stuck, feel free to contact @sebastian or @christoph.daehne in Slack at


This software is licensed as MIT.