Mail system

Extension key

mail

Package name

mediaessenz/mail

Version

3.6

Language

en

Author

Alexander Grein

License

This document is published under the Open Publication License.

Rendered

Thu, 07 Aug 2025 10:43:32 +0000


This extension implements a versatile mail system based on Extbase & Fluid and uses the latest technologies provided by TYPO3 CMS.


A quick introduction in how to use this extension.

Introduction to the mail extension, dependencies, general information.

In-depth reference about certain aspects of this extension: TypoScript, Page/User TSconfig, Site configuration etc

What does it do?

MAIL is a TYPO3 backend module for sending personalized mails to different groups of recipients.

This can be done from an internal TYPO3 page, from an external URL or a simple text field.

The date time of sending can be scheduled, and it's done by a queue command controller which sends the mails in small packages to prevent blacklisting.

With an easy yaml configuration, included in a site configuration, it is possible to add any database table as recipient source as long all necessary fields are available.

Because this is (mostly) not the case, it is also possible to define an extbase model, where the mapping can be done inside a Configuration/Extbase/Persistence/Classes.php file.

The included mail template and some basic content elements are based on the mail template system of foundation: https://get.foundation/emails.html

Thanks to the same php sass parser used by bootstrap_package, it is possible to modify several settings (colors, widths, paddings, margin) using TypoScript constants.

The extension is highly inspired from direct_mail, and was the base of a massive refactoring. Kudos to all people who put there lifeblood and love in this project.

For all EXT:direct_mail users who wants to try out this extension: A direct_mail -> mail migration script can be found in the upgrade wizard of the TYPO3 install tool after installing MAIL.

Dependencies

MAIL make use of several packages all found at packagist.org:

Kudos to all involved coders who put her love and energy in it. Without her, this extension would not exist.

Here comes a brief explanation of what each package is used for:

friendsoftypo3/tt-address

Store mail recipients

friendsoftypo3/jumpurl

Used for click tracking

typo3/cms-redirects

Used for redirects of shorted links in plain text mails

scssphp/scssphp

This package transpiles scss files to css, which makes it possible to use the scss files of foundation mail and change there values (colors, dimensions) using typoscript constants. I had to modify the original scss from foundation a little, because the scssphp package could currently not handle sass modules like math, which were used on some places. See https://github.com/scssphp/scssphp/issues/421 for more information. Basically, I just replaced all math.div() with /.

pelago/emogrifier

This package is needed to convert all css to inline styles, which is unfortunately necessary for outlook and co.

league/html-to-markdown

This package is used to convert an html mail to a plain text (markdown) version using a middleware, just by adding ?plain=1 to the url. It has the ability to add own converters, which is used by this extension to handle the mail boundaries, which wrapped around every content element.

masterminds/html5

This package is used on several places to extract specific parts of a mail (e.g. links, images, special data attributes).

ddeboer/imap

This package is used by the AnalyzeBounceMailCommand to read the mail account of returned mails.

Sponsoring

This extension and the manual took several hundred hours to create. If this extension helps you in any way to meet your business needs, please consider to give something back.

Here are two ways to balance energy:

Patreon

Support me on patreon.com

PayPal

Support me on paypal.com.

It's just one click away!

Rate it

In any case, please rate my extension here: https://extensions.typo3.org/extension/mail

and if you are using composer to install it, here as well: https://packagist.org/packages/mediaessenz/mail

To do so, you have to login first in the corresponding system.

Thank you!

Quick installation

To add this extension to your existing TYPO3 system, you have tree options:

  1. Composer installation (recommended)

    composer require mediaessenz/mail
    Copied!
  2. Extension manager

    Open "Admin and maintenance tools" > "TYPO3 extension manager" and search for "mail". Install it by clicking on the install button.

  3. Download

    Download it from here: https://extensions.typo3.org/extension/mail and use the extension manager to upload and install it.

Update the database scheme

After the first install, depending of the way (composer or other), it could be necessary to update the database, to get ready for go.

Open your TYPO3 backend with t3start:system-maintainer permissions.

In the module menu to the left navigate to Admin Tools > Maintenance, then click on Analyze database and create all.

Clear all caches

Clearing all caches after installing a new extension is always a good thing.

In the same module like before, you can also conveniently do this by clicking the button Flush cache.

Quick configuration

  1. Add recipient sources

    MAIL needs a yaml configuration for recipient sources. It comes with a ready configuration for frontend user groups (fe_groups), frontend user (fe_users) and addresses (tt_address).

    To add them all, just import the included yaml into your site configuration:

    imports:
       - { resource: "EXT:mail/Configuration/Site/RecipientSources.yaml" }
    Copied!

    Read more about how to add your own recipient sources in the Site configuration reference.

  2. Add a new sys-folder inside (!) of your page tree (not on page 0!)

    This folder will be used to store the MAIL pages later. Remember the uid of this new sys-folder page, you may need it in a later step.

    Open the settings of the new created sys-folder page, go to tab Behaviour and select MAIL Module under Contains plugin.

  3. Add static Page TSconfig files

    Switch to tab Resources and add this three static Page TSconfig entries:

    • MAIL: Remove not supported content element (mail)
    • MAIL: Add simple mail backend layout (mail)
    • MAIL: Default settings for mail pages (mail)

    Press the good old floppy disc icon to save.

    After saving, a new backend layout MAIL should be available under the Appearance tab.

  4. Select MAIL backend layout

    Choose it for this page and also for the subpages.

  5. Include TypoScript templates

    To use the included table based content elements, a corresponding TypoScript is provided by this extension.

    Go module Web > Template and chose your MAIL sys-folder. If not already done, create an extension template. Switch to view Info/Modify and click on Edit the whole template record.

    Switch to tab Option and check Constants and Setup to remove TypoScript settings from TypoScript records up in root-line.

    Switch to tab Includes and add the following templates from the list to the right:

    • Fluid Content Elements (fluid_styled_content)
    • MAIL (mail)

    Read more about possible configurations via TypoScript in the Reference section.

  6. Configure default settings

    MAIL brings – similar to EXT:direct_mail – an easy way to adjust some default settings, used by the mail creation wizard.

    You find it by clicking on the cog button (Configuration) on the upper right corner of the MAIL wizard module.

    The input fields are divided into several groups, which can be reached by clicking on their titles.

    After filling all fields with your data, press SAVE to store.

Further reading

Create recipient groups

Since this extension is made to send personalized mails to groups of recipients, this groups has to be defined first.

MAIL comes with a lot of possibilities:

  • From pages

    • Compare to EXT:direct_mail, MAIL is not limited to fe_groups, fe_users, tt_address and one custom table
    • It is possible to add as many tables you like, as long they have the needed fields or an extbase model which implements at least the RecipientInterface, defined in Classes/Domain/Model/RecipientInterface.php
    • To make it even more flexible it is possible to define query restrictions (for tables) or use the RecipientsRestrictionEvent (for extbase) to filter recipients list. Checkout https://gitlab.com/mediaessenz/additional-mail-recipients how to do it.
    • Beside the recipient source (table) it is also possible to set a starting point where the records should be taken from
    • Categories can also be set to filter the list of recipients to only those who have at least one of them assigned as well
  • Plain list

    • A comma separated list of recipients (just mails or names and mails separated by a comma or semicolon)
    • Compare to EXT:direct_mail, within MAIL you also can choose whether the recipients should get html or plain mails.
    • Categories are also assignable
  • CSV (Plain/File)

    • Configurable CSV input format (different separators, enclosures and check if first line contain field names)
    • If the first line doesn't contain the fieldnames, the order of the data must be "name", "email" and (optionally) "salutation"
    • Data can be plain pasted into the data field or from a selected csv file (must be utf-8 encoded!)
    • Compare to EXT:direct_mail, within MAIL you also can choose whether the recipients should get html or plain mails.
    • Categories are also assignable
  • Static list

    • Single records of all defined sources can be added – also fe_groups which will add all fe_users who have this groups assigned.
  • From other recipient lists

    • To make things even more flexible, it is also possible to create a compilation of different other recipient groups.

Some EXT:direct_mail power users may miss the possibility to define queries as sending groups. This feature is currently not available, and will maybe come with a future release. Sponsoring is highly welcome.

Importing CSV data (plain/file) as tt_address records

This module, which needs tt_address to be installed, gives you the option to import a csv (comma-separates list) of addresses as tt_address records, which could be added as "From pages" or "Static list" recipient group afterwards.

To make it easier to import csv records, there is a wizard, which guide you through the process.

In the first step you can choose to upload a csv file or paste the records into a text field. You can use comma (;), semicolon (;), or colon (:) as field delimiter. This can be configured in the second step.

By clicking the NEXT button, the csv file or csv records are uploaded and the second step is shown. In this step you can specify the detail information of the csv data, such as field delimiter, field encapsulation, and field name in the first line. You can also specify the sys-folder, where the records should be imported to, the uniqueness of the records, rename or update the records if a similar record is found, or to empty the sys-folder before importing.

After specifying the configuration you can start mapping the fields. There are 3 columns in the mapping step. The description column shows the first row of the csv records (if you set in the configuration that the first row is the field names) or shows only field_xx (where xx is continuous number).

The mapping column shows only the list of field, which are part of tt_address table. You must at least map the field “Name” and “Email”.

The value column shows the first up to three rows from the csv records. They should help you to map the field.

You can also set the HTML flag or categories to all records you are importing.

In the select box, which contains the field names of tt_address, there is also an entry “categories”. This entry can be mapped to a comma-separated list of sys_category IDs. This value will overwrite whatever categories you selected in the “Additional options” section.

After mapping the fields you are ready to start the import process by pressing the IMPORT button. If finished a list of new imported, invalid email, updated and doublet records will be shown.

This process generates tt_address records in the choosen folder. To create a recipient group from this records, you must add a new recipient group of the type “From pages” and select “Addresses” as Recipient source. Then choose the folder where you imported the records under "Startingpoint" and finally press Save.

Create MAIL page

MAIL brings an own page type (#24, can be changed inside extension settings), which appear as a new icon (letter within an envelope) above the page tree, beside the other page type icons.

To create a new mail, just drag and drop the MAIL page icon inside the new mail sys-folder created in the corresponding configuration step.

Now you can add content to the MAIL page using the normal page module.

As you may notice, only a few content elements are available, and some of them do not work yet.

Currently only headline, text, text with image, text with media, image and html are working.

Additionally (untested) it should be possible to add a news plugin.

The included content elements are inspired by EXT:luxletter. Thanks to in2code for making it public.

Create MAIL content

Let's add a headline element first and enter this content inside the headline field:

###USER_salutation###
Copied!

This is a marker or placeholder which will later be replaced by the individual recipient data.

There are a lot of other placeholders available:

###USER_uid###
###USER_salutation###
###USER_name###
###USER_title###
###USER_email###
###USER_phone###
###USER_www###
###USER_address###
###USER_company###
###USER_city###
###USER_zip###
###USER_country###
###USER_fax###
###USER_firstname###
###USER_first_name###
###USER_last_name###
Copied!

Additional ALL as uppercase version:

###USER_SALUTATION###
###USER_NAME###
...
Copied!

This will result in the uppercase salutation, name, ... of the recipient later.

Inspired by EXT:direct_mail, there are also some special placeholders available:

###MAIL_RECIPIENT_SOURCE###
###MAIL_ID###
###MAIL_AUTHCODE###
Copied!

To keep things simple for now, only add another content element to the MAIL page, e.g. a "text with image".

After adding some dummy text choosing an image, specify its position, save and close it.

Create mailing

  1. Choose source

    Click the blue/white envelope icon of the MAIL wizard module.

    Choose the MAIL sys-folder and move over to the main content area of this module, where the accordion for "Internal Page" should now show the previous created MAIL page.

    With the two page preview buttons (page-eye-icon) you can get an idea how the mail will look like at the mail client of the recipient later.

    To continue click the NEXT button to get to the settings page.

  2. Settings

    On this page you can check and adjust the settings of the mail, whose defaults can be changed via the configuration on the previous page.

    You can either change individual values by clicking on them, or edit all of them at once by clicking the edit button.

    At this place it is also possible to add attachments by clicking on the paper clip button.

    If done, click NEXT again to get to the category settings.

  3. Categories

    Since it is possible to choose categories inside the different recipient sources (eg. fe_users, tt_address) it must also be possible to set categories inside the different content elements.

    This is what can be done here.

    During moving your mouse over a row of categories the corresponding content elements on the right side gets highlighted.

    To see categories at this place, they must be defined before, of course. How this can be done is described in the categories.

    But for now you can skip this step by click on NEXT, which brings you to the fourth step: test mail

  4. Test mail

    Here you can send a simple test mail to one or a list of mail addresses. But beware: The generated mail will include ALL content elements regardless of their categories. User fields will NOT be substituted with data.

    After pressing NEXT another time, you reached the last point of this wizard: Schedule sending

  5. Schedule sending

    On this site you can choose one (or more) recipient groups and the date/time when distribution should start.

    For our test, just choose the recipient group you created in the Create recipient group step and press FINISH.

Send mail

With finishing the schedule step of the wizard, a mail is added to the MAIL queue, which has its own backend module. Watch out for the blue/white clock icon on the left side.

If you click that clock button, you should see your mailing on top now.

In case you did not have configured the MAIL sending queue command controller inside the TYPO3 scheduler module yet, you can press the button "Start sending manually" for now.

This will send the mail immediately to the members of the recipient group you choose in the last step of the MAIL wizard.

Now go to the mail program of your trust, to receive the recently generated mail.

Mail Report

If you had included links to internal or external pages in the mail content and also enabled click tracking in the MAIL configuration module, you can also check which links were clicked and how often. To do this, move to the report's module by clicking on the pie chart icon:

To get the report of a specific mail, click on the corresponding mail subject:

Under the panel "Mail" you can see some basic stuff.

Under the panel "Performance" you can see some metrics about the responses.

This numbers, especially "Unique responses (links clicked)" and "Total responses/Unique responses" are taken from the code developed from the EXT:direct_mail team.

I have no clue, how relevant they are and even show the right values. If someone with marketing skills could give me feedback about it, I would really be happy.

The panel "Delivery failed" shows the different types of returned mails.

If returned mails found, a forth box will appear, to view, delete or disable the corresponding recipients.

Pitfalls

Wrong Entry Point

This extension needs an entry point with a protokoll and domain to proper fetch internal pages.

An entry point with just a slash ("/") will not work!

This value can be set here "Sites Module" > "Edit site" > "General" > "Entry Point".

If you e.g. use the introduction package, this value is set to "/" by default!

Self Signed Certificates

If you use a self signed certificate, you should also check, that "HTTP" > "verify" is set to "0".

This can be done under "Admin Tools" > "Settings" > "Configure Installation Wide Options" > Filter by "verify" > enter "0" > Press "Write configuration"

Jumpurl Error Messages

The current version of jumpurl found in ter (8.0.3) has some php 8 issues:

There is already a pending pull request, which unfortunately stuck in that state since a while:

To help your self out, you could download the zip of the pull request repo, which contains the necessary fixes under this url:

After downloading, rename the master.zip to jumpurl_8.0.3.zip and upload it within the extension manager.

Extension Configuration

Some general settings can be configured in the Extension Configuration.

  1. Go to Admin Tools > Settings > Extension Configuration
  2. Choose mail

The settings are divided into several tabs and described here in detail:

Properties

Mail

defaultRecipientFields

defaultRecipientFields
type

string

Default

uid, salutation, name, title, email, phone, www, address, company, city, zip, country, fax, firstname, first_name, last_name

Comma separated list of default recipient fields. Will be available by markers in a mail message. e.g. name as ###USER_name### or ###USER_NAME### filled with (uppercase) value of the user.

additionalRecipientFields

additionalRecipientFields
type

string

Default
 

Comma separated list of additional fields that may be substituted in the mail messages.

mailPageTypeNumber

mailPageTypeNumber
type

int

Default

24

MAIL page type number. Change this number only if another extension use the same.

mailModulePosition

mailModulePosition
type

string

Default

after:web

MAIL modules position in the side navigation. If set to empty, the module will move to the end of all other modules

mailModulePageId

mailModulePageId
type

int

Default
 

MAIL module page id. If set, page tree navigation will be hidden in MAIL module. Here you can add the uid of the MAIL sys-folder if you only have one.

mailModulePageIds

mailModulePageIds
type

string

Default

auto

MAIL module page id. Reduces the page tree of the mail modules to a comma separated list of page uids. If set to "auto" (default), the list will be automatically taken from the pages database table, based on the selected module. This value can be overwritten via userTS.

Feature

hideNavigation

hideNavigation
type

bool

Default
 

Hide navigation: If set, page tree navigation will be hidden in mail module. User tsconfig parameter tx_mail.mailModulePageId has to be set!

deleteUnusedMarkers

deleteUnusedMarkers
type

bool

Default

1

Delete unused markers in personalized mails. All markers/placeholder without corresponding recipient data will remove from personalized mails.

notificationJob

notificationJob
type

bool

Default

1

Enable notification mail. Allow MAIL to send notification about start and end of a mailing job.

deactivateCategories

deactivateCategories
type

bool

Default

Deactivate categories. Attention: If set, ALL category fields inside tt_content,fe_users,tt_address,tx_mail_domain_model_group will be disabled!

useHttpToFetch

useHttpToFetch
type

bool

Default

Use http connection for fetching Newsletter-Content. Even if your TYPO3 Backend is in SSL-Mode, the URL for fetching the newsletter contents will be http

Direct Mail Migration

directMailCategorySysCategoryMapping

directMailCategorySysCategoryMapping
type

string

Default
 

Mapping sys_dmail_category -> sys_category. Used by update wizard to migrate Direct Mail records to MAIL records. Format: 1:2,2:3,3:4 maps Direct mail category 1 to sys_category 2 and Direct mail category 2 to sys_category 3 and so on. If categories not found or set, new categories will be added.

directMailCategorySysCategoryParentCategory

directMailCategorySysCategoryParentCategory
type

int

Default
 

Parent sys_category used by sys_dmail_category -> sys_category migration. If the migrated categories should be attached to a parent sys_category.

Site Configuration

This extension needs a existing site configuration to work, which should be standard nowadays.

There are two site configurations coming with this extension, both life inside the EXT:mail/Configuration/Site folder.

Transport.yaml

This configuration should only be used as a copy base for your own mail transport settings. The supported parameters are the same as definable in $GLOBALS['TYPO3_CONF_VARS']['Mail'].

Adding one or more of this setting inside your site configuration is only necessary if you like to override the mail transport setting for a specific site. If a property is not set via site config, there corresponding system setting is used, defined in $GLOBALS['TYPO3_CONF_VARS']['Mail']. The overrides do only affect the transport settings used by EXT:mail or its MEDIAESSENZ\Mail\Mail\(Mailer|MailMessage) classes.

RecipientSources.yaml

To add all recipient sources come with MAIL (fe_groups, fe_users, tt_address) you has nothing to do.

MAIL imports the settings stored in this file:

imports:
   - { resource: "EXT:mail/Configuration/Site/RecipientSources.yaml" }
Copied!

If you would like to add your own recipient sources, just add it to your site configuration under the key mail.recipientSources.

Here is an example of how to add a table which has all necessary fields (at least uid, email, name, salutation, mail_html, mail_active):

mail:
   recipientSources:
      tx_extension_domain_model_address: #<- Table name
         title: 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:tx_extension_domain_model_address.title' #<- title of the recipient source
         icon: 'tcarecords-tx_extension_domain_model_address-default' #<- icon identifier
Copied!

To simplify things a bit, it is also possible to ignore the mail_html and mail_active fields (they not need to exist at all). To do this, just add forceHtmlMail: true or/and ignoreMailActive: true to your recipientSource configuration.

It is also possible to use a table more than once to create recipient sources with a subset of e.g. tt_address records.

mail:
   recipientSources:
      female_tt_address:
         table: 'tt_address'
         title: 'Female filtered tt_address records using table'
         icon: 'tcarecords-tt_address-default'
         queryRestrictions:
           - 'MEDIAESSENZ\AdditionalMailRecipients\Database\Query\Restriction\FemaleRestriction'
         csvExportFields: [uid,gender,name,first_name,middle_name,last_name,title,email,phone,www,address,company,city,zip,country,fax,categories,mail_salutation,mail_html,tstamp]
Copied!

In this case the table name has to be defined as table property. To create a subset of tt_address records, one or more QueryRestrictions can be defined.

Such a QueryRestrictions could look like this:

<?php
namespace MEDIAESSENZ\AdditionalMailRecipients\Database\Query\Restriction;

use TYPO3\CMS\Core\Database\Query\Expression\CompositeExpression;
use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder;
use TYPO3\CMS\Core\Database\Query\Restriction\QueryRestrictionInterface;

class FemaleRestriction implements QueryRestrictionInterface
{
    public function buildExpression(array $queriedTables, ExpressionBuilder $expressionBuilder): CompositeExpression
    {
        $constraints = [];
        foreach ($queriedTables as $tableAlias => $tableName) {
            if ($tableName === 'tt_address') {
                // attention: since gender is a string in tt_address the value has to be set in double quotes!
                // normally this should be done with help of the $queryBuilder->createNamedParameter('f', Connection::PARAM_STR)), but here we do not have the query builder :-(
                $constraints[] = $expressionBuilder->eq(
                    $tableAlias . '.' . 'gender',
                    '"f"'
                );
            }
        }
        return $expressionBuilder->and(...$constraints);
    }
}
Copied!

If a table doesn't contain the upper mentioned fields, or the fields have different names, it is also possible to use an extbase model to map fields to the need. A site configuration doing this could look like this:

mail:
   recipientSources:
      tx_extension_domain_model_address: #<- Table name
         title: 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:tx_extension_domain_model_address.title' #<- title of the recipient source
         icon: 'tcarecords-tx_extension_domain_model_address-default' #<- icon identifier
         model: Vendor\Extension\Domain\Model\MailAddress #<- the extbase model
Copied!

Beside of the site configuration a model definition and a mapping configuration is needed as well. Check the included model EXT:mail/Classes/Domain/Model/Address.php and EXT:mail/Configuration/Extbase/Persistence/Classes.php for how this can look like.

The model needs to implement at least the included RecipientInterface. If you like to use categories, to send specific parts of a mail only to a specific group of recipients, the included CategoryInterface has to be implemented as well.

Since this extension can handle simple tables and extbase models as well, and in the end its data only used to replace a simple placeholder like ###USER_name###, I decided to use simple arrays for transporting.

Because of this, every model needs to have a getEnhancedData method, which must return an array of all fields, which should serve as placeholder later on. Btw.: The same method will be used by the csv-export inside the recipient group module.

It is also possible to create a subset of record from a domain model source.

Since MAIL doesn't use the "normal" repository classes of a model, this restriction has to be added as an event listener (RecipientsRestrictionEvent).

An example how this could look like, can be found here: https://gitlab.com/mediaessenz/additional-mail-recipients

The responsible files in the example extension are
  • Configuration/Services.yaml (line 16-19)
  • Configuration/Site/RecipientSources.yaml (line 12-19)
  • Classes/EventListener/AddressModelRestriction.php.

TypoScript

Page View Settings

All page view settings need to be prefixed with plugin.mail.view.page.

Properties

templatesRootPath

templatesRootPath
type

string

Default

EXT:mail/Resources/Private/Templates/Mail/

Path

plugin.mail.view.page.templatesRootPath

Path to template root for mail pages (FE)

partialsRootPath

partialsRootPath
type

string

Default

EXT:mail/Resources/Private/Partials/

Path

plugin.mail.view.page.partialsRootPath

Path to partials root for mail pages (FE)

layoutsRootPath

layoutsRootPath
type

string

Default

EXT:mail/Resources/Private/Layouts/

Path

plugin.mail.view.page.layoutsRootPath

Path to layouts root for mail pages (FE)

Content View Settings

All content view settings need to be prefixed with plugin.mail.view.content.

Properties

templatesRootPath

templatesRootPath
type

string

Default

EXT:mail/Resources/Private/Templates/ContentElements/

Path

plugin.mail.view.content.templatesRootPath

Path to template root for mail contents (FE)

partialsRootPath

partialsRootPath
type

string

Default

EXT:mail/Resources/Private/Partials/

Path

plugin.mail.view.content.partialsRootPath

Path to partials root for mail contents (FE)

layoutsRootPath

layoutsRootPath
type

string

Default

EXT:mail/Resources/Private/Layouts/

Path

plugin.mail.view.content.layoutsRootPath

Path to layouts root for mail contents (FE)

Header Settings

All header settings need to be prefixed with plugin.mail.settings.header.

Properties

title

title
type

string

Default

Newsletter

Path

plugin.mail.settings.header.title

Title of the mail header

image.src

image.src
type

string

Default

EXT:mail/Resources/Public/Images/Logo.png

Path

plugin.mail.settings.image.src

Logo source

image.alt

image.alt
type

string

Default

Logo

Path

plugin.mail.settings.image.alt

Logo alt text

image.width

image.width
type

string

Default

300

Path

plugin.mail.settings.image.width

Logo width

image.height

image.height
type

string

Default
 
Path

plugin.mail.settings.image.height

Logo height

SCSS Settings

All scss settings need to be prefixed with plugin.mail.settings.scss.

Properties

modifications

modifications
type

string

Default

EXT:mail/Resources/Public/Scss/mail.scss

Path

plugin.mail.settings.scss.modifications

Scss file to modify the default scss of foundation mail

primary-color

primary-color
type

color

Default

#037eab

Path

plugin.mail.settings.scss.primary-color

Primary color, used with components that support the .primary class

secondary-color

secondary-color
type

color

Default

#777777

Path

plugin.mail.settings.scss.secondary-color

Secondary color, used with components that support the .secondary class

success-color

success-color
type

color

Default

#3adb76

Path

plugin.mail.settings.scss.success-color

Color to indicate a positive status or action, used with the .success class

warning-color

warning-color
type

color

Default

#ffae00

Path

plugin.mail.settings.scss.warning-color

Color to indicate a caution status or action, used with the .warning class

alert-color

alert-color
type

color

Default

#ec5840

Path

plugin.mail.settings.scss.alert-color

Color to indicate a negative status or action, used with the .alert class

light-gray

light-gray
type

color

Default

#f3f3f3

Path

plugin.mail.settings.scss.light-gray

Color used for light gray UI items within Foundation

medium-gray

medium-gray
type

color

Default

#cacaca

Path

plugin.mail.settings.scss.medium-gray

Color used for medium gray UI items within Foundation

dark-gray

dark-gray
type

color

Default

#8a8a8a

Path

plugin.mail.settings.scss.dark-gray

Color used for dark gray UI items within Foundation

black

black
type

color

Default

#0a0a0a

Path

plugin.mail.settings.scss.black

Color used for black ui items within Foundation

white

white
type

color

Default

#fefefe

Path

plugin.mail.settings.scss.white

Color used for white ui items within Foundation

pre-color

pre-color
type

color

Default

#ff6908

Path

plugin.mail.settings.scss.pre-color

Code color (<pre>)

header-color

header-color
type

color

Default

#444444

Path

plugin.mail.settings.scss.header-color

Headlines color

global-font-color

global-font-color
type

color

Default

#444444

Path

plugin.mail.settings.scss.global-font-color

Text color

header-background-color

header-background-color
type

color

Default

#037eab

Path

plugin.mail.settings.scss.header-background-color

Header background color

body-background

body-background
type

string

Default

$light-gray

Path

plugin.mail.settings.scss.body-background

Body background color

container-background-color

container-background-color
type

string

Default

$white

Path

plugin.mail.settings.scss.container-background-color

Container background color

global-width

global-width
type

string

Default

600px

Path

plugin.mail.settings.scss.global-width

Container width

global-width-small

global-width-small
type

string

Default

95%

Path

plugin.mail.settings.scss.global-width-small

Container width (small screens)

global-gutter

global-gutter
type

string

Default

20px

Path

plugin.mail.settings.scss.global-gutter

Gutter for grid elements

global-gutter-small

global-gutter-small
type

string

Default

$global-gutter

Path

plugin.mail.settings.scss.global-gutter-small

Gutter for grid elements (small screens)

global-padding

global-padding
type

string

Default

20px

Path

plugin.mail.settings.scss.global-padding

Global padding

global-margin

global-margin
type

string

Default

16px

Path

plugin.mail.settings.scss.global-margin

Global margin

global-radius

global-radius
type

string

Default

3px

Path

plugin.mail.settings.scss.global-radius

Global radius

global-rounded

global-rounded
type

string

Default

500px

Path

plugin.mail.settings.scss.global-rounded

Global rounded radius of rounded-corners

global-breakpoint

global-breakpoint
type

string

Default

$global-width + $global-gutter

Path

plugin.mail.settings.scss.global-breakpoint

Global media query to switch from desktop to mobile styles

Content Objects

This extension brings two new content object EMOGRIFIER and SCSS

EMOGRIFIER is used to transform all given css files to inline styles.

SCSS is used to transform given scss files to css.

See EXT:mail/Configuration/TypoScript/ContentElements/setup.typoscript for how to use.

Page TSconfig

Restrict categories example

Here is an Page TSconfig example of how to restrict a list of categories to a specific parent category (has uid 1 in this example):

TCEFORM.tt_content.categories.config.treeConfig.startingPoints = 1
TCEFORM.tt_content.categories.config.treeConfig.appearance.nonSelectableLevels = 0
TCEFORM.tt_address.categories.config.treeConfig.startingPoints = 1
TCEFORM.tt_address.categories.config.treeConfig.appearance.nonSelectableLevels = 0
TCEFORM.fe_users.categories.config.treeConfig.startingPoints = 1
TCEFORM.fe_users.categories.config.treeConfig.appearance.nonSelectableLevels = 0
TCEFORM.tx_mail_domain_model_group.categories.config.treeConfig.startingPoints = 1
TCEFORM.tx_mail_domain_model_group.categories.config.treeConfig.appearance.nonSelectableLevels = 0
Copied!

This config placed in the Page TSconfig field of the MAIL sys-folder page, will reduce all categories shown in tt_content, tt_address, fe_users and for simple list recipient groups living inside the MAIL sys-folder to the parent category with the uid 1.

Beside of this, the nonSelectableLevels = 0 lines prevent the parent category itself to be selectable.

User TSconfig

The following properties may be used in user TSConfig (BE user or BE usergroups) to configure parts of the different MAIL modules.

hideTabs

hideTabs
type

string

Default
 
Path

tx_mail.hideTabs

Comma separated list of not needed mail sources in the mail wizard.

Available value:

  • internal: hide the internal page option
  • external: hide the external page option
  • quickmail: hide the quick mail option
  • draft: hide the draft mail option

defaultTab

defaultTab
type

string

Default

draft

Path

tx_mail.defaultTab

Possible options: internal, external, quickmail, draft

hideConfiguration

hideConfiguration
type

bool

Default
Path

tx_mail.hideConfiguration

Hide configuration button in mail wizard and queue module.

hideEditAllSettingsButton

hideEditAllSettingsButton
type

bool

Default
Path

tx_mail.hideEditAllSettingsButton

Hide edit all settings button in mail wizard settings step.

settingsWithoutTabs

settingsWithoutTabs
type

bool

Default
Path

tx_mail.settingsWithoutTabs

Show mail settings in wizard step and report without tabs.

settings.general

settings.general
type

string

Default

subject,fromEmail,fromName,organisation,attachment

Path

tx_mail.settings.general

Comma separated list of general fields which should be visible in the mail wizard settings step and report.

settings.headers

settings.headers
type

string

Default

replyToEmail,replyToName,returnPath,priority

Path

tx_mail.settings.headers

Comma separated list of header fields which should be visible in the mail wizard settings step and report.

settings.content

settings.content
type

string

Default

sendOptions,includeMedia,redirect,redirectAll,authCodeFields

Path

tx_mail.settings.content

Comma separated list of content fields which should be visible in the mail wizard settings step and report.

settings.source

settings.source
type

string

Default

type,renderedSize,page,sysLanguageUid,plainParams,htmlParams

Path

tx_mail.settings.source

Comma separated list of source fields which should be visible in the mail wizard settings step and report.

readOnlySettings

readOnlySettings
type

string

Default

type,renderedSize

Path

tx_mail.readOnlySettings

Comma separated list of fields which should be read only in the mail wizard settings step. Attention: this is only a visual restriction! If the user has the rights to change the corresponding fields of the tx_mail_domain_model_mail table he/she will be able to do this by clicking the "edit complete record" button! To prevent this, you have to restrict the fields in the usergroup settings (exclude fields) as well.

hideCategoryStep

hideCategoryStep
type

bool

Default
Path

tx_mail.hideCategoryStep

hideExcludeRecipientGroups

hideExcludeRecipientGroups
type

bool

Default
Path

tx_mail.hideExcludeRecipientGroups

Hide the exclude recipient groups in the last mail wizard step.

showSendingPriority

showSendingPriority
type

bool

Default
Path

tx_mail.showSendingPriority

Show the sending priority in the last mail wizard step. Mails marked as "high" will be send before other mails.

defaultSendingPriority

defaultSendingPriority
type

int+

Default
Path

tx_mail.defaultSendingPriority

Set the default sending priority for the last mail wizard step.

Possible values are:

0 - Normal

1 - High

hideManualSendingButton

hideManualSendingButton
type

bool

Default
Path

tx_mail.hideManualSendingButton

Hide manual sending button in queue module.

hidePauseButton

hidePauseButton
type

bool

Default
Path

tx_mail.hidePauseButton

Hide pause and continue button in queue module.

hideDeleteRunningSendingButton

hideDeleteRunningSendingButton
type

bool

Default
Path

tx_mail.hideDeleteRunningSendingButton

Hide delete running sending button in queue module.

hideDeleteReportButton

hideDeleteReportButton
type

bool

Default
Path

tx_mail.hideDeleteReportButton

Hide delete report button in report module.

mailModulePageId

mailModulePageId
type

int

Default
 
Path

tx_mail.mailModulePageId

If extension configuration parameter hideNavigation is set to 1 or mailmodulepageid <extension-configuration-mail-module-page-id> is set to a mail module page, this value can be set to a (different) mail module page id. This way it is possible to show a user individual mail module.

mailModulePageIds

mailModulePageIds
type

string

Default
 
Path

tx_mail.mailModulePageIds

Reduces the page tree of the mail modules to a comma separated list of page uids. If set to "auto", the list will be automatically taken from the pages database table, based on the selected module (see here). This value overrides the extension configuration with the same name.

This setting is ignored if mailModulePageId or hideNavigation is set, because this will result in no page tree at all!

Events

AdditionalMailHeadersEvent

Adds possibility to modify mail headers

DeactivateRecipientsEvent

To deactivate returned mail recipients within the report module (beside tt_address and fe_users), it is necessary to register corresponding event listeners.

See MEDIAESSENZ\Mail\EventListener\DeactivateAddresses and DeactivateFeUsers for example.

ManipulateCsvImportDataEvent

Adds possibility to modify csv data during import them to tt_address records. This needs tt_address to be installed.

ManipulateMailRecipientsEvent

Adds possibility to manipulate the recipients list of a mailing right after finishing the mail wizard.

ManipulateMarkersEvent

See MEDIAESSENZ\Mail\EventListener\AddUpperCaseMarkers for example.

ManipulateRecipientEvent

See MEDIAESSENZ\Mail\EventListener\ManipulateAddressRecipient and MEDIAESSENZ\Mail\EventListener\ManipulateFrontendUserRecipient for example.

RecipientsRestrictionEvent

Adds possibility to restrict recipients from extbase model sources

ScheduledSendBegunEvent

Adds possibility to do something after scheduled sending begun

ScheduledSendFinishedEvent

Adds possibility to do something after scheduled sending finished

Need more?

Please contact me

Command Controller

MAIL comes with tree different command controller, which all can be added as task inside the TYPO3 scheduler module.

MassMailingCommand

This command is responsible for adding scheduled mailings to the sending queue. There are two mandatory parameters:

  • site-identifier
  • send-per-cycle

The first one (site-identifier) is the identifier of the site configuration where MAIL can find its recipient sources configuration. You can find it inside the TYPO3 sites module under the "General" tab.

The second (send-per-cycle) determine how many mails should be sent per cycle.

The time between a cycle can be defined in the "Frequency" field of a task. e.g. * * * * * will run the task every minute, if you put 50 into the send-per-cycle field, 50 Mails per minute will be sent.

AnalyzeBounceMailCommand

This command fetches returned mails from the mail account defined in the return-path field of the MAIL configuration module. Depends on special headers, the reason of the return will be added to the report of the corresponding mail.

SpoolSendCommand

This command controller can be used to send mail in a queue. It's basically the same coming with TYPO3, but it uses a site specific mail transport configuration. See site configuration Transport.yaml under Integration up in this manuel. To make this command controller work, it is also necessary to set transport_spool_type to file or memory. if the type was set to file, the transport_spool_type has to be set as well, e.g. to upload/tx_mailspool/. This command controller is not really needed by this extension, since the sending is already queued by the MassMailingCommand. But if a developer wants to use the extended Mail-Classes MEDIAESSENZ\Mail\Mail\(Mailer|MailMessage) inside their own extension, it can be usefully.

ClearScssParserCacheCommand

This command controller clears the scss parser cache files located in typo3temp/assets/mail/css. This cache is also cleared after a mail report is deleted.

ViewHelpers

PreviewLinksViewHelper

Usage:

<f:variable name="previewLinks" value="{mail:previewLinks(uid:uid,pageId:pageId)}"/>
Copied!

Parameters:

uid:

Uid of the mail page

pageId:

Page id of the mail-sys-folder containing the mail configuration mod.web_modules.mail.sendOptions.

Returns:

Preview-links, title, languageUid and flag-icon-identifiers for every language and type (plain/html), grouped by types. The types (plain and/or html) will be taken from the Page TSconfig parameter mod.web_modules.mail.sendOptions from the given pageId, defined with e.g. the mail configuration module under "Mail format (default)".

GetBodyContentViewHelper

Extract the body tag content of the mail html content. Used to embed the mail html content.

Usage:

{mail.htmlContent -> mail:getBodyContent()}
Copied!

RemoveMailBoundariesViewHelper

Remove the mail boundaries from the mail plain content. Used to embed the mail plain text content.

Usage:

{mail.plainContent -> mail:removeMailBoundaries()}
Copied!

ConstantViewHelper

Usage:

   <f:variable name="contentSelectionBoundary" value="{mail:constant(name:'CONTENT_SECTION_BOUNDARY')}"/>
<!--{contentSelectionBoundary}_-->Content for all<!--{contentSelectionBoundary}_END-->
<!--{contentSelectionBoundary}_1-->content for category 1<!--{contentSelectionBoundary}_END-->
<!--{contentSelectionBoundary}_1,2,3-->content for category 1, 2 and 3<!--{contentSelectionBoundary}_END-->
Copied!

Parameters:

name:

Name of the constant

classFQN:

Full qualified name of the class containing the constants. Default: MEDIAESSENZMailConstants

Returns:

The value of the constant if exists, otherwise null.

3.0.0 - 26th Sept. 2024

TYPO3 13 compatibility + Recipient group refactoring

  • Add more possibilities to manipulate recipient groups using query restrictions on tables or extbase model based recipient sources
  • Enhanced csv based recipient groups
  • Add feature to reduce the list of recipients of a mailing by choosing one or more other recipient groups
  • Improved bounce mails handing (needs IMAP account now!)

New features

Breaking changes

  • Recipient Source Configurations now uses the DTO MEDIAESSENZ\Domain\Model\Dto\RecipientSourceConfigurationDTO.

    Previously the getRecipientSourceConfiguration method of the following events returns an array:

    • ManipulateMarkersEvent
    • ManipulateRecipientEvent
    • DeactivateRecipientEvent

    Please adjust your event listeners to use e.g. $recipientsSourceConfiguration->table instead of $recipientsSourceConfiguration['table']. There is also a custom property available to transfer custom yaml config into event listeners.

    mail:
      recipientSources:
        myCustomDataSource:
          custom:
            foo: bar
    Copied!

    This will be available as $recipientsSourceConfiguration->custom['foo'] in an event listener.

  • Plain Lists and CSV recipient groups are now different recipient group types. A migration wizard to convert from the old to new format comes with this version. Attention: Before using the migration wizard please do a database compare, but do not rename or remove the field "csv" in the first step! After the new fields "csv_type", "csv_data", "csv_separator" and "csv_file" have been generated, goto admin tools > upgrade and click on upgrade wizard. Here start the wizard with the title: "EXT:mail: Migrate mail group type plain to plain or new group csv, depending on csv type.". After this, you can safely delete the field "csv" from the tx_mail_domain_model_group database table.
  • Mail records now have a status field, which can hold (currently) 5 different states:

    • 0 = DRAFT
    • 1 = SCHEDULED
    • 2 = SENDING
    • 3 = PAUSED
    • 4 = ABORTED
    • 5 = SENT

    There is an update wizard to convert existing mail records. Please do not delete the mail database field "sent" or rename it to "zzz_deleted_sent" before running it once!

    As a side effect, the backend module of the queue now only shows scheduled mails that have not yet been sent.

  • For a better bounce mail handling MAIL now uses ddeboer/imap instead of tedivm/fetch. Since ddeboer/imap only can handle IMAP accounts, the possibility to use a POP3 account for collecting bounce mails is dropped. As the mail server type parameter in the bounce mail command is therefore obsolete, it is also deleted. The parameter "count", to set the number of bounce mail to be processed per run, was dropped as well, since it should not be a critical thing, to handle all found bounce mail in one run. Due to this changes, all scheduler task using this command may be corrupt after updating to MAIL 3.0. In dought just recreate them.

3.1.0 - 31th Oct. 2024

New features

  • Add ManipulateMailRecipientsEvent to manipulate the array of recipients of a mail after pressing the finish button in the mail wizard.

    This event can be helpful to remove duplicate email recipients comming from multiple selected recipient lists.

    Please note that recipients with the same email may have subscribed to different email categories. If this is the case and a mailing also uses the category function, caution is advised!

3.2.0 - 6th Nov. 2024

New features

  • Enhance the ManipulateFrontendUserRecipients to also normalize the phone field (from telephone) if the source is table

Bug Fixes

  • CSV sendings now do not stop after the first sending period anymore
  • Recipient data containing null or 0 are now also have this value in there corresponding markers
  • The getRecipientsDataByUidListAndModelName, responsible for getting the data of recipients from a model source, now make use of the getEnhancedData method

3.3.0 - 24th Feb. 2025

Bug Fixes & Changes

  • Creating and sending mails in other languages then default (0) had some issues which needs to change several files:

    • Templates/Backend/Mail/Index.html (preview modals link changed)
    • ViewHelpers/PreviewLinksViewHelper.php (change way how to get links to translated pages and add page title to return array)
    • Configuration/TCA/tx_mail_domain_model_mail.php (remove 'languageField' => 'sys_language_uid', from the ctrl section, since this field is only used to fetch the right language from a given internal page, not from the mail record it self)
  • Make all included viewhelpers future proof by changing them from renderStatic to render

3.4.0 - 5th June. 2025

Bug Fixes & Changes

  • Improved migration logic by adding checks for record validity and content structure within DirectMailMigration.
  • Enhanced documentation with notes on excluding links from tracking.
  • Performed bug fixes in UpperCaseMarkers handling.
  • Updated dependencies in composer.lock of phar package for TER releases to newer versions for PHP-CSS-Parser and Symfony Polyfills.
  • Fix permalinks in documentation guides.xml.
  • Refactor ViewHelpers and improve multilingual support.
  • Update URL counter logic in ReportService.php

3.5.0 - 5th June. 2025

Bug Fixes & Changes

  • Add missing link to change log of manual. List of changes can be found under 3.4.0 - 5th June. 2025

3.6.0 - 4th July. 2025

Sending Priority Feature

  • Add sending priority to the last step of the mail wizard. Mails set to "high" will be send before other mails. At the end of an already running sending cycle, triggered by the scheduler task, a currently running delivery will be paused, until the mail with the higher priority was sent out.
  • New page and user TsConfig parameters (defaultSendingPriority, showSendingPriority) are available to set the default priority and show/hide the priority selector. The sending priority selector is set to hidden by default!
  • hideExcludeRecipientGroups is now also available as pageTsConfig parameter (mod.web_modules.mail.hideExcludeRecipientGroups)

Sitemap

Index