A mailcow registration page for providers, schools and communities

Set up a self-registration page on your own mailcow for a school, club or small provider: reserved names, quotas, invitation codes, approval and anti-abuse, with nothing created before e-mail confirmation.

If you run mailcow for a school, a club, a community or a handful of small customers, you already know the bottleneck: mailcow-dockerized has no registration page, so every mailbox and every domain goes through an administrator. That is fine for five accounts; it is painful for fifty. Sign-up for mailcow adds a public page, /mlw-signup/, to your own mailcow, so visitors can create their account themselves, within the limits you set, and only after they confirm their e-mail address. This tutorial walks through the setup for the provider/school/community case: what visitors get, how names and quotas are handled, how confirmation, approval and invitation codes fit together, and how to keep abuse out.

What you get, and what stays in your hands

The plugin ships in the mailcow Toolkit package (0.4.0 or newer) and has its own license. It adds a public registration page on the mailcow UI and on the webmail host name; while registrations are open, mailcow's sign-in page shows a Create an account link. You decide what a visitor can get: a mailbox on one of the domains you open for registration, a domain administrator account for the visitor's own domains, or both. Accounts are created with mailcow's own functions, using your templates and limits, exactly as if an administrator had added them.

The key promise for anyone running a shared server: nothing is created in mailcow before the address is confirmed (and approved, or paid with Cashier for mailcow). Unconfirmed registrations simply expire.

Prerequisites

  • The mailcow Toolkit package 0.4.0 or newer installed on mailcow-dockerized (Linux, docker compose, systemd), with root access on the host to run install.sh. Sign-up is part of the package; there is nothing else to download.
  • Outgoing HTTPS to medialab.works from the server (license check), and a mailcow that sends e-mail (confirmation, approval and welcome messages).
  • At least one mailcow domain to open for registration, if visitors should get mailboxes.
  • For own domains: the customer must be able to add a TXT record at their DNS provider.
  • For paid plans: Cashier for mailcow, with its own license. For free accounts you do not need it.

Step 1 — Install or update the Toolkit

install.sh from the package (0.4.0 or newer) installs Sign-up next to the Toolkit: the web files in mailcow's data/web/mlw-signup, the settings folder, the tables mlw_su_* in mailcow's database and the timer mlw-mailcow-accounts-<name>.timer, which runs the Sign-up and Cashier jobs every 5 minutes. A Toolkit already installed gets all this when you update it to 0.4.0 from System > Updates (Toolkit) or run the new install.sh. Sign-up stays switched off until it is licensed and you open registrations.

Sign-up is updated together with the Toolkit: one package, one update. The update can be started from the License card of any product with a valid license.

Step 2 — Activate the license

Open System > Updates (Toolkit) (admins only). From 0.4.0 the page shows one License card per product; use the card License · Sign-up for mailcow. Enter your license key and press Activate, or start the free 30-day trial with your e-mail address. With a mailcow bundle key, enter the same key in each product's License card. On the shell you can also run, from the mailcow folder:

docker compose exec -u www-data php-fpm-mailcow php /web/mlw-toolkit/cli.php activate mailcow-signup <KEY>

The license is checked when the server starts and once a day; without internet Sign-up keeps working for 7 days after the last successful check. Without a valid license registrations close and the background jobs stop for Sign-up — existing accounts, mailboxes and domains are never touched.

Step 3 — Choose what visitors get

Open System > Sign-up. The Registration card holds the main choices; save the form with the button at its end.

  • Registrations open turns the public page on and shows the Create an account link on mailcow's sign-in page (UI and webmail host name).
  • A mailbox on one of your domains: tick it and choose the Domains open for registration. Set Min. characters and Max. characters for the name before the @, the Free quota (MB), More reserved names (role names such as postmaster, abuse, admin, support and noreply are always reserved) and the mailcow mailbox template (empty = mailcow's default). For a school or a club this is usually the whole setup: open one domain, reserve the role names, set a sensible quota.
  • A domain administrator for the customer's own domains: the customer adds domains after a DNS (TXT) check, within the package limits. The Free package sets Domains, Mailboxes/domain, Aliases/domain, Quota/domain (MB) and Default quota/mailbox (MB); the mailcow domain template is used for new customer domains. With the option about the new domain wizard, the Toolkit's wizard creates the role addresses of a customer domain to the customer's e-mail.
  • Free registration (next to Cashier's paid plans): leave it ticked for free accounts; untick it when every account must buy a plan.

Step 4 — Confirmation, approval and invitations

In the card Confirmation, approval, invitations:

  • Address confirmation: 6-digit code, link, code and link, or none (not recommended). Expires (hours) runs from 1 to 168. A visitor can ask for a new e-mail after a minute, at most 5 times a day, and has 5 attempts per code.
  • Administrator approval: free registrations wait for an administrator; set E-mail for registrations to approve to be told of each new one. Paid registrations are never held for approval. For a school this is the quiet way to keep the member list clean.
  • Invitation code: off, optional or required.
  • Terms link (asks for acceptance): a link to your terms; the visitor must accept them.
  • Form fields: name, company, phone and country — off, optional or required.

Approving registrations

The card Registrations lists those Waiting for approval. Approve creates the account and sends the welcome e-mail; Reject (with an optional Reason) sends the visitor an e-mail with the decision. Recent shows the latest registrations and their state.

Invitation codes

In Invitation codes fill in Code (empty = random), Uses (0 = unlimited), Expires, the Account kind (mailbox, domain or any) and, with Cashier, the Plan the code opens (including a hidden one), tick No approval if the code should skip the approval, add a Note and press Create the code. The list shows how often each code was used; Disable and Enable switch it off and on. For a community, a single multi-use code with an expiry and no approval is often the right balance: members get in without waiting, strangers do not.

Step 5 — Set up anti-abuse

In the card Anti-abuse:

  • Minimum time to fill in (s): a form sent faster is refused. A hidden field catches the simplest bots on its own.
  • Registrations / IP / day (0 = no limit).
  • Block disposable addresses: the built-in list plus the MediaLab Works list, which arrives with the license check while the license is valid.
  • Only these e-mail domains (empty = any) and Blocked e-mail domains, separated by spaces, commas or new lines. A domain also covers its subdomains; *.example.com means the subdomains only. For a school, restricting to your own domain (and perhaps a partner's) is a strong, simple filter.
  • The password must follow mailcow's own password policy, the one set in mailcow's admin UI.

Step 6 — Welcome e-mail and sign-in

In the card New accounts: Own text in the welcome e-mail (English and Romanian), the Sender name of the e-mails (empty = the mail host name) and Sign in the browser that registered (on by default). A free mailbox is created as soon as the address is confirmed (and approved). A domain administrator is created with the first verified domain: until then the customer has a page, My account, where the next step is to add the domain.

Step 7 — The customer's own domains

The customer opens My account (/mlw-signup/account.php, also in the mailcow menu while signed in) and adds a domain. The page shows a TXT record to publish at the customer's DNS provider:

_mlw-verify.example.com.  TXT  "mlw-verify=<token>"

Verify checks it at once; Sign-up also checks every 10 minutes for 7 days. When the record is found, the domain is added to mailcow with the package limits (domains, mailboxes, aliases, quota), and the page shows the DNS records the domain needs (MX, SPF, DKIM, DMARC and the recommended ones), computed by the Toolkit's DNS module. The Toolkit's new domain wizard can send the role addresses of a customer domain to the customer, and customer domains are kept out of your own Cloudflare automatic setup.

Tips and troubleshooting

  • The Create an account link is missing. Check that Registrations open is saved, and that the license is valid: without one the public page says registration is not available and the link disappears.
  • Visitors do not receive the confirmation e-mail. Sign-up relies on mailcow sending e-mail; test your outgoing mail before opening the page.
  • A registration never completes. Unconfirmed registrations expire; the visitor can request a new e-mail after a minute, up to 5 times a day, with 5 attempts per code. If approval is on, look in Registrations > Waiting for approval.
  • A name is refused. Role names such as postmaster, abuse, admin, support and noreply are always reserved; add your own under More reserved names, and check the minimum and maximum length.
  • A domain stays unverified. The TXT record must be exactly _mlw-verify.<domain> with the value shown; the check runs every 10 minutes for 7 days, after which the customer must add it again.
  • Data and backups. Registrations are kept in mailcow's own database (tables mlw_su_*), so they are part of mailcow's backups. Settings live in the Toolkit's folder on the server.

Conclusion

For a provider, a school or a community, the value of self-registration is not speed alone — it is that every account is bounded by the rules you wrote down once: reserved names, quotas, allowed domains, invitation codes and approval where it matters. Nothing lands in mailcow until the address is confirmed, and if the license ever lapses, new registrations stop while everything that already exists keeps working. The full option reference is in the user guide; the product page is at Sign-up for mailcow, and the changelog tracks updates. If something does not behave as described here, the knowledge base and FAQ are the next stop, and you can always contact us.

This post was written with AI assistance from our product documentation or the sources listed and checked automatically before publication.

Read next

Running Emby, Jellyfin or Nextcloud?

Our plugins and apps add Live TV, subtitles, sign-up and security to your own server, with a free trial.