Install Mautic Self-Hosted Email Marketing Platform on Ubuntu 18.04 Server

This tutorial will be showing you how to set up Mautic email marketing platform on Ubuntu 18.04 with Apache or Nginx web server. Mautic is a free open source alternative to commercial email service providers like MailChimp. Key features of Mautic includes:

  • Lead nurturing and tracking
  • Marketing campaigns
  • Dripflow programs
  • Create Landing pages
  • Social media monitoring
  • Install free plugins to extend the functionality of Mautic.
  • Mautic can be easily integrated with third-party SMTP relay services like Gmail, Mandrill, Sendgrid, Amazon SES. You can also use your own mail server.
  • and much more

Benefits of Self Hosting Email Marketing Platform

Why do you want to self-host email marketing platform instead of using third-party ESPs (Email Service Provider) like MailChimp?

For starters, self-hosting can save you a lot of money. Mautic is free and open-source software. You only need to pay $10/month for the VPS (virtual private server), which can run a full-featured mail server and the mautic email marketing platform. It can easily handle millions of subscribers. So your total cost is always $10/month no matter how many subscribers you have. If you own millions of subscribers on MailChimp, the cost would be thousands of dollars per month.

Another reason is that Firefox browser blocks third-party trackers by default, so the MailChimp signup widget on your website doesn’t work properly and the MailChimp pop-up won’t shown to your visitors. By hosting the email marketing platform under your own domain name, Firefox doesn’t block the tracker, so your signup widget or popup can work properly. This is also true if users of other web browsers decide to block third-party trackers.

Last but not least, self-hosting can protect your freedom of speech. You never need to worry about an email service provider shutting down your account like Mailchimp did.

Challenges of Self Hosting Email Marketing Platform

The first problem you face is find a good self-hostable email marketing platform. Previously we have discussed how to set up Mailtrain, which is an open-source alternative to MailChimp, on Ubuntu 18.04 server. However, Mailtrain is missing several features a typical site owner would like to have. For example, Mailtrain doesn’t provide users an easy way to insert signup widget or popup on website and users can’t set the time schedule for RSS campaigns. After all, Mailtrain is just a project of a handful of software developers.

Mautic, on the other hand, is a project of a team of developers and has developed more and more features over the years. You do have an easy way to insert signup widget and popup on your website with Mautic. There’s also a vibrant and very active community around it. Furthermore, Mautic is more than just a newsletter/email marketing platform. It’s a full-blown digital experience platform, as they call it. With Acquia (which is a company offering paid service for the Drupal open source content management system) acquiring Mautic in May 2019, the future for Mautic has never been brighter. So I feel it’s time to switch from Mailtrain to Mautic.

The second challenge is have the technical expertise to set up the email marketing platform on your own server. Don’t worry, I will show you how in just a few moments.

The third challenge is that you need to have good reputation for the IP address of your mail server and your domain name as well. Otherwise, your emails will land in the spam folder. Gmail Postmaster Tools can show you if you have good reputation for your domain name and IP address. As you can see from the screenshot below, I always have high domain reputation with Gmail, because I always follow best practices to send emails to my subscribers. None of my subscribers reported my email as spam.

gmail postmaster tools domain reputation

To send out bulk emails, you need to follow these rules or practices.

  1.  Make sure the recipient gave you permission to send email. Use double opt-in to verify subscriber’s email address.
  2.  Don’t send cold emails to thousands of people who have never received emails from you before. Instead, you need to warm up your IP address. For example, send 500 emails on day 1, then send 1000 emails on day 2, send 2000 emails on day 3.
  3.  Include your contact information and your mailing address at the bottom of the email message.
  4.  Personalize the email message as much as possible. For example, include the recipient’s name in the email.
  5.  Conform to CAN-SPAM Act
  6.  Avoid large attachments.
  7.  Clean your email list. For example, delete email subscribers that haven’t opened your email in the last 30 days.
  8.  Get approved as Return Path Certified Sender.

I also recommend you to check out Gmail, Yahoo, Hotmail’s bulk email best practices. Now let’s look at how to install Mautic on Ubuntu 18.04 server.

Prerequisites of installing Mautic on Ubuntu 18.04 Server

If you don’t have your own mail server yet, I recommend using the free iRedMail program to quickly set up your own mail server before installing Mautic, so you don’t have to spend money on commercial SMTP relay service.

Mautic is written in PHP and relies on MySQL/MariaDB database server. So you need to set up a LAMP stack or LEMP stack. If you prefer Apache web server, then set up LAMP stack. If you prefer Nginx web server, then set up LEMP stack.

Note that iRedMail will automatically set up a LEMP stack for you, so if you are going to install Mautic on your iRedMail server, you don’t need to set up LEMP stack again.

You also need to have a domain name. I registered my domain name from NameCheap because the price is low and they give whois privacy protection for free. Without further ado, let’s install Mautic on Ubuntu 18.04 server.

Step 1: Download Mautic onto Your Ubuntu 18.04 Server

If you go to the official website to download Mautic, you are required to enter your name and email address. If that’s not what you like, then download the latest stable version (2.15.1) by executing the following command on your server.

wget https://www.mautic.org/download/latest

The file will be saved as latest. Use unzip command to unzip it to /var/www/mautic/ directory.

sudo apt install unzip

sudo unzip latest -d /var/www/mautic/

Then make the web server user (www-data) as the owner of this directory.

sudo chown -R www-data:www-data /var/www/mautic/

Step 2: Create a MariaDB Database and User for Mautic

Now we need to log in to MariaDB console and create a database and user for Mautic. By default, the MaraiDB package on Ubuntu uses unix_socket to authenticate user login, which basically means you can use username and password of the OS to log into MariaDB console. So you can run the following command to login without providing MariaDB root password.

sudo mysql -u root

Next,create a new database for Mautic using the following command. This tutorial names it mautic, you can use whatever name you like for the database.

CREATE DATABASE mautic DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

The following command will create a database user and password, and at the same time grant all permission of the new database to the new user so later on Mautic can write to the database. Replace red texts with your preferred database name, username and password.

GRANT ALL ON mautic.* TO 'mauticuser'@'localhost' IDENTIFIED BY 'password';

Flush privileges table and exit MariaDB console.

FLUSH PRIVILEGES;

EXIT;

Step 3: Install Required and Recommended PHP Modules.

Run the following command to install PHP modules required or recommended by Mautic

sudo apt install php-imagick php7.2-common php7.2-gd php7.2-imap php7.2-json php7.2-curl php7.2-zip php7.2-xml php7.2-mbstring php7.2-bz2 php7.2-intl php7.2-gmp

Then restart Apache. (If you use Nginx, you don’t need to restart Nginx.)

sudo systemctl restart apache2

Step 4: Create Apache Virtual Host or Nginx Config File for Mautic

Apache

If you use Apache web server, create a virtual host for Mautic.

sudo nano /etc/apache2/sites-available/mautic.conf

Put the following text into the file. Replace mautic.example.com with your real domain name and don’t forget to set DNS A record for it.

<VirtualHost *:80>
  ServerName mautic.example.com
  DocumentRoot /var/www/mautic/

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Directory />
    Options FollowSymLinks
    AllowOverride All
  </Directory>

  <Directory /var/www/mautic/>
    Options FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

</VirtualHost>

Save and close the file. Then enable this virtual host with:

sudo a2ensite mautic.conf

Reload Apache for the changes to take effect.

sudo systemctl reload apache2

Now you should be able to see the Mautic web-based install wizard at http://mautic.example.com/installer.

Nginx

If you use Nginx web server, create a virtual host for Mautic.

sudo nano /etc/nginx/conf.d/mautic.conf

Put the following text into the file. Replace mautic.example.com with your real domain name and don’t forget to set DNS A record for it.

server {
   listen 80;
   listen [::]:80;
   server_name mautic.example.com;

   root /var/www/mautic;
   error_log /var/log/nginx/mautic.error;
   access_log /var/log/nginx/mautic.access;
   client_max_body_size 20M;

   index index.php index.html index.htm index.nginx-debian.html;

   location / {
     # try to serve file directly, fallback to app.php
     try_files $uri /index.php$is_args$args;
   }

   # redirect some entire folders
     rewrite ^/(vendor|translations|build)/.* /index.php break;

   location ~ \.php$ {
     include snippets/fastcgi-php.conf;
     fastcgi_pass unix:/run/php/php7.2-fpm.sock;
   }

   location ~* ^/index.php {
     # try_files $uri =404;
     fastcgi_split_path_info ^(.+\.php)(/.+)$;
     # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

     fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     include fastcgi_params;

     fastcgi_buffer_size 128k;
     fastcgi_buffers 256 16k;
     fastcgi_busy_buffers_size 256k;
     fastcgi_temp_file_write_size 256k;
   }

    # Deny everything else in /app folder except Assets folder in bundles
    location ~ /app/bundles/.*/Assets/ {
        allow all;
        access_log off;
    }
    location ~ /app/ { deny all; }

    # Deny everything else in /addons or /plugins folder except Assets folder in bundles
    location ~ /(addons|plugins)/.*/Assets/ {
        allow all;
        access_log off;
    }
    # location ~ /(addons|plugins)/ { deny all; }

    # Deny all php files in themes folder
      location ~* ^/themes/(.*)\.php {
        deny all;
    }

    # Don't log favicon
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # Don't log robots
    location = /robots.txt  {
        access_log off;
        log_not_found off;
    }

    # Deny yml, twig, markdown, init file access
    location ~* /(.*)\.(?:markdown|md|twig|yaml|yml|ht|htaccess|ini)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Deny all attempts to access hidden files/folders such as .htaccess, .htpasswd, .DS_Store (Mac), etc...
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Deny all grunt, composer files
    location ~* (Gruntfile|package|composer)\.(js|json)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Deny access to any files with a .php extension in the uploads directory
        location ~* /(?:uploads|files)/.*\.php$ {
                deny all;
    }

     # A long browser cache lifetime can speed up repeat visits to your page
  location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
       access_log        off;
       log_not_found     off;
       expires           360d;
  }
}

Save and close the file. Then test Nginx configuration.

sudo nginx -t

If the test is successful, reload Nginx for the changes to take effect.

sudo systemctl reload nginx

Now you should be able to see the Mautic web-based install wizard at http://mautic.example.com/installer.

Step 5: Enabling HTTPS

To encrypt the HTTP traffic, we can enable HTTPS by installing a free TLS certificate issued from Let’s Encrypt. Run the following command to install Let’s Encrypt client (certbot) on Ubuntu 18.04 server.

sudo apt install certbot

If you use Nginx, then you also need to install the Certbot Nginx plugin.

sudo apt install python3-certbot-nginx

Next, run the following command to obtain and install TLS certificate.

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d mautic.example.com

If you use Apache, install the Certbot Apache plugin.

sudo apt install python3-certbot-apache

And run this command to obtain and install TLS certificate.

sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d mautic.example.com

Where

  • --nginx: Use the nginx plugin.
  • --apache: Use the Apache plugin.
  • --agree-tos: Agree to terms of service.
  • --redirect: Force HTTPS by 301 redirect.
  • --hsts: Add the Strict-Transport-Security header to every HTTP response. Forcing browser to always use TLS for the domain. Defends against SSL/TLS Stripping.
  • --staple-ocsp: Enables OCSP Stapling. A valid OCSP response is stapled to the certificate that the server offers during TLS.

The certificate should now be obtained and automatically installed.

mautic https certbot

Step 6: Finish Mautic Installation in Web Browser

Now in your browser address bar, type in your domain name for Mautic to access the web install wizard.

https://mautic.your-domain.com/installer

or

https://mautic.your-domain.com/index.php/installer

click Next Step.

install mautic ubuntu 18.04

In step 1, enter the MariaDB/MySQL database details.

mautic mariadb database

In step 2, create an admin account.

install mautic on ubuntu 18.04 server

In step 3, configure email settings. Note that you have many options in mailer transport. You can use PHP Mail, sendmail, or Gmail or integrate Mautic with third-party email services like Mandrill, Sendgrid, Amazon SES. These settings can always be changed after installation in Mautic configurations page. If Mautic is installed on your mail server, then you need to choose Sendmail as the mailer transport, so Mautic will use your mail server to send email.

mautic email server configuration sendmail

If Mautic and your mail server are running on different machines and you want Mautic to send emails via your mail server, then you need to choose Other SMTP server as the mailer transport. Enter the hostname of your mail server, choose port 587 and enter the login credential of an email address on your mail server.

mautic other smtp service

After step 3 is done, you can log into Mautic dashboard.

mautic php7.2

If you see the 500 internal server error, please check Mautic logs, which can be found in /var/www/mautic/app/logs/ directory.

Enable HTTP2 to Improve Performance

You can enable HTTP2 protocol to improve page loading performance for Mautic.

Apache

First, you need to enable the HTTP2 module.

sudo a2enmod http2

Then open the SSL virtual host file.

sudo nano /etc/apache2/sites-enabled/mautic-le-ssl.conf

Put the following directive after the opening <VirtualHost *:443> tag.

Protocols h2 http/1.1

Save and close the file. Then restart Apache for the changes to take effect.

sudo systemctl restart apache2

Nginx

To enable HTTP2 protocol in Nginx virtual host, find the following line.

listen 443 ssl; # managed by Certbot

Simply add http2 after ssl.

listen 443 ssl http2; # managed by Certbot

Save and close the file. Then reload Nginx.

sudo systemctl reload nginx

How to Install the RSS To Email Plugin

For many site owners, the ability to automatically fetch content from RSS feed and send it to subscribers is a must. Mautic doesn’t support this feature natively, but you can install a plugin to implement this feature. Go to the Mautic plugins directory.

cd /var/www/mautic/plugins/

Clone the Mautic RSS to Email plugin from Github.

sudo apt install git
sudo -u www-data git clone https://github.com/ChrisRAoW/mautic-rss-to-email-bundle.git

Rename the folder to MauticRssToEmailBundle.

sudo mv mautic-rss-to-email-bundle MauticRssToEmailBundle

Clear the Mautic cache.

sudo rm /var/www/mautic/app/cache/* -rf

In the Mautic dashboard, click the gear icon on the upper-right corner and select plugins. Click the Install/Upgrade plugins button and the Mautic RSS to Email plugin will show up in the plugin list.

mautic rss to email

Next Step

I hope this tutorial helped you install Mautic on Ubuntu 18.04. I recommend checking out the Mautic getting started guide to add Cron jobs, download the IP lookup database and install the tracking JavaScript. You may also want to check out the contact import page. Please note that when importing a large list (more than one thousand contact) to Mautic, you should choose import in the background instead of import in the browser. That’s because the default PHP maximal execution time is 30 seconds, but importing a large list can take several minutes, so it will be stopped by the PHP limit if you choose to import in the browser.

As always, if you found this post useful, then subscribe to our free newsletter to get more tips and tricks. Take care 🙂

Rate this tutorial
[Total: 2 Average: 5]

4 Responses to “Install Mautic Self-Hosted Email Marketing Platform on Ubuntu 18.04 Server

  • Hi Xiao,

    My Mautic doesnt work with “queued delivery”, only send imediatly and it isnt linked with Cron Job.
    Some guys commented that they only solution is change PHP 7.3 to 7.0.

    As I’ll try your great tutorial, I would like to know if your instlation works well with queued delivery.

    Thanks man,

    • Yes, queued delivery works on my Mautic installation. If I remember correctly, Mautic doesn’t work well with PHP7.3. I’m using PHP7.2.

  • Robson
    1 week ago

    Hi Xiao, me again,

    I followed your tutorial, but queued delivery doesnt work, neither tracking visits.

    -All Cron Jobs configured
    -Tracking script installed in body site
    – VPS with 1cpu, 2Gb RAM, 30Gb disk, 2Tb band
    -Ubuntu 18.04 LTS
    -LEMP Stack and PHP 7.2.19 (following your tutorial)

    Would you mind revise my installation? I give you all access and pay doble beer 🙂

Leave a Comment

  • Comments with links are moderated by admin before published.
  • Your email address will not be published.
  • Use <pre> ... </pre> HTML tag to quote the output from your terminal/console.
  • Please use the community (https://community.linuxbabe.com) for questions unrelated to this article.
  • If my answer helped you, please consider supporting this site. Thanks :)