docker-mailserver/v12.1/faq/index.html

2444 lines
90 KiB
HTML
Raw Normal View History

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="A fullstack but simple mail-server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) using Docker.">
<meta name="author" content="docker-mailserver (Github Organization)">
<link rel="canonical" href="https://docker-mailserver.github.io/docker-mailserver/latest/faq/">
<link rel="prev" href="../examples/use-cases/imap-folders/">
<link rel="next" href="../contributing/general/">
<link rel="icon" href="../assets/logo/favicon-32x32.png">
<meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.1.5">
<title>FAQ - Docker Mailserver</title>
<link rel="stylesheet" href="../assets/stylesheets/main.7a7fce14.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.a0c5b2b5.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../assets/css/customizations.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#what-kind-of-database-are-you-using" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Docker Mailserver" class="md-header__button md-logo" aria-label="Docker Mailserver" data-md-component="logo">
<img src="../assets/logo/dmo-logo-white.min.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Docker Mailserver
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
FAQ
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/docker-mailserver/docker-mailserver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
docker-mailserver
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../introduction/" class="md-tabs__link">
Introduction
</a>
</li>
<li class="md-tabs__item">
<a href="../usage/" class="md-tabs__link">
Usage
</a>
</li>
<li class="md-tabs__item">
<a href="../config/environment/" class="md-tabs__link">
Configuration
</a>
</li>
<li class="md-tabs__item">
<a href="../examples/tutorials/basic-installation/" class="md-tabs__link">
Examples
</a>
</li>
<li class="md-tabs__item">
<a href="./" class="md-tabs__link md-tabs__link--active">
FAQ
</a>
</li>
<li class="md-tabs__item">
<a href="../contributing/general/" class="md-tabs__link">
Contributing
</a>
</li>
<li class="md-tabs__item">
<a href="https://hub.docker.com/r/mailserver/docker-mailserver/" class="md-tabs__link">
DockerHub
</a>
</li>
<li class="md-tabs__item">
<a href="https://github.com/docker-mailserver/docker-mailserver/pkgs/container/docker-mailserver" class="md-tabs__link">
GHCR
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Docker Mailserver" class="md-nav__button md-logo" aria-label="Docker Mailserver" data-md-component="logo">
<img src="../assets/logo/dmo-logo-white.min.svg" alt="logo">
</a>
Docker Mailserver
</label>
<div class="md-nav__source">
<a href="https://github.com/docker-mailserver/docker-mailserver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.3.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
docker-mailserver
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
Home
</a>
</li>
<li class="md-nav__item">
<a href="../introduction/" class="md-nav__link">
Introduction
</a>
</li>
<li class="md-nav__item">
<a href="../usage/" class="md-nav__link">
Usage
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/environment/" class="md-nav__link">
Environment Variables
</a>
</li>
<li class="md-nav__item">
<a href="../config/user-management/" class="md-nav__link">
User Management
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_3" >
<label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
Best Practices
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Best Practices
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/best-practices/dkim_dmarc_spf/" class="md-nav__link">
DKIM, DMARC & SPF
</a>
</li>
<li class="md-nav__item">
<a href="../config/best-practices/autodiscover/" class="md-nav__link">
Auto-discovery
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_4" >
<label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
Security
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
Security
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/security/understanding-the-ports/" class="md-nav__link">
Understanding the Ports
</a>
</li>
<li class="md-nav__item">
<a href="../config/security/ssl/" class="md-nav__link">
SSL/TLS
</a>
</li>
<li class="md-nav__item">
<a href="../config/security/fail2ban/" class="md-nav__link">
Fail2Ban
</a>
</li>
<li class="md-nav__item">
<a href="../config/security/mail_crypt/" class="md-nav__link">
Mail Encryption
</a>
</li>
<li class="md-nav__item">
<a href="../config/security/rspamd/" class="md-nav__link">
Rspamd
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../config/debugging/" class="md-nav__link">
Debugging
</a>
</li>
<li class="md-nav__item">
<a href="../config/pop3/" class="md-nav__link">
Mail Delivery with POP3
</a>
</li>
<li class="md-nav__item">
<a href="../config/setup.sh/" class="md-nav__link">
About setup.sh
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_8" >
<label class="md-nav__link" for="__nav_4_8" id="__nav_4_8_label" tabindex="0">
Advanced Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8">
<span class="md-nav__icon md-icon"></span>
Advanced Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/advanced/optional-config/" class="md-nav__link">
Optional Configuration
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_8_2" >
<label class="md-nav__link" for="__nav_4_8_2" id="__nav_4_8_2_label" tabindex="0">
Maintenance
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_2">
<span class="md-nav__icon md-icon"></span>
Maintenance
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/advanced/maintenance/update-and-cleanup/" class="md-nav__link">
Update and Cleanup
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_8_3" >
<label class="md-nav__link" for="__nav_4_8_3" id="__nav_4_8_3_label" tabindex="0">
Override the Default Configs
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_3">
<span class="md-nav__icon md-icon"></span>
Override the Default Configs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/advanced/override-defaults/dovecot/" class="md-nav__link">
Dovecot
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/override-defaults/postfix/" class="md-nav__link">
Postfix
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/override-defaults/user-patches/" class="md-nav__link">
Modifications via Script
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../config/advanced/auth-ldap/" class="md-nav__link">
LDAP Authentication
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/mail-sieve/" class="md-nav__link">
Email Filtering with Sieve
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/mail-fetchmail/" class="md-nav__link">
Email Gathering with Fetchmail
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4_8_7" >
<label class="md-nav__link" for="__nav_4_8_7" id="__nav_4_8_7_label" tabindex="0">
Email Forwarding
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_7">
<span class="md-nav__icon md-icon"></span>
Email Forwarding
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../config/advanced/mail-forwarding/relay-hosts/" class="md-nav__link">
Relay Hosts
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/mail-forwarding/aws-ses/" class="md-nav__link">
AWS SES
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../config/advanced/full-text-search/" class="md-nav__link">
Full-Text Search
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/kubernetes/" class="md-nav__link">
Kubernetes
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/ipv6/" class="md-nav__link">
IPv6
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/podman/" class="md-nav__link">
Podman
</a>
</li>
<li class="md-nav__item">
<a href="../config/advanced/dovecot-master-accounts/" class="md-nav__link">
Dovecot Master Accounts
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
Examples
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
Tutorials
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Tutorials
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../examples/tutorials/basic-installation/" class="md-nav__link">
Basic Installation
</a>
</li>
<li class="md-nav__item">
<a href="../examples/tutorials/mailserver-behind-proxy/" class="md-nav__link">
Mailserver behind Proxy
</a>
</li>
<li class="md-nav__item">
<a href="../examples/tutorials/docker-build/" class="md-nav__link">
Building your own Docker image
</a>
</li>
<li class="md-nav__item">
<a href="../examples/tutorials/blog-posts/" class="md-nav__link">
Blog Posts
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
Use Cases
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Use Cases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../examples/use-cases/forward-only-mailserver-with-ldap-authentication/" class="md-nav__link">
Forward-Only Mail-Server with LDAP
</a>
</li>
<li class="md-nav__item">
<a href="../examples/use-cases/imap-folders/" class="md-nav__link">
Customize IMAP Folders
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
FAQ
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
FAQ
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#what-kind-of-database-are-you-using" class="md-nav__link">
What kind of database are you using?
</a>
</li>
<li class="md-nav__item">
<a href="#where-are-emails-stored" class="md-nav__link">
Where are emails stored?
</a>
</li>
<li class="md-nav__item">
<a href="#how-are-imap-mailboxes-aka-imap-folders-set-up" class="md-nav__link">
How are IMAP mailboxes (aka IMAP Folders) set up?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-update-dms" class="md-nav__link">
How do I update DMS?
</a>
</li>
<li class="md-nav__item">
<a href="#which-operating-systems-are-supported" class="md-nav__link">
Which operating systems are supported?
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-the-system-requirements" class="md-nav__link">
What are the system requirements?
</a>
<nav class="md-nav" aria-label="What are the system requirements?">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#recommended" class="md-nav__link">
Recommended
</a>
</li>
<li class="md-nav__item">
<a href="#minimum" class="md-nav__link">
Minimum
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-to-alter-a-running-dms-instance-without-relaunching-the-container" class="md-nav__link">
How to alter a running DMS instance without relaunching the container?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-sync-the-container-and-host-datetime" class="md-nav__link">
How can I sync the container and host date/time?
</a>
</li>
<li class="md-nav__item">
<a href="#what-is-the-file-format" class="md-nav__link">
What is the file format?
</a>
</li>
<li class="md-nav__item">
<a href="#do-you-support-multiple-domains" class="md-nav__link">
Do you support multiple domains?
</a>
</li>
<li class="md-nav__item">
<a href="#what-about-backups" class="md-nav__link">
What about backups?
</a>
<nav class="md-nav" aria-label="What about backups?">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#bind-mounts-default" class="md-nav__link">
Bind mounts (default)
</a>
</li>
<li class="md-nav__item">
<a href="#volumes" class="md-nav__link">
Volumes
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#i-want-to-know-more-about-the-ports" class="md-nav__link">
I Want to Know More About the Ports
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-configure-my-email-client" class="md-nav__link">
How can I configure my email client?
</a>
</li>
<li class="md-nav__item">
<a href="#can-i-use-a-nakedbare-domain-ie-no-hostname" class="md-nav__link">
Can I use a naked/bare domain (i.e. no hostname)?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-configure-a-catch-all" class="md-nav__link">
How can I configure a catch-all?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-delete-all-the-emails-for-a-specific-user" class="md-nav__link">
How can I delete all the emails for a specific user?
</a>
</li>
<li class="md-nav__item">
<a href="#what-kind-of-ssl-certificates-can-i-use" class="md-nav__link">
What kind of SSL certificates can I use?
</a>
</li>
<li class="md-nav__item">
<a href="#i-just-moved-from-my-old-mail-server-to-dms-but-it-doesnt-work" class="md-nav__link">
I just moved from my old mail server to DMS, but "it doesn't work"?
</a>
</li>
<li class="md-nav__item">
<a href="#connection-refused-or-no-response-at-all" class="md-nav__link">
Connection refused or No response at all
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-authenticate-users-with-smtp_only1" class="md-nav__link">
How can I authenticate users with SMTP_ONLY=1?
</a>
</li>
<li class="md-nav__item">
<a href="#common-errors" class="md-nav__link">
Common Errors
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-use-dms-behind-a-proxy" class="md-nav__link">
How to use DMS behind a proxy
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-adjust-settings-with-the-user-patchessh-script" class="md-nav__link">
How to adjust settings with the user-patches.sh script
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-ban-custom-ip-addresses-with-fail2ban" class="md-nav__link">
How to ban custom IP addresses with Fail2ban
</a>
</li>
<li class="md-nav__item">
<a href="#what-to-do-in-case-of-spfforwarding-problems" class="md-nav__link">
What to do in case of SPF/Forwarding problems
</a>
</li>
<li class="md-nav__item">
<a href="#why-are-my-emails-not-being-delivered" class="md-nav__link">
Why are my emails not being delivered?
</a>
</li>
<li class="md-nav__item">
<a href="#special-directories" class="md-nav__link">
Special Directories
</a>
<nav class="md-nav" aria-label="Special Directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-about-the-docker-datadmsconfig-directory" class="md-nav__link">
What About the docker-data/dms/config/ Directory?
</a>
</li>
<li class="md-nav__item">
<a href="#what-about-the-docker-datadmsmail-state-directory" class="md-nav__link">
What About the docker-data/dms/mail-state/ Directory?
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#spamassasin" class="md-nav__link">
SpamAssasin
</a>
<nav class="md-nav" aria-label="SpamAssasin">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-can-i-manage-my-custom-spamassassin-rules" class="md-nav__link">
How can I manage my custom SpamAssassin rules?
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-acceptable-sa_spam_subject-values" class="md-nav__link">
What are acceptable SA_SPAM_SUBJECT values?
</a>
</li>
<li class="md-nav__item">
<a href="#why-are-spamassassin-x-headers-not-inserted-into-my-subdomainexamplecom-subdomain-emails" class="md-nav__link">
Why are SpamAssassin x-headers not inserted into my subdomain.example.com subdomain emails?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-make-spamassassin-better-recognize-spam" class="md-nav__link">
How can I make SpamAssassin better recognize spam?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-have-more-control-about-what-spamassassin-is-filtering" class="md-nav__link">
How do I have more control about what SpamAssassin is filtering?
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
Contributing
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../contributing/general/" class="md-nav__link">
General Information
</a>
</li>
<li class="md-nav__item">
<a href="../contributing/tests/" class="md-nav__link">
Tests
</a>
</li>
<li class="md-nav__item">
<a href="../contributing/issues-and-pull-requests/" class="md-nav__link">
Issues and Pull Requests
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="https://hub.docker.com/r/mailserver/docker-mailserver/" class="md-nav__link">
DockerHub
</a>
</li>
<li class="md-nav__item">
<a href="https://github.com/docker-mailserver/docker-mailserver/pkgs/container/docker-mailserver" class="md-nav__link">
GHCR
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#what-kind-of-database-are-you-using" class="md-nav__link">
What kind of database are you using?
</a>
</li>
<li class="md-nav__item">
<a href="#where-are-emails-stored" class="md-nav__link">
Where are emails stored?
</a>
</li>
<li class="md-nav__item">
<a href="#how-are-imap-mailboxes-aka-imap-folders-set-up" class="md-nav__link">
How are IMAP mailboxes (aka IMAP Folders) set up?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-update-dms" class="md-nav__link">
How do I update DMS?
</a>
</li>
<li class="md-nav__item">
<a href="#which-operating-systems-are-supported" class="md-nav__link">
Which operating systems are supported?
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-the-system-requirements" class="md-nav__link">
What are the system requirements?
</a>
<nav class="md-nav" aria-label="What are the system requirements?">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#recommended" class="md-nav__link">
Recommended
</a>
</li>
<li class="md-nav__item">
<a href="#minimum" class="md-nav__link">
Minimum
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-to-alter-a-running-dms-instance-without-relaunching-the-container" class="md-nav__link">
How to alter a running DMS instance without relaunching the container?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-sync-the-container-and-host-datetime" class="md-nav__link">
How can I sync the container and host date/time?
</a>
</li>
<li class="md-nav__item">
<a href="#what-is-the-file-format" class="md-nav__link">
What is the file format?
</a>
</li>
<li class="md-nav__item">
<a href="#do-you-support-multiple-domains" class="md-nav__link">
Do you support multiple domains?
</a>
</li>
<li class="md-nav__item">
<a href="#what-about-backups" class="md-nav__link">
What about backups?
</a>
<nav class="md-nav" aria-label="What about backups?">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#bind-mounts-default" class="md-nav__link">
Bind mounts (default)
</a>
</li>
<li class="md-nav__item">
<a href="#volumes" class="md-nav__link">
Volumes
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#i-want-to-know-more-about-the-ports" class="md-nav__link">
I Want to Know More About the Ports
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-configure-my-email-client" class="md-nav__link">
How can I configure my email client?
</a>
</li>
<li class="md-nav__item">
<a href="#can-i-use-a-nakedbare-domain-ie-no-hostname" class="md-nav__link">
Can I use a naked/bare domain (i.e. no hostname)?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-configure-a-catch-all" class="md-nav__link">
How can I configure a catch-all?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-delete-all-the-emails-for-a-specific-user" class="md-nav__link">
How can I delete all the emails for a specific user?
</a>
</li>
<li class="md-nav__item">
<a href="#what-kind-of-ssl-certificates-can-i-use" class="md-nav__link">
What kind of SSL certificates can I use?
</a>
</li>
<li class="md-nav__item">
<a href="#i-just-moved-from-my-old-mail-server-to-dms-but-it-doesnt-work" class="md-nav__link">
I just moved from my old mail server to DMS, but "it doesn't work"?
</a>
</li>
<li class="md-nav__item">
<a href="#connection-refused-or-no-response-at-all" class="md-nav__link">
Connection refused or No response at all
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-authenticate-users-with-smtp_only1" class="md-nav__link">
How can I authenticate users with SMTP_ONLY=1?
</a>
</li>
<li class="md-nav__item">
<a href="#common-errors" class="md-nav__link">
Common Errors
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-use-dms-behind-a-proxy" class="md-nav__link">
How to use DMS behind a proxy
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-adjust-settings-with-the-user-patchessh-script" class="md-nav__link">
How to adjust settings with the user-patches.sh script
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-ban-custom-ip-addresses-with-fail2ban" class="md-nav__link">
How to ban custom IP addresses with Fail2ban
</a>
</li>
<li class="md-nav__item">
<a href="#what-to-do-in-case-of-spfforwarding-problems" class="md-nav__link">
What to do in case of SPF/Forwarding problems
</a>
</li>
<li class="md-nav__item">
<a href="#why-are-my-emails-not-being-delivered" class="md-nav__link">
Why are my emails not being delivered?
</a>
</li>
<li class="md-nav__item">
<a href="#special-directories" class="md-nav__link">
Special Directories
</a>
<nav class="md-nav" aria-label="Special Directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-about-the-docker-datadmsconfig-directory" class="md-nav__link">
What About the docker-data/dms/config/ Directory?
</a>
</li>
<li class="md-nav__item">
<a href="#what-about-the-docker-datadmsmail-state-directory" class="md-nav__link">
What About the docker-data/dms/mail-state/ Directory?
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#spamassasin" class="md-nav__link">
SpamAssasin
</a>
<nav class="md-nav" aria-label="SpamAssasin">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#how-can-i-manage-my-custom-spamassassin-rules" class="md-nav__link">
How can I manage my custom SpamAssassin rules?
</a>
</li>
<li class="md-nav__item">
<a href="#what-are-acceptable-sa_spam_subject-values" class="md-nav__link">
What are acceptable SA_SPAM_SUBJECT values?
</a>
</li>
<li class="md-nav__item">
<a href="#why-are-spamassassin-x-headers-not-inserted-into-my-subdomainexamplecom-subdomain-emails" class="md-nav__link">
Why are SpamAssassin x-headers not inserted into my subdomain.example.com subdomain emails?
</a>
</li>
<li class="md-nav__item">
<a href="#how-can-i-make-spamassassin-better-recognize-spam" class="md-nav__link">
How can I make SpamAssassin better recognize spam?
</a>
</li>
<li class="md-nav__item">
<a href="#how-do-i-have-more-control-about-what-spamassassin-is-filtering" class="md-nav__link">
How do I have more control about what SpamAssassin is filtering?
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>FAQ</h1>
<h3 id="what-kind-of-database-are-you-using"><a class="toclink" href="#what-kind-of-database-are-you-using">What kind of database are you using?</a></h3>
<p>None! No database is required. The filesystem is the database. This image is based on config files that can be persisted using bind mounts (default) or Docker volumes, and as such versioned, backed up and so forth.</p>
<h3 id="where-are-emails-stored"><a class="toclink" href="#where-are-emails-stored">Where are emails stored?</a></h3>
<p>Mails are stored in <code>/var/mail/${domain}/${username}</code>. Since <code>v9.0.0</code> it is possible to add custom <code>user_attributes</code> for each accounts to have a different mailbox configuration (See <a href="https://github.com/docker-mailserver/docker-mailserver/pull/1792">#1792</a>).</p>
<h3 id="how-are-imap-mailboxes-aka-imap-folders-set-up"><a class="toclink" href="#how-are-imap-mailboxes-aka-imap-folders-set-up">How are IMAP mailboxes (<em>aka IMAP Folders</em>) set up?</a></h3>
<p><code>INBOX</code> is setup by default with the special IMAP folders <code>Drafts</code>, <code>Sent</code>, <code>Junk</code> and <code>Trash</code>. You can learn how to modify or add your own folders (<em>including additional special folders like <code>Archive</code></em>) by visiting our docs page <a href="../examples/use-cases/imap-folders"><em>Customizing IMAP Folders</em></a> for more information.</p>
<h3 id="how-do-i-update-dms"><a class="toclink" href="#how-do-i-update-dms">How do I update DMS?</a></h3>
<p><strong>Make sure to read the <a href="https://github.com/docker-mailserver/docker-mailserver/blob/master/CHANGELOG.md">CHANGELOG</a></strong> before updating to new versions, to be prepared for possible breaking changes.</p>
<p>Then, run the following commands:</p>
<div class="highlight"><pre><span></span><code>docker-compose<span class="w"> </span>pull
docker-compose<span class="w"> </span>down
docker-compose<span class="w"> </span>up<span class="w"> </span>-d
</code></pre></div>
<p>You should see the new version number on startup, for example: <code>[ INF ] Welcome to docker-mailserver 11.3.1</code>. And you're done! Don't forget to have a look at the remaining functions of the <code>setup.sh</code> script with <code>./setup.sh help</code>.</p>
<h3 id="which-operating-systems-are-supported"><a class="toclink" href="#which-operating-systems-are-supported">Which operating systems are supported?</a></h3>
<ul>
<li>Linux is officially supported.</li>
<li>Windows and macOS are <em>not</em> supported and users and have reported various issues running the image on these hosts.</li>
</ul>
<p>As you'll realistically be deploying to production on a Linux host, if you are on Windows or macOS and want to run the image locally first, it's advised to do so via a VM guest running Linux if you have issues running DMS on your host system.</p>
<h3 id="what-are-the-system-requirements"><a class="toclink" href="#what-are-the-system-requirements">What are the system requirements?</a></h3>
<h4 id="recommended"><a class="toclink" href="#recommended">Recommended</a></h4>
<ul>
<li>1 vCore</li>
<li>2GB RAM</li>
<li>Swap enabled for the container</li>
</ul>
<h4 id="minimum"><a class="toclink" href="#minimum">Minimum</a></h4>
<ul>
<li>1 vCore</li>
<li>512MB RAM</li>
<li>You'll need to avoid running some services like ClamAV (<em>disabled by default</em>) to be able to run on a host with 512MB of RAM.</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>ClamAV can consume a lot of memory, as it reads the entire signature database into RAM.</p>
<p>Current figure is about 850M and growing. If you get errors about ClamAV or amavis failing to allocate memory you need more RAM or more swap and of course docker must be allowed to use swap (not always the case). If you can't use swap at all you may need 3G RAM.</p>
</div>
<h3 id="how-to-alter-a-running-dms-instance-without-relaunching-the-container"><a class="toclink" href="#how-to-alter-a-running-dms-instance-without-relaunching-the-container">How to alter a running DMS instance <em>without</em> relaunching the container?</a></h3>
<p>DMS aggregates multiple "sub-services", such as Postfix, Dovecot, Fail2ban, SpamAssassin, etc. In many cases, one may edit a sub-service's config and reload that very sub-service, without stopping and relaunching the whole mail server.</p>
<p>In order to do so, you'll probably want to push your config updates to your server through a Docker volume (these docs use: <code>./docker-data/dms/config/:/tmp/docker-mailserver/</code>), then restart the sub-service to apply your changes, using <code>supervisorctl</code>. For instance, after editing fail2ban's config: <code>supervisorctl restart fail2ban</code>.</p>
<p>See the <a href="http://supervisord.org/running.html#running-supervisorctl">documentation for <code>supervisorctl</code></a>.</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>To add, update or delete an email account; there is no need to restart postfix / dovecot service inside the container after using <code>setup.sh</code> script.</p>
<p>For more information, see <a href="https://github.com/docker-mailserver/docker-mailserver/issues/1639">#1639</a>.</p>
</div>
<h3 id="how-can-i-sync-the-container-and-host-datetime"><a class="toclink" href="#how-can-i-sync-the-container-and-host-datetime">How can I sync the container and host date/time?</a></h3>
<p>Share the host's <a href="https://www.freedesktop.org/software/systemd/man/localtime.html"><code>/etc/localtime</code></a> with the container, e.g. by using a bind mount:</p>
<div class="highlight"><pre><span></span><code><span class="nt">volumes</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/etc/localtime:/etc/localtime:ro</span>
</code></pre></div>
<p>Optionally, you can set the <code>TZ</code> ENV variable; e.g. <code>TZ=Europe/Berlin</code>. Check <a href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">this list</a> for which values are allowed.</p>
<h3 id="what-is-the-file-format"><a class="toclink" href="#what-is-the-file-format">What is the file format?</a></h3>
<p>All files are using the Unix format with <code>LF</code> line endings. Please do not use <code>CRLF</code>.</p>
<h3 id="do-you-support-multiple-domains"><a class="toclink" href="#do-you-support-multiple-domains">Do you support multiple domains?</a></h3>
<p>DMS supports multiple domains out of the box, so you can do this:</p>
<div class="highlight"><pre><span></span><code>./setup.sh<span class="w"> </span>email<span class="w"> </span>add<span class="w"> </span>user1@example.com
./setup.sh<span class="w"> </span>email<span class="w"> </span>add<span class="w"> </span>user1@example.de
./setup.sh<span class="w"> </span>email<span class="w"> </span>add<span class="w"> </span>user1@server.example.org
</code></pre></div>
<h3 id="what-about-backups"><a class="toclink" href="#what-about-backups">What about backups?</a></h3>
<h4 id="bind-mounts-default"><a class="toclink" href="#bind-mounts-default">Bind mounts (default)</a></h4>
<p>From the location of your <code>docker-compose.yml</code>, create a compressed archive of your <code>docker-data/dms/config/</code> and <code>docker-data/dms/mail-*</code> folders:</p>
<div class="highlight"><pre><span></span><code>tar<span class="w"> </span>--gzip<span class="w"> </span>-cf<span class="w"> </span><span class="s2">&quot;backup-</span><span class="k">$(</span>date<span class="w"> </span>+%F<span class="k">)</span><span class="s2">.tar.gz&quot;</span><span class="w"> </span>./docker-data/dms
</code></pre></div>
<p>Then to restore <code>docker-data/dms/config/</code> and <code>docker-data/dms/mail-*</code> folders from your backup file:</p>
<div class="highlight"><pre><span></span><code>tar<span class="w"> </span>--gzip<span class="w"> </span>-xf<span class="w"> </span>backup-date.tar.gz
</code></pre></div>
<h4 id="volumes"><a class="toclink" href="#volumes">Volumes</a></h4>
<p>Assuming that you use <code>docker-compose</code> and data volumes, you can backup the configuration, emails and logs like this:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># create backup</span>
docker<span class="w"> </span>run<span class="w"> </span>--rm<span class="w"> </span>-it<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-v<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span><span class="s2">/docker-data/dms/config/:/tmp/docker-mailserver/&quot;</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-v<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span><span class="s2">/docker-data/dms-backups/:/backup/&quot;</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>--volumes-from<span class="w"> </span>mailserver<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>alpine:latest<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>tar<span class="w"> </span>czf<span class="w"> </span><span class="s2">&quot;/backup/mail-</span><span class="k">$(</span>date<span class="w"> </span>+%F<span class="k">)</span><span class="s2">.tar.gz&quot;</span><span class="w"> </span>/var/mail<span class="w"> </span>/var/mail-state<span class="w"> </span>/var/log/mail<span class="w"> </span>/tmp/docker-mailserver
<span class="c1"># delete backups older than 30 days</span>
find<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span><span class="s2">/docker-data/dms-backups/&quot;</span><span class="w"> </span>-type<span class="w"> </span>f<span class="w"> </span>-mtime<span class="w"> </span>+30<span class="w"> </span>-delete
</code></pre></div>
<h3 id="i-want-to-know-more-about-the-ports"><a class="toclink" href="#i-want-to-know-more-about-the-ports">I Want to Know More About the Ports</a></h3>
<p>See <a href="../config/security/understanding-the-ports/">this part of the documentation</a> for further details and best practice advice, <strong>especially regarding security concerns</strong>.</p>
<h3 id="how-can-i-configure-my-email-client"><a class="toclink" href="#how-can-i-configure-my-email-client">How can I configure my email client?</a></h3>
<p>Login is full email address (<code>&lt;user&gt;@&lt;domain&gt;</code>).</p>
<div class="highlight"><pre><span></span><code><span class="c1"># IMAP</span>
<span class="na">username</span><span class="o">:</span><span class="w"> </span><span class="s">&lt;user1@example.com&gt;</span>
<span class="na">password</span><span class="o">:</span><span class="w"> </span><span class="s">&lt;mypassword&gt;</span>
<span class="na">server</span><span class="o">:</span><span class="w"> </span><span class="s">&lt;mail.example.com&gt;</span>
<span class="na">imap</span><span class="w"> </span><span class="s">port: 143 or 993 with STARTTLS/SSL (recommended)</span>
<span class="na">imap</span><span class="w"> </span><span class="s">path prefix: INBOX</span>
<span class="c1"># SMTP</span>
<span class="na">smtp</span><span class="w"> </span><span class="s">port: 25 or 587/465 with STARTTLS/SSL (recommended)</span>
<span class="na">username</span><span class="o">:</span><span class="w"> </span><span class="s">&lt;user1@example.com&gt;</span>
<span class="na">password</span><span class="o">:</span><span class="w"> </span><span class="s">&lt;mypassword&gt;</span>
</code></pre></div>
<p>DMS is properly configured for port 587, if possible, we recommend using port 465 for SMTP though. See <a href="#i-want-to-know-more-about-the-ports">this section to learn more about ports</a>.</p>
<h3 id="can-i-use-a-nakedbare-domain-ie-no-hostname"><a class="toclink" href="#can-i-use-a-nakedbare-domain-ie-no-hostname">Can I use a naked/bare domain (i.e. no hostname)?</a></h3>
<p>Yes, but not without some configuration changes. Normally it is assumed that DMS runs on a host with a name, so the fully qualified host name might be <code>mail.example.com</code> with the domain <code>example.com</code>. The MX records point to <code>mail.example.com</code>.</p>
<p>To use a bare domain (<em>where the host name is <code>example.com</code> and the domain is also <code>example.com</code></em>), change <code>mydestination</code>:</p>
<ul>
<li>From: <code>mydestination = $myhostname, localhost.$mydomain, localhost</code></li>
<li>To: <code>mydestination = localhost.$mydomain, localhost</code></li>
</ul>
<p>Add the latter line to <code>docker-data/dms/config/postfix-main.cf</code>. If that doesn't work, make sure that <a href="https://github.com/docker-mailserver/docker-mailserver/issues/1731#issuecomment-753968425"><code>OVERRIDE_HOSTNAME</code> is blank in your <code>mailserver.env</code> file</a>. Without these changes there will be warnings in the logs like:</p>
<div class="highlight"><pre><span></span><code><span class="go">warning: do not list domain example.com in BOTH mydestination and virtual_mailbox_domains</span>
</code></pre></div>
<p>Plus of course mail delivery fails.</p>
<p>Also you need to define <code>hostname: example.com</code> in your <code>docker-compose.yml</code>.</p>
<div class="admonition tip">
<p class="admonition-title">You might not want a bare domain</p>
<p>We encourage you to consider using a subdomain where possible.</p>
<ul>
<li>There are <a href="https://github.com/docker-mailserver/docker-mailserver/issues/3048#issuecomment-1432358353">benefits</a> to preferring a subdomain.</li>
<li>A bare domain is not required to have <code>user@example.com</code>, that is distinct from your hostname which is identified by a DNS MX record.</li>
</ul>
</div>
<h3 id="how-can-i-configure-a-catch-all"><a class="toclink" href="#how-can-i-configure-a-catch-all">How can I configure a catch-all?</a></h3>
<p>Considering you want to redirect all incoming e-mails for the domain <code>example.com</code> to <code>user1@example.com</code>, add the following line to <code>docker-data/dms/config/postfix-virtual.cf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="na">@example.com user1@example.com</span>
</code></pre></div>
<h3 id="how-can-i-delete-all-the-emails-for-a-specific-user"><a class="toclink" href="#how-can-i-delete-all-the-emails-for-a-specific-user">How can I delete all the emails for a specific user?</a></h3>
<p>First of all, create a special alias named <code>devnull</code> by editing <code>docker-data/dms/config/postfix-aliases.cf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="na">devnull</span><span class="o">:</span><span class="w"> </span><span class="s">/dev/null</span>
</code></pre></div>
<p>Considering you want to delete all the e-mails received for <code>baduser@example.com</code>, add the following line to <code>docker-data/dms/config/postfix-virtual.cf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="na">baduser@example.com devnull</span>
</code></pre></div>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>If you use a catch-all rule for the main/sub domain, you need another entry in <code>docker-data/dms/config/postfix-virtual.cf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="na">@mail.example.com hello@example.com</span>
<span class="na">baduser@example.com devnull</span>
<span class="na">devnull@mail.example.com devnull</span>
</code></pre></div>
</div>
<h3 id="what-kind-of-ssl-certificates-can-i-use"><a class="toclink" href="#what-kind-of-ssl-certificates-can-i-use">What kind of SSL certificates can I use?</a></h3>
<p>Both RSA and ECDSA certs are supported. You can provide your own cert files manually, or mount a <code>letsencrypt</code> generated directory (<em>with alternative support for Traefik's <code>acme.json</code></em>). Check out the <a href="../config/environment/#ssl_type"><code>SSL_TYPE</code> documentation</a> for more details.</p>
<h3 id="i-just-moved-from-my-old-mail-server-to-dms-but-it-doesnt-work"><a class="toclink" href="#i-just-moved-from-my-old-mail-server-to-dms-but-it-doesnt-work">I just moved from my old mail server to DMS, but "it doesn't work"?</a></h3>
<p>If this migration implies a DNS modification, be sure to wait for DNS propagation before opening an issue.
Few examples of symptoms can be found <a href="https://github.com/docker-mailserver/docker-mailserver/issues/95">here</a> or <a href="https://github.com/docker-mailserver/docker-mailserver/issues/97">here</a>.</p>
<p>This could be related to a modification of your <code>MX</code> record, or the IP mapped to <code>mail.example.com</code>. Additionally, <a href="https://intodns.com/">validate your DNS configuration</a>.</p>
<p>If everything is OK regarding DNS, please provide <a href="https://guides.github.com/features/mastering-markdown/">formatted logs</a> and config files. This will allow us to help you.</p>
<p>If we're blind, we won't be able to do anything.</p>
<h3 id="connection-refused-or-no-response-at-all"><a class="toclink" href="#connection-refused-or-no-response-at-all">Connection refused or No response at all</a></h3>
<p>You see errors like "Connection Refused" and "Connection closed by foreign host", or you cannot connect at all? You may not be able to connect with your mail client (MUA)? Make sure to check Fail2Ban did not ban you (for exceeding the number of tried logins for example)! You can run</p>
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>&lt;CONTAINER<span class="w"> </span>NAME&gt;<span class="w"> </span>setup<span class="w"> </span>fail2ban
</code></pre></div>
<p>and check whether your IP address appears. Use</p>
<div class="highlight"><pre><span></span><code>docker<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>&lt;CONTAINER<span class="w"> </span>NAME&gt;<span class="w"> </span>setup<span class="w"> </span>fail2ban<span class="w"> </span>unban<span class="w"> </span>&lt;YOUR<span class="w"> </span>IP&gt;
</code></pre></div>
<p>to unban the IP address.</p>
<h3 id="how-can-i-authenticate-users-with-smtp_only1"><a class="toclink" href="#how-can-i-authenticate-users-with-smtp_only1">How can I authenticate users with <code>SMTP_ONLY=1</code>?</a></h3>
<p>See <a href="https://github.com/docker-mailserver/docker-mailserver/issues/1247">#1247</a> for an example.</p>
<div class="admonition todo">
<p class="admonition-title">Todo</p>
<p>Write a How-to / Use-Case / Tutorial about authentication with <code>SMTP_ONLY</code>.</p>
</div>
<h3 id="common-errors"><a class="toclink" href="#common-errors">Common Errors</a></h3>
<div class="highlight"><pre><span></span><code><span class="go">warning: connect to Milter service inet:localhost:8893: Connection refused</span>
<span class="gp"># </span>DMARC<span class="w"> </span>not<span class="w"> </span><span class="nv">running</span>
<span class="gp"># </span><span class="o">=</span>&gt;<span class="w"> </span>/etc/init.d/opendmarc<span class="w"> </span>restart
<span class="go">warning: connect to Milter service inet:localhost:8891: Connection refused</span>
<span class="gp"># </span>DKIM<span class="w"> </span>not<span class="w"> </span><span class="nv">running</span>
<span class="gp"># </span><span class="o">=</span>&gt;<span class="w"> </span>/etc/init.d/opendkim<span class="w"> </span>restart
<span class="go">mail amavis[1459]: (01459-01) (!)connect to /var/run/clamav/clamd.ctl failed, attempt #1: Can&#39;t connect to a UNIX socket /var/run/clamav/clamd.ctl: No such file or directory</span>
<span class="go">mail amavis[1459]: (01459-01) (!)ClamAV-clamd: All attempts (1) failed connecting to /var/run/clamav/clamd.ctl, retrying (2)</span>
<span class="go">mail amavis[1459]: (01459-01) (!)ClamAV-clamscan av-scanner FAILED: /usr/bin/clamscan KILLED, signal 9 (0009) at (eval 100) line 905.</span>
<span class="go">mail amavis[1459]: (01459-01) (!!)AV: ALL VIRUS SCANNERS FAILED</span>
<span class="gp"># </span>Clamav<span class="w"> </span>is<span class="w"> </span>not<span class="w"> </span>running<span class="w"> </span><span class="o">(</span>not<span class="w"> </span>started<span class="w"> </span>or<span class="w"> </span>because<span class="w"> </span>you<span class="w"> </span>don<span class="err">&#39;</span>t<span class="w"> </span>have<span class="w"> </span>enough<span class="w"> </span>memory<span class="o">)</span>
<span class="gp"># </span><span class="o">=</span>&gt;<span class="w"> </span>check<span class="w"> </span>requirements<span class="w"> </span>and/or<span class="w"> </span>start<span class="w"> </span>Clamav
</code></pre></div>
<h3 id="how-to-use-dms-behind-a-proxy"><a class="toclink" href="#how-to-use-dms-behind-a-proxy">How to use DMS behind a proxy</a></h3>
<p><a href="../config/advanced/override-defaults/user-patches/">Using <code>user-patches.sh</code></a>, update the container file <code>/etc/postfix/main.cf</code> to include:</p>
<div class="highlight"><pre><span></span><code><span class="na">proxy_interfaces</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">X.X.X.X (your public IP)</span>
</code></pre></div>
<h3 id="how-to-adjust-settings-with-the-user-patchessh-script"><a class="toclink" href="#how-to-adjust-settings-with-the-user-patchessh-script">How to adjust settings with the <code>user-patches.sh</code> script</a></h3>
<p>Suppose you want to change a number of settings that are not listed as variables or add things to the server that are not included?</p>
<p>DMS has a built-in way to do post-install processes. If you place a script called <strong><code>user-patches.sh</code></strong> in the config directory it will be run after all configuration files are set up, but before the postfix, amavis and other daemons are started.</p>
<p>It is common to use a local directory for config added to <code>docker-mailsever</code> via a volume mount in your <code>docker-compose.yml</code> (eg: <code>./docker-data/dms/config/:/tmp/docker-mailserver/</code>).</p>
<p>Add or create the script file to your config directory:</p>
<div class="highlight"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>./docker-data/dms/config
touch<span class="w"> </span>user-patches.sh
chmod<span class="w"> </span>+x<span class="w"> </span>user-patches.sh
</code></pre></div>
<p>Then fill <code>user-patches.sh</code> with suitable code.</p>
<p>If you want to test it you can move into the running container, run it and see if it does what you want. For instance:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># start shell in container</span>
./setup.sh<span class="w"> </span>debug<span class="w"> </span>login
<span class="c1"># check the file</span>
cat<span class="w"> </span>/tmp/docker-mailserver/user-patches.sh
<span class="c1"># run the script</span>
/tmp/docker-mailserver/user-patches.sh
<span class="c1"># exit the container shell back to the host shell</span>
<span class="nb">exit</span>
</code></pre></div>
<p>You can do a lot of things with such a script. You can find an example <code>user-patches.sh</code> script here: <a href="https://github.com/hanscees/dockerscripts/blob/master/scripts/tomav-user-patches.sh">example <code>user-patches.sh</code> script</a>.</p>
<p>We also have a <a href="../config/advanced/override-defaults/user-patches/">very similar docs page</a> specifically about this feature!</p>
<div class="admonition attention">
<p class="admonition-title">Special use-case - patching the <code>supervisord</code> configuration</p>
<p>It seems worth noting, that the <code>user-patches.sh</code> gets executed through <code>supervisord</code>. If you need to patch some supervisord config (e.g. <code>/etc/supervisor/conf.d/saslauth.conf</code>), the patching happens too late.</p>
<p>An easy workaround is to make the <code>user-patches.sh</code> reload the supervisord config after patching it:</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/bash</span>
sed<span class="w"> </span>-i<span class="w"> </span><span class="s1">&#39;s/rimap -r/rimap/&#39;</span><span class="w"> </span>/etc/supervisor/conf.d/saslauth.conf
supervisorctl<span class="w"> </span>update
</code></pre></div>
</div>
<h3 id="how-to-ban-custom-ip-addresses-with-fail2ban"><a class="toclink" href="#how-to-ban-custom-ip-addresses-with-fail2ban">How to ban custom IP addresses with Fail2ban</a></h3>
<p>Use the following command:</p>
<div class="highlight"><pre><span></span><code>./setup.sh<span class="w"> </span>fail2ban<span class="w"> </span>ban<span class="w"> </span>&lt;IP&gt;
</code></pre></div>
<p>The default bantime is 180 days. This value can be <a href="../config/security/fail2ban/">customized</a>.</p>
<h3 id="what-to-do-in-case-of-spfforwarding-problems"><a class="toclink" href="#what-to-do-in-case-of-spfforwarding-problems">What to do in case of SPF/Forwarding problems</a></h3>
<p>If you got any problems with SPF and/or forwarding mails, give <a href="https://github.com/roehling/postsrsd/blob/master/README.rst">SRS</a> a try. You enable SRS by setting <code>ENABLE_SRS=1</code>. See the variable description for further information.</p>
<h3 id="why-are-my-emails-not-being-delivered"><a class="toclink" href="#why-are-my-emails-not-being-delivered">Why are my emails not being delivered?</a></h3>
<p>There are many reasons why email might be rejected, common causes are:</p>
<ul>
<li>Wrong or untrustworthy SSL certificate.</li>
<li>A TLD (your domain) or IP address with a bad reputation.</li>
<li>Misconfigured DNS records.</li>
</ul>
<p>DMS does not manage those concerns, verify they are not causing your delivery problems before reporting a bug on our issue tracker. Resources that can help you troubleshoot:</p>
<ul>
<li><a href="https://www.mail-tester.com/">mail-tester</a> can test your deliverability.</li>
<li><a href="https://www.helloinbox.email/">helloinbox</a> provides a checklist of things to improve your deliverability.</li>
</ul>
<h3 id="special-directories"><a class="toclink" href="#special-directories">Special Directories</a></h3>
<h4 id="what-about-the-docker-datadmsconfig-directory"><a class="toclink" href="#what-about-the-docker-datadmsconfig-directory">What About the <code>docker-data/dms/config/</code> Directory?</a></h4>
<p>This documentation and all example configuration files in the GitHub repository use <code>docker-data/dms/config/</code> to refer to the directory in the host that is mounted (e.g. via a bind mount) to <code>/tmp/docker-mailserver/</code> inside the container.</p>
<p>Most configuration files for Postfix, Dovecot, etc. are persisted here. <a href="../config/advanced/optional-config/">Optional configuration</a> is stored here as well.</p>
<h4 id="what-about-the-docker-datadmsmail-state-directory"><a class="toclink" href="#what-about-the-docker-datadmsmail-state-directory">What About the <code>docker-data/dms/mail-state/</code> Directory?</a></h4>
<p>This documentation and all example configuration files in the GitHub repository use <code>docker-data/dms/mail-state/</code> to refer to the directory in the host that is mounted (e.g. via a bind mount) to <code>/var/mail-state/</code> inside the container.</p>
<p>When you run DMS with the ENV variable <code>ONE_DIR=1</code> (default), this directory will provide support to persist Fail2Ban blocks, ClamAV signature updates, and the like when the container is restarted or recreated. Service data is <a href="https://github.com/docker-mailserver/docker-mailserver/blob/c7e498194546416fb7231cb03254e77e085d18df/target/scripts/startup/misc-stack.sh#L24-L33">relocated to the <code>mail-state</code> folder</a> for the following services: Postfix, Dovecot, Fail2Ban, Amavis, PostGrey, ClamAV, SpamAssassin, Rspamd &amp; Redis.</p>
<h3 id="spamassasin"><a class="toclink" href="#spamassasin">SpamAssasin</a></h3>
<h4 id="how-can-i-manage-my-custom-spamassassin-rules"><a class="toclink" href="#how-can-i-manage-my-custom-spamassassin-rules">How can I manage my custom SpamAssassin rules?</a></h4>
<p>Antispam rules are managed in <code>docker-data/dms/config/spamassassin-rules.cf</code>.</p>
<h4 id="what-are-acceptable-sa_spam_subject-values"><a class="toclink" href="#what-are-acceptable-sa_spam_subject-values">What are acceptable <code>SA_SPAM_SUBJECT</code> values?</a></h4>
<p>For no subject set <code>SA_SPAM_SUBJECT=undef</code>.</p>
<p>For a trailing white-space subject one can define the whole variable with quotes in <code>docker-compose.yml</code>:</p>
<div class="highlight"><pre><span></span><code><span class="nt">environment</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;SA_SPAM_SUBJECT=[SPAM]</span><span class="nv"> </span><span class="s">&quot;</span>
</code></pre></div>
<h4 id="why-are-spamassassin-x-headers-not-inserted-into-my-subdomainexamplecom-subdomain-emails"><a class="toclink" href="#why-are-spamassassin-x-headers-not-inserted-into-my-subdomainexamplecom-subdomain-emails">Why are SpamAssassin <code>x-headers</code> not inserted into my <code>subdomain.example.com</code> subdomain emails?</a></h4>
<p>In the default setup, amavis only applies SpamAssassin x-headers into domains matching the template listed in the config file (<code>05-domain_id</code> in the amavis defaults).</p>
<p>The default setup <code>@local_domains_acl = ( ".$mydomain" );</code> does not match subdomains. To match subdomains, you can override the <code>@local_domains_acl</code> directive in the amavis user config file <code>50-user</code> with <code>@local_domains_maps = (".");</code> to match any sort of domain template.</p>
<h4 id="how-can-i-make-spamassassin-better-recognize-spam"><a class="toclink" href="#how-can-i-make-spamassassin-better-recognize-spam">How can I make SpamAssassin better recognize spam?</a></h4>
<p>Put received spams in <code>.Junk/</code> imap folder using <code>SPAMASSASSIN_SPAM_TO_INBOX=1</code> and <code>MOVE_SPAM_TO_JUNK=1</code> and add a <em>user</em> cron like the following:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># This assumes you&#39;re having `environment: ONE_DIR=1` in the `mailserver.env`,</span>
<span class="c1"># with a consolidated config in `/var/mail-state`</span>
<span class="c1">#</span>
<span class="c1"># m h dom mon dow command</span>
<span class="c1"># Everyday 2:00AM, learn spam from a specific user</span>
<span class="na">0 2 * * * docker exec mailserver sa-learn --spam /var/mail/example.com/username/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin</span>
</code></pre></div>
<p>With <code>docker-compose</code> you can more easily use the internal instance of <code>cron</code> within DMS. This is less problematic than the simple solution shown above, because it decouples the learning from the host on which DMS is running, and avoids errors if the mail server is not running.</p>
<p>The following configuration works nicely:</p>
<details class="example">
<summary>Example</summary>
<p>Create a <em>system</em> cron file:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># in the docker-compose.yml root directory</span>
mkdir<span class="w"> </span>-p<span class="w"> </span>./docker-data/dms/cron
touch<span class="w"> </span>./docker-data/dms/cron/sa-learn
chown<span class="w"> </span>root:root<span class="w"> </span>./docker-data/dms/cron/sa-learn
chmod<span class="w"> </span><span class="m">0644</span><span class="w"> </span>./docker-data/dms/cron/sa-learn
</code></pre></div>
<p>Edit the system cron file <code>nano ./docker-data/dms/cron/sa-learn</code>, and set an appropriate configuration:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># This assumes you&#39;re having `environment: ONE_DIR=1` in the env-mailserver,</span>
<span class="c1"># with a consolidated config in `/var/mail-state`</span>
<span class="c1">#</span>
<span class="c1"># &#39;&gt; /dev/null&#39; to send error notifications from &#39;stderr&#39; to &#39;postmaster@example.com&#39;</span>
<span class="c1">#</span>
<span class="c1"># m h dom mon dow user command</span>
<span class="c1">#</span>
<span class="c1"># Everyday 2:00AM, learn spam from a specific user</span>
<span class="c1"># spam: junk directory</span>
<span class="na">0 2 * * * root sa-learn --spam /var/mail/example.com/username/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
<span class="c1"># ham: archive directories</span>
<span class="na">15 2 * * * root sa-learn --ham /var/mail/example.com/username/.Archive* --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
<span class="c1"># ham: inbox subdirectories</span>
<span class="na">30 2 * * * root sa-learn --ham /var/mail/example.com/username/cur* --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
<span class="c1">#</span>
<span class="c1"># Everyday 3:00AM, learn spam from all users of a domain</span>
<span class="c1"># spam: junk directory</span>
<span class="na">0 3 * * * root sa-learn --spam /var/mail/not-example.com/*/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
<span class="c1"># ham: archive directories</span>
<span class="na">15 3 * * * root sa-learn --ham /var/mail/not-example.com/*/.Archive* --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
<span class="c1"># ham: inbox subdirectories</span>
<span class="na">30 3 * * * root sa-learn --ham /var/mail/not-example.com/*/cur* --dbpath /var/mail-state/lib-amavis/.spamassassin &gt; /dev/null</span>
</code></pre></div>
<p>Then with <code>docker-compose.yml</code>:</p>
<div class="highlight"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">mailserver</span><span class="p">:</span>
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ghcr.io/docker-mailserver/docker-mailserver:latest</span>
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./docker-data/dms/cron/sa-learn:/etc/cron.d/sa-learn</span>
</code></pre></div>
<p>Or with <a href="https://docs.docker.com/engine/swarm/configs/">Docker Swarm</a>:</p>
<div class="highlight"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">mailserver</span><span class="p">:</span>
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ghcr.io/docker-mailserver/docker-mailserver:latest</span>
<span class="w"> </span><span class="c1"># ...</span>
<span class="w"> </span><span class="nt">configs</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_sa_crontab</span>
<span class="w"> </span><span class="nt">target</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/etc/cron.d/sa-learn</span>
<span class="nt">configs</span><span class="p">:</span>
<span class="w"> </span><span class="nt">my_sa_crontab</span><span class="p">:</span>
<span class="w"> </span><span class="nt">file</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./docker-data/dms/cron/sa-learn</span>
</code></pre></div>
</details>
<p>With the default settings, SpamAssassin will require 200 mails trained for spam (for example with the method explained above) and 200 mails trained for ham (using the same command as above but using <code>--ham</code> and providing it with some ham mails). Until you provided these 200+200 mails, SpamAssassin will not take the learned mails into account. For further reference, see the <a href="https://wiki.apache.org/spamassassin/BayesNotWorking">SpamAssassin Wiki</a>.</p>
<h4 id="how-do-i-have-more-control-about-what-spamassassin-is-filtering"><a class="toclink" href="#how-do-i-have-more-control-about-what-spamassassin-is-filtering">How do I have more control about what SpamAssassin is filtering?</a></h4>
<p>By default, SPAM and INFECTED emails are put to a quarantine which is not very straight forward to access. Several config settings are affecting this behavior:</p>
<p>First, make sure you have the proper thresholds set:</p>
<div class="highlight"><pre><span></span><code><span class="na">SA_TAG</span><span class="o">=</span><span class="s">-100000.0</span>
<span class="na">SA_TAG2</span><span class="o">=</span><span class="s">3.75</span>
<span class="na">SA_KILL</span><span class="o">=</span><span class="s">100000.0</span>
</code></pre></div>
<ul>
<li>The very negative vaue in <code>SA_TAG</code> makes sure, that all emails have the SpamAssassin headers included.</li>
<li><code>SA_TAG2</code> is the actual threshold to set the YES/NO flag for spam detection.</li>
<li><code>SA_KILL</code> needs to be very high, to make sure nothing is bounced at all (<code>SA_KILL</code> superseeds <code>SPAMASSASSIN_SPAM_TO_INBOX</code>)</li>
</ul>
<p>Make sure everything (including SPAM) is delivered to the inbox and not quarantined:</p>
<div class="highlight"><pre><span></span><code><span class="na">SPAMASSASSIN_SPAM_TO_INBOX</span><span class="o">=</span><span class="s">1</span>
</code></pre></div>
<p>Use <code>MOVE_SPAM_TO_JUNK=1</code> or create a sieve script which puts spam to the Junk folder:</p>
<div class="highlight"><pre><span></span><code><span class="kn">require</span> <span class="p">[</span><span class="s">&quot;comparator-i;ascii-numeric&quot;</span><span class="p">,</span><span class="s">&quot;relational&quot;</span><span class="p">,</span><span class="s">&quot;fileinto&quot;</span><span class="p">];</span>
<span class="nb">if</span> <span class="nb">header</span> <span class="nt">:contains</span> <span class="s">&quot;X-Spam-Flag&quot;</span> <span class="s">&quot;YES&quot;</span> <span class="p">{</span>
<span class="nb">fileinto</span> <span class="s">&quot;Junk&quot;</span><span class="p">;</span>
<span class="p">}</span> <span class="nb">elsif</span> <span class="nb">allof</span> <span class="p">(</span>
<span class="nb">not</span> <span class="nb">header</span> <span class="nt">:matches</span> <span class="s">&quot;x-spam-score&quot;</span> <span class="s">&quot;-*&quot;</span><span class="p">,</span>
<span class="nb">header</span> <span class="nt">:value</span> <span class="s">&quot;ge&quot;</span> <span class="nt">:comparator</span> <span class="s">&quot;i;ascii-numeric&quot;</span> <span class="s">&quot;x-spam-score&quot;</span> <span class="s">&quot;3.75&quot;</span> <span class="p">)</span> <span class="p">{</span>
<span class="nb">fileinto</span> <span class="s">&quot;Junk&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Create a dedicated mailbox for emails which are infected/bad header and everything amavis is blocking by default and put its address into <code>docker-data/dms/config/amavis.cf</code></p>
<div class="highlight"><pre><span></span><code><span class="na">$clean_quarantine_to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;amavis\@example.com&quot;</span><span class="c1">;</span>
<span class="na">$virus_quarantine_to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;amavis\@example.com&quot;</span><span class="c1">;</span>
<span class="na">$banned_quarantine_to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;amavis\@example.com&quot;</span><span class="c1">;</span>
<span class="na">$bad_header_quarantine_to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;amavis\@example.com&quot;</span><span class="c1">;</span>
<span class="na">$spam_quarantine_to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;amavis\@example.com&quot;</span><span class="c1">;</span>
</code></pre></div>
</article>
</div>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
<p>&copy <a href="https://github.com/docker-mailserver"><em>Docker Mailserver Organization</em></a><br/><span>This project is licensed under the MIT license.</span></p>
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tabs", "navigation.top", "navigation.expand", "navigation.instant", "content.code.annotate"], "search": "../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
<script src="../assets/javascripts/bundle.407015b8.min.js"></script>
</body>
</html>