Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| email:configure-dovecot [2025/03/03 14:34] – created willy | email:configure-dovecot [2026/01/22 17:58] (current) – [Setup Sieve] willy | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Configuring Dovecot ====== | + | ====== |
| + | Dovecot configuation is stored in **/ | ||
| - | <file - dovecot.conf> | + | For each file, i will show you the changes from the defaults that you need to apply. |
| - | log_path = syslog | + | |
| - | syslog_facility = mail | + | |
| - | mail_debug = no | + | |
| - | auth_debug = no | + | |
| - | auth_debug_passwords = no | + | |
| - | auth_verbose = no | + | |
| - | base_dir = / | + | |
| - | listen = * | + | |
| - | protocols = imap sieve | + | |
| - | login_greeting = IMAPD ready. | + | |
| - | # Mailbox setup | + | **NOTE:** Dovecot 2.4 introduced some changes to the config file. The following has been adapted to this new format. |
| - | mail_location | + | |
| - | namespace inbox { | + | ===== Main changes ===== |
| - | | + | |
| + | You need to enable the selected protocols and change the login greeting, as i don't like to let others know that i use dovecot, for security reasons. | ||
| + | |||
| + | Edit **doveconf.conf**: | ||
| + | < | ||
| + | dovecot_config_version = 2.4.2 | ||
| + | dovecot_storage_version = 2.4.2 | ||
| + | |||
| + | !include_try conf.d/*.conf | ||
| + | |||
| + | protocols | ||
| + | | ||
| + | lmtp = yes | ||
| + | sieve = yes | ||
| } | } | ||
| - | mail_uid = 5000 | ||
| - | mail_gid = 5000 | ||
| - | mailbox_list_index = yes | ||
| - | mailbox_idle_check_interval = 30 secs | ||
| - | maildir_copy_with_hardlinks = yes | ||
| - | # Sieve | + | mail_home = / |
| - | managesieve_notify_capability | + | mail_driver |
| - | managesieve_sieve_capability | + | mail_path |
| - | # Authentication and login | + | mail_uid |
| - | disable_plaintext_auth | + | mail_gid |
| - | auth_default_realm | + | |
| - | auth_mechanisms = plain login | + | namespace inbox { |
| - | auth_realms | + | inbox = yes |
| - | auth_failure_delay | + | |
| + | } | ||
| - | # SQLite link | ||
| sql_driver = sqlite | sql_driver = sqlite | ||
| sqlite_path = / | sqlite_path = / | ||
| + | |||
| passdb sql { | passdb sql { | ||
| - | query = SELECT username, domain, password FROM mailbox WHERE username = '%u' AND active = 1 | + | query = SELECT username, domain, password FROM mailbox WHERE username = '%{user}' AND active = 1 |
| } | } | ||
| + | |||
| userdb sql { | userdb sql { | ||
| - | query = SELECT CONCAT('/ | + | query = SELECT CONCAT('/ |
| iterate_query = SELECT username AS user FROM mailbox | iterate_query = SELECT username AS user FROM mailbox | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | ===== Setup link to postfix ===== | ||
| + | |||
| + | Changes in **conf.d/ | ||
| + | < | ||
| + | service lmtp { | ||
| + | unix_listener / | ||
| + | group = postfix | ||
| + | mode = 0660 | ||
| + | user = postfix | ||
| + | } | ||
| service auth { | service auth { | ||
| Line 54: | Line 67: | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| - | # SSL TLS setup | + | This is required because postfix will use dovecot to deliver mail to mailboxes internally and to perform SASL authentication as well. |
| + | |||
| + | ===== Setup Sieve ===== | ||
| + | |||
| + | Sieve let's you create custom filters that will filter your inbound emails. | ||
| + | |||
| + | Changes in **conf.d/ | ||
| + | < | ||
| + | sieve_script personal { | ||
| + | path = / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | And enable sieve for lmtp (local delivery), edit **conf.d/ | ||
| + | < | ||
| + | protocol lmtp { | ||
| + | mail_plugins { | ||
| + | sieve = yes | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Setup authentication ===== | ||
| + | |||
| + | Changes in **conf.d/ | ||
| + | < | ||
| + | auth_mechanisms = plain login | ||
| + | </ | ||
| + | |||
| + | ===== Setup mailboxes ===== | ||
| + | |||
| + | Changes in **conf.d/ | ||
| + | < | ||
| + | mail_home = / | ||
| + | mail_driver = maildir | ||
| + | mail_path = ~/maildir | ||
| + | |||
| + | mail_uid = vmail | ||
| + | mail_gid = vmail | ||
| + | </ | ||
| + | |||
| + | ===== Setup TLS ===== | ||
| + | |||
| + | You need to point to the Let's Encrypt certificates. | ||
| + | |||
| + | Changes in **conf.d/ | ||
| + | < | ||
| ssl = yes | ssl = yes | ||
| - | ssl_cert | + | ssl_server { |
| - | ssl_key | + | cert_file |
| - | ssl_min_protocol = TLSv1.2 | + | |
| - | ssl_cipher_list = ECDHE-ECDSA-AES256-GCM-SHA384: | + | } |
| + | </ | ||
| + | For this to work, you need to ensure that the certs are properly moved after being renewed by Let's Encrypt. I use the following post hook in **/ | ||
| + | <file - dovecot.sh> | ||
| + | cp / | ||
| + | cp / | ||
| + | chmod o+r / | ||
| + | / | ||
| </ | </ | ||
| + | the chmod is required for command line tools using **doveadm**, | ||
| + | |||
| + | ===== Testing ===== | ||
| + | |||
| + | Start dovecot | ||
| + | |||
| + | Check that login works: | ||
| + | <code bash> | ||
| + | doveadm auth test -a / | ||
| + | </ | ||
| + | |||
| + | Test IMAP: | ||
| + | <code bash> | ||
| + | telnet mail.mydomain.com 143 | ||
| + | Trying 1.2.3.4... | ||
| + | Connected to mail.mydomain.com. | ||
| + | Escape character is ' | ||
| + | * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN AUTH=LOGIN] IMAP </ | ||
| + | |||
| + | Test that login works: | ||
| + | <code bash> | ||
| + | telnet 127.0.0.1 1143 | ||
| + | Trying 127.0.0.1... | ||
| + | Connected to 127.0.0.1. | ||
| + | Escape character is ' | ||
| + | * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN AUTH=LOGIN] IMAP server ready. | ||
| + | a login user@mydomain.com password | ||
| + | a OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in | ||
| + | </ | ||
| + | |||
| + | Test TLS works: | ||
| + | <code bash> | ||
| + | openssl s_client -connect mail.mydomain.com: | ||
| + | [ expect similar output as above ] | ||
| + | </ | ||
| + | |||
| + | Test STARTTLS works: | ||
| + | <code bash> | ||
| + | openssl s_client -connect mail.mydomain.com: | ||
| + | [ expect similar output as above ] | ||
| + | </ | ||
| + | If all those checks worked fine, your dovecot seems all set! | ||