How a newsletter system can save you time
Tags: makingworkeasy, newsletter, experiencereport, automated
Published: 2024-06-22 18:26:55

![](https://blog.disane.dev/content/images/2024/06/wie-ein-newsletter-system-die-zeit-sparen-kann_banner.jpeg)How a newsletter system can make the annoying task of writing to a large number of recipients a dream 🥂

---

I recently had a minor to major structural problem in our house, which is why I was looking for an expert. The IHK then gave me a list of around 15-20 experts, all of whom I wanted to write to individually. However, it was too time-consuming for me to always write the same email (except for the salutation) manually in my email program. Then I came up with the idea of using a newsletter program, which can be used very well for this and could probably also provide good services in the future.

## Why a newsletter system? 🤔

A newsletter system has the charming advantage that you can set up a campaign and save an email as a template. In addition, certain text passages can then be entered with placeholders from the user data and automatically replaced when the newsletter is sent. Mega!

## Which System? 👨‍💻

I started researching which system would be suitable for this. My key points were:

* Capable of running in a Docker container (free of charge)
* Import of CSV/JSON
* Beautiful and easy to use interface

During my research, I quickly came across Listmonk.

[listmonk - Free and open source self-hosted newsletter, mailing list manager, and transactional mails![Preview image](https://listmonk.app/static/images/thumbnail.png)Send e-mail campaigns and transactional e-mails. High performance and features packed into one app.](https://listmonk.app/)

## What can Listmonk do? 🤯

Listmonk is an open source software for managing and sending newsletters. Developed by Zerodhatech, it offers a wide range of functions that are suitable for both small companies and large corporations. The software was programmed in Go and uses a PostgreSQL database, which makes it extremely fast and efficient. Listmonk is freely available and can be used and customized by anyone. This means that you don't have to pay any license fees and have the freedom to modify the software according to your needs. By using Go and PostgreSQL, Listmonk can process millions of emails per hour. Whether you have a small list of subscribers or a huge database to manage, Listmonk can handle it with ease. Listmonk offers numerous customization options, from the design of the emails to the management of subscriber lists. You can use different templates, perform A/B tests and get detailed analysis of your campaigns.

## The installation 🛠️

If you already have a Docker host, you can simply take over the following compose file, everything essential is already integrated here. You only need to change the passwords etc. and adjust the file locations for your system.

```yaml
# NOTE: This docker-compose.yml is meant to be just an example guideline
# on how you can achieve the same. It is not intended to run out of the box
# and you must edit the below configurations to suit your needs.

version: "3.7"

x-app-defaults: &app-defaults
  restart: unless-stopped
  image: listmonk/listmonk:latest
  ports:
    - "9000:9000"
  
  environment:
    - LISTMONK_db__ssl_mode=disable
    - LISTMONK_db__host=db
    - LISTMONK_db__port=5432
    - LISTMONK_db__user=listmonk
    - LISTMONK_db__password=listmonk
    - LISTMONK_db__database=listmonk
    - LISTMONK_app__admin_username=your user
    - LISTMONK_app__admin_password=Your PW
    - TZ=Europe/Berlin


x-db-defaults: &db-defaults
  image: postgres:13-alpine
  ports:
    - "9432:5432"
    
  environment:
    - POSTGRES_PASSWORD=listmonk
    - POSTGRES_USER=listmonk
    - POSTGRES_DB=listmonk
    - TZ=Europe/Berlin
  restart: unless-stopped
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U listmonk"]
    interval: 10s
    timeout: 5s
    retries: 6

services:
  db:
    <<: *db-defaults
    container_name: listmonk_db
    volumes:
      - /mnt/user/appdata/listmonk/db:/var/lib/postgresql/data

  app:
    <<: *app-defaults
    container_name: listmonk_app
    #command: [sh, -c, "yes | ./listmonk --install --config config.toml && ./listmonk --config config.toml"]
    depends_on:
      - db
    volumes:
      - /mnt/user/appdata/listmonk/config.toml:/listmonk/config.toml
      - /mnt/user/appdata/listmonk/uploads:/listmonk/uploads
```

That's it for the installation. After that, Listmonk should be ready for you and it should be accessible via your IP over the port `9432`:

![](https://blog.disane.dev/content/images/2024/06/image.png)

## Configuration of mail dispatch 📫

In the settings, you must then define which mailbox is used to send the emails. This is actually possible with every provider that offers SMTP. You can simply create as many SMTP accounts in the settings and then use them to send your campaigns.

## Import of contact data 👥

I wanted to be able to import contact data (I already had a list from the Chamber of Industry and Commerce) via CSV or JSON. As the list was available as a PDF, I asked ChatGPT to create a list for me in the expected format. This worked surprisingly well, so I quickly had all my contacts in Listmonk.

## Create mailing list 📃

I then added all the contacts to a list that I wanted to write to. Here you can also add more (existing contacts) and/or filter. I currently need all of them. However, you could also use this to create a mailing to only certain people in your area (if this data is available in Listmonk).

## Create mail template ✉️

I have created a template for my private emails that has no CI (corporate identity):

![](https://blog.disane.dev/content/images/2024/06/image-1.png)

However, you could use this to create a general template that corresponds to your company's CI or your taste and then create a uniform look. The content of the campaigns is then written into the template.

So that I can see who has opened the email, I have also built in a tracking view, basically like a read confirmation.

## Create campaign 🎺

Everything then flows into the campaigns. A campaign always has a list of n contacts, a template and corresponding content. My mail content then looked like this:

![](https://blog.disane.dev/content/images/2024/06/image-2.png)

As you can see, the salutation is variable here, which means that this placeholder is replaced for each mail and for each contact. Listmonk also offers a number of other variables:

[Templating - listmonk / Documentation![Preview image](https://user-images.githubusercontent.com/55474996/153739792-93074af6-d1dd-40aa-8cde-c02ea4bbb67b.png)](https://listmonk.app/docs/templating/#template-expressions)

I was then able to send this campaign to everyone on the list and even include attachments and CC/BCC recipients.

The relations between the individual objects look like this:

![](https://blog.disane.dev/content/images/2024/06/mermaid-diagram-2024-06-18-083142.png)

## Conclusion☝️

As you can see, a newsletter system, if used skillfully, can also help you with such things. The installation took me about 20 minutes and I only had to write the mail once. Together with ChatGPT, I was able to quickly convert the existing PDF list to CSV and thus process a large number of emails completely automatically. You don't have to do any more work than you already have.

The nice thing about Listmonk is that it offers an API. So you could also use it to automate things. Together with n8n, you could also import your subscribers from the blog into it and then use it to send emails. Actually pretty cool, isn't it?

---

If you like my posts, it would be nice if you follow my [Blog](https://blog.disane.dev) for more tech stuff.