Un serveur de mail complet et moderne

Rédigé par citizenz - - 70 commentaires

Système de base : Ubuntu server 18.04

Hébergeur : Hetzner VPS CX11 (1 vCPU - 2 GB RAM - 20 GB SSD - 2.99 €/mois)

Composants du serveur de mail :
  • Postfix (SMTP)
  • Dovecot (IMAP)
  • Rspamd (Antispam)
  • Rainloop (Webmail)
  • Dkim
  • Filtres Sieve

0 - Changez le mot de passe root, créez un user système avec accès sudo. Passez en root.

1 - On met à jour
# apt-get update && apt-get upgrade

2 - On vérifie que sendmail n'est pas installé par défaut :

# service sendmail stop; update-rc.d -f sendmail remove
Si vous recevez l'erreur suivante ignorez-là :
"Failed to stop sendmail.service: Unit sendmail.service not loaded"
Ca signifie que tout est bon :)

3 - On crée un groupe et un user vmail :
# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/mail/vmail -m vmail

4- On installe quelques appli utiles + nginx, php, mysql (Mariadb) :
# apt install mc screen htop vim-nox curl git unzip ntp ntpdate nginx mariadb-server openssl /
php7.2-fpm php7.2 php7.2-common php7.2-gd php7.2-mysql php7.2-imap php7.2-cli php7.2-cgi /
php-pear mcrypt imagemagick libruby php7.2-curl php7.2-intl php7.2-pspell php7.2-recode /
php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl memcached php-memcache php-imagick /
php-gettext php7.2-zip php7.2-mbstring

####### MYSQL #######

5 - On sécurise Mysql en ajoutant un mot de passe root :
# mysql_secure_installation
  • Enter current password for root (enter for none): ENTREE
  • Set root password? [Y/n] Tapez Y
  • New password: Entrez le mot de passe pour le user root
  • Re-enter new password: mot de passe de nouveau...
  • Remove anonymous users? [Y/n] Tapez Y
  • Disallow root login remotely? [Y/n] Tapez Y
  • Remove test database and access to it? [Y/n] Tapez Y
  • Reload privilege tables now? [Y/n] Tapez Y

####### POSTFIXADMIN #######

6 - On télécharge Postfixadmin (la dernière version au 09/10/19 est la 3.2) :
# wget https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz
# tar xzf postfixadmin-3.2.tar.gz

7 - On déplace postfixadmin en /var/www/postfixadmin et on crée le répertoire templates_c :

# mv postfixadmin-3.2/ /var/www/postfixadmin
# rm -f postfixadmin-3.2.tar.gz
# mkdir /var/www/postfixadmin/templates_c

8 - On change les droits :
# chown -R www-data: /var/www/postfixadmin

[* : A partir de maintenant, vous penserez à remplacer "your_secret_password" par votre VRAI mot de passe dans tous les fichiers d'exemple !]

9 - On crée la base mysql pour postfixadmin :

# mysql -u root -p
CREATE DATABASE postfixadmin;
GRANT ALL ON postfixadmin.* TO 'postfixadmin'@'localhost' IDENTIFIED BY 'your_secret_password';
FLUSH PRIVILEGES;
exit

10 - On crée /var/www/postfixadmin/config.local.php :
<?php
$CONF['configured'] = true;

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'your_secret_password';
$CONF['database_name'] = 'postfixadmin';

$CONF['default_aliases'] = array (
'abuse'      => 'abuse@example.com',
'hostmaster' => 'hostmaster@example.com',
'postmaster' => 'postmaster@example.com',
'webmaster'  => 'webmaster@example.com'
);
$CONF['fetchmail'] = 'NO';
$CONF['show_footer_text'] = 'NO';
$CONF['quota'] = 'YES';
$CONF['domain_quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';
$CONF['domain_quota_default'] = '0';
?>

11 - On installe le schéma de la base en lançant le script suivant :
sudo -u www-data php /var/www/postfixadmin/public/upgrade.php

12 - Puis on crée le superadmin Postfixadmin :
sudo bash /var/www/postfixadmin/scripts/postfixadmin-cli admin add
[* Veillez à changer your_secret_password et example.com !]
Welcome to Postfixadmin-CLI v0.2
---------------------------------------------------------------

Admin: 
> postmaster@example.com

Password: 
> your_secret_password

Password (again): 
> your_secret_password

Super admin:
(Super admins have access to all domains, can manage domains and admin accounts.) (y/n)
> y

Domain: 
> example.com

Active: (y/n)
> y

The admin postmaster@example.com has been added!

13 - On installe Letsencrypt (certbot) :
# apt install software-properties-common lsb-release
# add-apt-repository ppa:certbot/certbot
# apt update
# apt install python-certbot-nginx

14 - On crée le fichier Nginx dans /etc/nginx/conf.d/mail.example.com.conf (à adapter avec votre vrai nom de domaine)
server {   
   listen 80;  
   listen [::]:80;  
   server_name mail.example.com;  
   root /var/www/postfixadmin/public;  
   index index.php;  
   location / {     
      try_files $uri $uri/ /index.php;  
   }  
   location ~* .php$ {       
      fastcgi_split_path_info ^(.+?.php)(/.*)$;       
      if (!-f $document_root$fastcgi_script_name) {return 404;}       
      fastcgi_pass  unix:/run/php/php7.2-fpm.sock;       
      fastcgi_index index.php;       
      include fastcgi_params;       
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
   }
}

15 - On va créer le certificat Letsencrypt et laisser certbot configurer le fichier Nginx pour nous :

# certbot --nginx -d mail.example.com
On renseigne premièrement l'adresse e-mail à laquelle les alerte de renouvellement de certificat seront envoyées.
Puis on accepte les "Termes du service" : A
Je réponds ensuite NON (n) pour partager mon adresse e-mail.
Enfin, je choisis la réponse 2 (Redirect) afin que toutes les requêtes soient redirigées en HTTPS automatiquement.

16 - Ouvrez votre fichier /etc/nginx/conf.d/mail.example.com.conf et ajoutez http2 comme ceci :
../..
    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
../..
 ... et on redémarre Nginx :
# service nginx restart
 

####### POSTFIX & DOVECOT #######

17 - Les paquets Dovecot chez Ubuntu ne sont pas à jour.
On va donc installer Dovecot depuis le répertoire Dovecot Community afin de tirer avantages, notamment, du module imap_sieve :
# wget -O- https://repo.dovecot.org/DOVECOT-REPO-GPG | sudo apt-key add -
# echo "deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/$(lsb_release -cs) $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/dovecot.list
# apt update
# debconf-set-selections <<< "postfix postfix/mailname string $(hostname -f)"
# debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'"
# apt install postfix postfix-mysql dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-mysql

18 - Configuration de Postfix
# mkdir -p /etc/postfix/sql
[* : vous veillerez à changer P4ssvv0rD par votre VRAI mot de passe]
# nano /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
 
# nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
 
# nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = postfixadmin
password = P4ssvv0rD
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

Puis on complète la configuration du fichier main.cf de Postfix :
# postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
# postconf -e "virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
# postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"

# postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
# postconf -e 'smtp_tls_security_level = may'
# postconf -e 'smtpd_tls_security_level = may'
# postconf -e 'smtp_tls_note_starttls_offer = yes'
# postconf -e 'smtpd_tls_loglevel = 1'
# postconf -e 'smtpd_tls_received_header = yes'
 
# postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.exampple.com/fullchain.pem'
# postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem'
 
# postconf -e 'smtpd_sasl_type = dovecot'
# postconf -e 'smtpd_sasl_path = private/auth'
# postconf -e 'smtpd_sasl_local_domain ='
# postconf -e 'smtpd_sasl_security_options = noanonymous'
# postconf -e 'broken_sasl_auth_clients = yes'
# postconf -e 'smtpd_sasl_auth_enable = yes'
# postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'

On configure le fichier master.cf de Postfix afin qu'il ressemble à ça :
submission inet n       -       y       -       -       smtpd 
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       y       -       -       smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

... et on redémarre Postfix :
# service postfix restart

####### DOVECOT CONFIG #######

19 - On va configurer Dovecot :
[* : veillez à bien changer "your_secret_password" par votre VRAI mot de passe]
# nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
default_pass_scheme = MD5-CRYPT
iterate_query = SELECT username AS user FROM mailbox
user_query = SELECT CONCAT('/var/mail/vmail/',maildir) AS home,   CONCAT('maildir:/var/mail/vmail/',maildir) AS mail,   5000 AS uid, 5000 AS gid, CONCAT('*:bytes=',quota) AS quota_rule   FROM mailbox WHERE username = '%u' AND active = 1
password_query = SELECT username AS user,password FROM mailbox   WHERE username = '%u' AND active='1'
 
# nano /etc/dovecot/conf.d/10-mail.conf
...
mail_location = maildir:/var/mail/vmail/%d/%n
...
mail_uid = vmail
mail_gid = vmail

...
first_valid_uid = 5000
last_valid_uid = 5000

...
mail_privileged_group = mail
...
mail_plugins = quota
...
 
# nano /etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...

# nano /etc/dovecot/conf.d/10-master.conf
...
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
...
}
...
service auth {
  ...
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
  ...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  ...
}
...

service auth-worker {
  user = vmail
}

...

service dict {
  unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
}
...

# nano /etc/dovecot/conf.d/10-ssl.conf
...
ssl = yes
...
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_dh = </etc/letsencrypt/ssl-dhparams.pem
...
ssl_cipher_list = EECDH+AES:EDH+AES+aRSA
...
ssl_prefer_server_ciphers = yes
...
 
# nano /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...

  mail_plugins = $mail_plugins imap_quota
  ...
}
...

 # nano /etc/dovecot/conf.d/20-lmtp.conf
...
protocol imap {
  postmaster_address = postmaster@example.com
  mail_plugins = $mail_plugins
}
...

# nano /etc/dovecot/conf.d/15-mailboxes.conf
...
mailbox Drafts {
  special_use = Drafts
}
mailbox Spam {
  special_use = Junk
  auto = subscribe
}
mailbox Junk {
  special_use = Junk
}
...
 
# nano /etc/dovecot/conf.d/90-quota.conf
plugin {
quota = dict:User quota::proxy::sqlquota
quota_rule = *:storage=5GB
quota_rule2 = Trash:storage=+100M
quota_grace = 10%%
quota_exceeded_message = Quota exceeded, please contact your system administrator.
}

plugin {
quota_warning = storage=100%% quota-warning 100 %u
quota_warning2 = storage=95%% quota-warning 95 %u
quota_warning3 = storage=90%% quota-warning 90 %u
quota_warning4 = storage=85%% quota-warning 85 %u
}

service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail

unix_listener quota-warning {
  group = vmail
  mode = 0660
  user = vmail
}
}

dict {
sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
 [* : veillez à bien changer your_secret_password par votre VRAI mot de passe !]
# nano /etc/dovecot/dovecot-dict-sql.conf.ext
...
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
...
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}
...
# map {
#   pattern = shared/expire/$user/$mailbox
#   table = expires
#   value_field = expire_stamp
#
#   fields {
#     username = $user
#     mailbox = $mailbox
#   }
# }
...

# nano /usr/local/bin/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=dict:User quota::noenforcing:proxy::sqlquota"
From: postmaster@example.com
Subject: Quota warning

Your mailbox is $PERCENT% full. Don't forget to make a backup of old messages to remain able to receive mails.
EOF

# sudo chmod +x /usr/local/bin/quota-warning.sh
... et on redémarre Dovecot :
# service dovecot restart

####### RSPAMD #######

20 - On commence par installer redis-server :
# apt install redis-server

21 - Puis on installe Rspamd :
# apt install software-properties-common lsb-release
# apt install lsb-release wget
# wget -O- https://rspamd.com/apt-stable/gpg.key | sudo apt-key add -
# echo "deb http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/rspamd.listsudo
# apt update
# apt install rspamd

22 - On va configurer Rspamd :
# nano /etc/rspamd/local.d/worker-normal.inc
bind_socket = "127.0.0.1:11333";

# nano /etc/rspamd/local.d/worker-proxy.inc
bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

Il faut créer un mot de passe pour l'interface web de Rspamd :
# rspamadm pw --encrypt -p P4ssvv0rD
Notez bien la clé qui va s'afficher. Elle ressemblera à ça :
$2$khz7u8nxgopsfay3qta7ousbnmi19kew$zdat4nsm7nd3ctmiigx9kjyo111hcjodn1bob5jaxt7wpkieoc5b

# nano /etc/rspamd/local.d/worker-controller.inc
password = "CLE_GENEREE_PLUS_HAUT"
Puis on con tinue la configuration :
# nano /etc/rspamd/local.d/classifier-bayes.conf
servers = "127.0.0.1";
backend = "redis";

# nano /etc/rspamd/local.d/milter_headers.conf
use = ["x-spamd-bar", "x-spam-level", "authentication-results"];

On rédémarre Rspamd :
# systemctl restart rspamd

23 - On va configurer Nginx pour l'interface web de Rspamd :

# nano /etc/nginx/conf.d/spam.example.com.conf
server {
listen 80; 
listen [::]:80; 
server_name spam.example.com

location / { 
proxy_pass http://127.0.0.1:11334/;    
proxy_set_header Host $host;    
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    


}
On va demander et installer un certificat Lets'encrypt :
# certbot --nginx -d spam.example.com

24 - On va terminer la configuration de Postfix on intégrant les paramètres pour Rspamd :
# postconf -e "milter_protocol = 6"
# postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
# postconf -e "milter_default_action = accept"
# postconf -e "smtpd_milters = inet:127.0.0.1:11332"
# postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
... et on redémarre Postfix :
# systemctl restart postfix

####### DOVECOT 2 #######

25 - On termine la config de Dovecot en intégrant le module Sieve pour filtrer les mails
# apt install dovecot-sieve dovecot-managesieved

# nano /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
postmaster_address = postmaster@example.com
mail_plugins = $mail_plugins sieve
}

# nano /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...
mail_plugins = $mail_plugins imap_quota imap_sieve
...
}
...

# nano /etc/dovecot/conf.d/20-managesieve.conf
...
service managesieve-login {
inet_listener sieve {
port = 4190 
}
...
}
..

service managesieve {
process_limit = 1024
}
...

# nano /etc/dovecot/conf.d/90-sieve.conf
plugin {
... 
# sieve = file:~/sieve;active=~/.dovecot.sieve 
sieve_plugins = sieve_imapsieve sieve_extprograms 
sieve_before = /var/mail/vmail/sieve/global/spam-global.sieve 
sieve = file:/var/mail/vmail/sieve/%d/%n/scripts;active=/var/mail/vmail/sieve/%d/%n/active-script.sieve 

imapsieve_mailbox1_name = Spam 
imapsieve_mailbox1_causes = COPY 
imapsieve_mailbox1_before = file:/var/mail/vmail/sieve/global/report-spam.sieve 

imapsieve_mailbox2_name = * 
imapsieve_mailbox2_from = Spam 
imapsieve_mailbox2_causes = COPY 
imapsieve_mailbox2_before = file:/var/mail/vmail/sieve/global/report-ham.sieve 

sieve_pipe_bin_dir = /usr/bin 
sieve_global_extensions = +vnd.dovecot.pipe 
.... 
}

26 - Puis on crée un répertoire qui va accueillir les scripts Sieve:
# mkdir -p /var/mail/vmail/sieve/global

# nano /var/mail/vmail/sieve/global/spam-global.sieve
require ["fileinto","mailbox"];

if anyof(
header :contains ["X-Spam-Flag"] "YES", 
header :contains ["X-Spam"] "Yes", 
header :contains ["Subject"] "*** SPAM ***" 

{
fileinto :create "Spam"; 
stop; 
}

# nano /var/mail/vmail/sieve/global/report-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

# nano /var/mail/vmail/sieve/global/report-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];
... et on redémarre Dovecot :
# systemctl restart dovecot

Il faut maintenant compiler les scripts Sieve et appliquer les bons droits :
# sievec /var/mail/vmail/sieve/global/spam-global.sieve
# sievec /var/mail/vmail/sieve/global/report-spam.sieve
# sievec /var/mail/vmail/sieve/global/report-ham.sieve
# chown -R vmail: /var/mail/vmail/sieve/

####### DKIM #######

27 - Dkim
DomainKeys Identified Mail (DKIM) est une méthode d'authentification par courrier électronique qui ajoute une signature cryptographique aux en-têtes des messages sortants.
Il permet au destinataire de vérifier qu'un courrier électronique prétendant provenir d'un domaine spécifique a bien été autorisé par le propriétaire de ce domaine.
Le but principal de cette opération est d'empêcher les messages électroniques falsifiés.

On peut avoir différentes clés DKIM pour tous les domaines et même plusieurs clés pour un seul domaine, mais pour simplifier cet article, nous allons utiliser une seule clé DKIM qui pourra ultérieurement être utilisée pour tous les nouveaux domaines.

On va créer un répertoire afin d'accueillir les clés Dkim :
# mkdir /var/lib/rspamd/dkim/
Et on va créer la clé Dkim :
# rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail.key /var/lib/rspamd/dkim/mail.pub
Dans cet exemple, on utilise "mail" comme sélecteur Dkim.
On applique les bonnes permissions :
# chown -R _rspamd: /var/lib/rspamd/dkim
# chmod 440 /var/lib/rspamd/dkim/*
On va enseuite "dire" à Rspamd de regarder au bon endroit pour les clés Dkim :
# nano /etc/rspamd/local.d/dkim_signing.conf
selector = "mail";
path = "/var/lib/rspamd/dkim/$selector.key";
allow_username_mismatch = true;
Rspamd prend également en charge la signature ARC (Authenticated Received Chain). Rspamd utilise le module dkim pour traiter les signatures ARC afin que nous puissions simplement copier la configuration précédente :
# cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
... et on redémarre Rspamd :
# systemctl restart rspamd

####### DNS #######

28 - Vous devez aussi configurer vos DNS.
N'oubliez pas de configurer :
- une entrée MX (serveur de mail) :
Exemple : domain.com. MX 10 mail.s2ii.xyz.   
- une entrée SPF
Exemple : domain.com. TXT "v=spf1 a mx ~all"   
- une entrée _dmarc
Exemple : _dmarc.domain.com. TXT "v=DMARC1; p=none; adkim=r; aspf=r;"    
- une entrée Dkim

Vous trouverez la clé publique Dkim ici :
# cat /var/lib/rspamd/dkim/mail.pub
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdBRCqYzshc4LmmkxUkCH/rcIpSe/QdNIVmBrgqZmZ5zzWQi7ShdFOH7V32/VM1VRk2pkjDV7tmfbwslsymsfxgGhVHbU0R3803uRfxAiT2mYu1hCc9351YpZF4WnrdoA3BT5juS3YUo5LsDxvZCxISnep8VqVSAZOmt8wFsZKBXiIjWuoI6XnWrzsAfoaeGaVuUZBmi4ZTg0O4yl"  
"nVlIz11McdZTRe1FlONOzO7ZkQFb7O6ogFepWLsM9tYJ38TFPteqyO3XBjxHzp1AT0UvsPcauDoeHUXgqbxU7udG1t05f6ab5h/Kih+jisgHHF4ZFK3qRtawhWlA9DtS35DlwIDAQAB"  
) ;
[* ceci est un exemple, n'oubliez pas d'adapter cette config avec votre VRAIE config]

####### RAINLOOP WEBMAIL #######

29 - On télécharge Rainloop :
cd /tmp
wget http://www.rainloop.net/repository/webmail/rainloop-community-latest.zip

# mkdir /var/www/webmail
# unzip rainloop-community-latest.zip -d /var/www/webmail
# chown -R www-data:www-data /var/www/webmail

30 - On crée le fichier Nginx pour Rainloop webmail :
# nano /etc/nginx/conf.d/webmail.example.com.conf
server {
listen 80; 
listen [::]:80; 
root /var/www/webmail; 
index index.php index.html index.htm;  
server_name webmail.example.com

client_max_body_size 100M; 

location / { 
try_files $uri $uri/ /index.php?$query_string; 
}      

location ~ .php$ { 
include snippets/fastcgi-php.conf;      
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;      
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;      
include fastcgi_params;      


location ^~ /data {  
deny all;      
}   

}

31 - On crée et on installe un certificat Letsencrypt HTTPS :

# certbot --nginx -d webmail.example.com

32 - ET VOILA... ou presque. La configuration "technique" est terminée.
Reste à configurer les noms de domaines et les boites mail dans Postfixadmin : https://mail.example.com
Je n’explique pas cette partie. Vous pourrez trouver plein d'exemples sur le net.

33 - Connection
Une fois tous les domaines et les boites mail configurées dans Postfixadmin, on va pouvoir se connecter sur l'interface d'admin de Rainloop à cette adresse : https://webmail.example.com/?admin afin de configurer les domaines.
Par défaut, le login est admin et le mot de passe 12345
Il vous suffira de changer le mot de passe après.
Une fois connecté à l'admin -- Onglet Domaine, Ajouter un domaine>

A - IMAP + SMTP
Partie IMAP
Serveur : mail.example.com
Sécurité : SSL/TLS
Port : 993

Partie SMTP

Serveur : mail.example.com
Sécurité : STARTTLS
Port : 587


Cliquez sur TEST, en bas à gauche de la fenêtre. Si TEST devient vert, la config est OK, si TEST devient rouge, il y a un truc qui cloche !

B - SIEVE

Cliquez sur configuration sieve (beta)
Cochez : Autoriser les scripts Sieve ET Autoriser les scripts personnels

Partie SIEVE
Serveur : mail.example.com
Sécurité : STARTTLS
Port : 4190

Partie SMTP

Serveur : mail.example.com
Sécurité : STARTTLS
Port : 587
 
Cliquez enfin sur Modifier.
 


Refaite cette même configuration pour chaque domaine que vous allez utiliser !

34 - L'interface du webmail étant elle située ici : https://webmail.example.com


[UPDATE] : pour activer l'auto learn (apprentissage) de Rspamd, créez le fichier suivant :
# nano /etc/rspamd/override.d/classifier-bayes.conf
autolearn = true;
Redémarrez Rspamd :
systemctl restart rspamd
CitizenZ : Geek quadra nivernais
fan d'ovalie, de musique, de linuxeries et de Net !

À lire également

70 commentaires

#1  - simplet a dit :

thunderbird sent le gaz ?

Répondre
#2  - citizenz a dit :

@simplet You make my day ! big_smile

Répondre
#3  - citizenz a dit :

LOL !:lol:
Dans cet article je parle d'une config avec un webmail, rien ne vous empêche d'utiliser Thunderbird ou n'importe quelle autre appli Mail ou webmail ! wink

Répondre
#4  - Mens a dit :

Super travail, merci !

Répondre
#5  - Albirew a dit :

Tiens, coïncidence, je viens de mettre en place approximativement la même chose via une image docker (poste.io)

Répondre
#6  - citizenz a dit :

@Albirew : oui ... y'a Mailcow (https://mailcow.email/) dans le genre aussi.

Répondre
#7  - Heres a dit :

Perso, j'ai déjà mis en place ce type de config, mais j'ai préféré un Ldap au mysql
je trouve çà plus cohérent.

Répondre
#8  - antanof a dit :

cool, merci pour le partage de connaissance.
A tout hasard, quelle direction prendre pour greffer un serveur jmap ?

Répondre
#9  - citizenz a dit :

Désolé, je ne connais pas du tout jmap...

Répondre
#10  - antanof a dit :

et tu feras gaffe il y a une boulette dans la commande d'install du repo rspamd, tu as mis un - avant la commande echo

Répondre
#11  - citizenz a dit :

@antanof Oups ! Merci !
Corrigé !!! cool

Répondre
#12  - genpashiro a dit :

j'ai une machine chez moi qui me sert de serveur dont un serveur web mais sous apache sad

du coup ce tuto est à reprendre en remplaçant nginx par apache sad

Répondre
#13  - yglooz a dit :

En alternative, il y a le projet mailu qui permet de créer un serveur mail complet au travers d'une stack docker-compose:
https://mailu.io/1.7/

Répondre
#14  - citizenz a dit :

@genpashiro
# service apache2 stop
# update-rc.d -f apache2 remove
# apt install nginx
# apt install php7.2-fpm
Et voila !

Répondre
#15  - genpashiro a dit :

Sauf que j'ai déjà installé installé nextcloud la roll

Mais bon ton tuto m'inspire dans le sens où installer un serveur mail est pas si insurmontable que ça cool

Répondre
#16  - citizenz a dit :

Ouais ! cool J'ai un peu galéré avant de trouver "la bonne formule" et je voulais intégrer Rspamd plutôt que spamassassin que je trouve "vieillissant".
Il serait d'ailleurs plutôt sympa de faire de ce tuto un script d'installation... Mais là, je suis sec hmm

Répondre
#17  - antanof a dit :

de rien,
il manque un
echo "192.168.0.102 domain.com mail.domain.com" >> /etc/hosts
pour ne pas avoir d'erreur au moment de l'ajout du domaine dans rainloop

Répondre
#18  - citizenz a dit :

@antanof
Je n'ai pas eu d'erreur.
Mon /etc/hosts (xxx.xxx.xxx.xxx = IP externe du serveur) :
127.0.0.1 localhost.localdomain localhost
xxx.xxx.xxx.xxx mail.domain.com mail

et mon /etc/hostname :
mail.domain.com

Répondre
#19  - citizenz a dit :

Quelqu'un aurait-il la possibilité / temps / compétences / motivation / etc. de faire un script d'install (shell/bash) avec ce tuto ?
Je pense que ca pourrait être... utile !

Répondre
#20  - Nathanaelh a dit :

Très intéressant cet article. D'autant plus que j'ai mon serveur de mails avec yunohost donc avec une architecture très similaire : nginx, rainloop, dovecot, postfix, rspamd ; mais que je n'ai pas mise en place autant manuellement (le principe de yunohost étant de faciliter, automatiser plein de choses)

Répondre
#21  - hivanui a dit :

stream_socket_client(): unable to connect to ssl://imaps.domain.fr:993 (Connection refused)
Pourtant j'ai essayé le tuto plusieurs fois sur un VPS et une VM je ne comprends pas pourquoi ça bloque

Répondre
#22  - Shar0w_ a dit :

Salut, j'ai la même erreur.
Tu as trouvé depuis tout ce temps ?

Répondre
#23  - jb01 a dit :

Hello,
Merci pour ce tuto que je suis en train de suite. Par contre je bloque sur l'étape 25/26 , quand je lance la premiere commande sievec /var/mail/vmail/sieve/global/spam-global.sieve j'ai un message d'erreur :

doveconf: Fatal: Error in configuration file /etc/dovecot/conf.d/90-quota.conf line 72: Section not allowed here

apparemment c'est la partie suivante qui pause soucis mais je ne vois pas ou ?!

72 service quota-warning {
73 executable = script /usr/local/bin/quota-warning.sh
74 user = vmail
75
76 unix_listener quota-warning {
77 group = vmail
78 mode = 0660
79 user = vmail
80 }
81 }

Répondre
#24  - citizenz a dit :

@jb01,
Je suis un peu embeté pour te répondre car je ne vois pas trop là... Cette signifierait que le code n'est pas à la bonne place...
Je chercher et te redit si je trouve.
N'hésite pas à revenir ici si tu as une réponse wink

Répondre
#25  - jb01 a dit :

Je vais réessayer l'installation complète. Je n'ai pas sauvegardé les fichiers originaux malheureusement et je suis bloqué avec cette erreur quand bien même je place les éléments à différents endroits...

Répondre
#26  - citizenz a dit :

@jb01 as-tu bien la dernière version de Dovecot et non pas la version des paquets Ubuntu qui n'est plus à jour ?

Répondre
#27  - Silverscott a dit :

Hello CitizenZ,

Super job ton tuto, sincèrement. Par contre je rencontre un souci à l'étape 11, quand je lance la commande "sudo -u www-data php /var/www/postfixadmin/public/upgrade.php" en tant que root j'ai le droit à un retour :
"PHP Parse error: syntax error, unexpected '$CONF' (T_VARIABLE) in /var/www/postfixadmin/config.inc.php on line 129"

J'ai cherché sur internet avec ce msg d'erreur mais c'est un peu le bin's... la ligne 129 corresponds à ça dans le fichier en question :
$CONF['database_prefix'] = '';
et si je la met en commentaire c'est la ligne 130 qui est précisé dans le message d'erreur... Bref

Need help please smile

Répondre
#28  - citizenz a dit :

salut @Silverscott
Tu as certainement un soucis à cette ligne ou la ligne d'avant. Cherche bien si tu n'as pas oublié/effacé une guillemet simple, un point-virgule, etc. ---> d'où le "syntax error, unexpected '$CONF' (T_VARIABLE)"

Répondre
#29  - Silverscott a dit :

Salut Citizenz,
Merci de ta réponse si rapide je suis pas habitué !!! Quand je vais sur les fofo dédiés Postfix ou les channels irc faut attendre trois ou quatre jours avant d'avoir une réponse smile

Bref donc pour résumer je suis sous Debian 10 Buster et ma version de Dovecot c'est celle du dépôt Buster soit "dovecot-core/stable,stable,now 1:2.3.4.1-5+deb10u1 amd64".

Pour ce qui est de la possible erreur de syntaxe je viens de retélecharger PostfixAdmin v3.2 pour remettre le fichier tout neuf et la plus de souci j'ai pu terminer ton tuto jusqu'au bout. J'ai néanmoins un souci de conf Nginx car toutes hormis mon site principale (Diaspora) les appli web ne marchent pas. D'ailleurs la seule qui fonctionne c'est Rsapamd (spam.mondomaine.net). Postfixadmin j'ai un Access denied, et les autres une erreur 502.Bad Gateway. Il te manque un petit forum pour le sav de tes tutos big_smile

Répondre
#30  - citizenz a dit :

@Silverscott ok big_smile
Le tuto ici est basé sur Ubuntu 18.04... il peut y avoir certaines variantes (même faibles) avec Debian 10 Buster.
Pour Dovecot, je confirme qu'il te faut une version du dépôt officiel repo.dovecot.org (les paquets Ubuntu ou Debian ne sont pas assez récents).
Pour Nginx, il faut effectivement vérifier chaque fichier vhost et adapter sinon ca risque de poser problème.
Vérifie également chez ton registrar (nom de domaine) que ta zone DNS soit bien configurée...
Si tu veux, tu peux me mettre plus d'infos ou carrément les fichiers nginx complets sur https://framabin.org/p/ et je regarderai...

Répondre
#31  - Silversscott a dit :

Salut Citizenz smile

Sur tes conseils je viens d'upgrader Dovecot de la v2.3.4.1 vers la dernière version 2.3.9.2 en suivant la page officielle : https://repo.dovecot.org/ puis j'ai refais toute le chapitre 19 de ton tuto (19 - On va configurer Dovecot ) et le chapitre 25 (On termine la config de Dovecot en intégrant le module Sieve).

Alors pour commencer je vais expliquer le projet dans sa globalité. J'ai acheté le nom de domaine "dicespora.net" ainsi qu'un forfait VPS chez ionos 1&1 pour l'heberger.
Sur ce domaine j'ai installé un pod du réseau social Diaspora*. J'ai galéré deux bonnes semaines pour faire fonctionner mon Pod mais il fonctionne ! Il tourne donc sur Debian 10 propulsé par Nginx / MySQL / PHP / Ruby on Rails.
L'objectif de ce projet il est avant tout de m'autoformer sous Linux car j'adore ce Système. Pour info je travail dans les télécom (support réseau) et j'ai 48ans smile

Bref le souci de Diaspora* c'est qu'il a besoin de communiquer et d'envoyer des mails à ceux qui s'inscrivent (ne serait ce que pour valider par mail leur inscription). Donc besoin d'installer un MTA/MDA.
Ton tuto arrives donc à point car il est super complet. Il juste fallu que je l'adapte pour Debian 10 "Buster". Mais quand tout fonctionnera je pourrais te proposer de rédiger ton tuto adapté pour Debian smile

J'ai donc suivi ton tuto à la lettre mais j'ai plusieurs soucis, histoire de pas tout mélanger je vais te rediriger vers un lien Pastebin avec le plus de détails possible. Voici donc le premier problème à résoudre :

1/ La Messagerie ! (https://pastebin.com/8Se0E4kS)
2/ Les sous domaines qui me retournent des erreurs (https://pastebin.com/fn5z6sTx)

Tree de mon dossier Nginx ---> https://pastebin.com/pDjmj48r

Bon quand ces deux problèmes auront été corrigé... ça ira beaucoup mieux smile
En tout cas je me répète sans doute mais merci de ton aide wink

Au passage j'ai relevé deux trois coquilles dans ton tuto ---> https://pastebin.com/WB6ZpChy
Au plaisir de te lire.

Scott

Répondre
#32  - Ragnaros a dit :

Salut !

Je voulais pour la configuration des DNS (au début avec par exemple example.com, mail.example.com,spam.example.com) comment j'adapte ça et vers quoi ? ^^

Répondre
#33  - Ragnaros a dit :

Je veux savoir plus clairement comment je peux configurer ma zone DNS (sur OVH) et l'adapter avec les différentes adresses : spam.example.com , example.com, postmaster@example.com , mail.example.com ...)

Merci pour ta réponse .

Répondre
#34  - Silverscott a dit :

@Ragnaros

Hello, dans la partie paramétrage de ton compte ovh il doit y avoir une section réservée au paramétrage de ta zone DNS. Dans cette zone (un formulaire la plus part du temps ou un champs ressemblant à un bloc note) tu devras enregistrer tes entrées DNS (A, CNAME, MX, etc...) je te t'invite à jeter un oeil à cette page : https://documentation.online.net/fr/web/domain-name/tutorial/dns-zone-management

Répondre
#35  - Ragnaros a dit :

Effectivement,

Mais par exemple j'ai configuré mes adresses vers mon serveur scaleway mais pour les adresses spam.example.com et postmaster@example.com et mail.example.com je ne sais pas vers quoi les configurer dans ma zone DNS .
Comment je peux faire ça ? ^^

Merci pour ton aide

Répondre
#36  - Silverscott a dit :

@Ragnaros
Je pense que ça sort complètement du contexte de ce tutorial.

@Citizenz
Plus la pour m'aider ?

Répondre
#37  - citizenz a dit :

Salut,
Désolé : malade et plus de boulot... c'est chaud en ce moment hmm
Donc j'ai mis un mot sur la page d'accueil du site

Concernant les soucis cités plus haut :
---> coquilles à corriger 1 (rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail.key /var/lib/rspamd/dkim/mail.pub>) ---> j'ai enlevé le >
---> coquilles à corriger 2 : j'ai bien un fichier .pub ET un fichier .key
root@mail:/var/lib/rspamd/dkim# ls
mail.key mail.pub

Pour le reste, franchement, ca dépend de beaucoup de facteurs...
Pour Nginx : je mets sur pastebin mes fichiers nginx
mon webmail : fichier nginx : https://pastebin.com/1ScBxy8x
mon site rspamd : https://pastebin.com/wWDRwbfH
mon site postfixadmin : https://pastebin.com/QmPvD4TJ

Pour le reste, j'ai pas de réponse à apporter... là... ici...maintenant big_smile

Répondre
#38  - Ragnaros a dit :

Bonsoir,

J'avais une question pour : configurer les noms de domaines et les boites mail dans Postfixadmin des tutos à me fournir ^^ ?

Cordialement,

Répondre
#39  - citizenz a dit :

@Ragnaros
Salut,
Tu peux regarder ici --> http://postfixadmin.sourceforge.net/screenshots/ et le reste de la doc est assez bien faite...
En gros :
1/ Liste des domaines / Ajouter un domaine : on ajoute le nom du domaine (example.com) dans la case domaine et on laisse tout par défaut
2/ Puis : Liste des virtuels / Ajouter un compte courriel :
-->Nom d'utilisateur : contact
-->On sélectionne le domaine dans la liste
-->On rentre un mot de passe (+ confirmation)
-->On peut mettre un nom (ca affichera par la suite le nom de celui envoie le mail... pas obligatoire)
-->On vérifie que actif est bien coché
-->Envoyer le message de bienvenue est facultatif mais peut etre utile pour vérifier que tout fonctionne bien
-->On valide par Ajouter un compte courriel
Je n'ai pas parler des quotas par domaine et par compte courriel qui sont évidemment configurable.

Tout cela ne fonctionnera que si la zone DNS chez le registrar est bien configurée, avec notamment une zone MX...

Répondre
#40  - Ragnaros a dit :

Salut,

Le message de bienvenue ne s'envoie pas hmm mais l'utilisateur se créé bien serait-tu pourquoi ?

Cordialement et merci de ton aide ^^

Répondre
#41  - Ragnaros a dit :

Même en essayant sur rainloop un test avec gmail ça me met : unable to connect to tcp://smtp.gmail.com:587 (connection timed out) mais le imap est OK

Excuse-moi de t'embêter avec ça ^^

Répondre
#42  - citizenz a dit :

"Le message de bienvenue ne s'envoie pas" : il y a beaucoup de facteurs qui peuvent causer cela : problème de firewall ? de DNS ? de configuration ? ... il faudrait regarder dans les logs pour voir les erreurs... Ca en dirait + long !

Je pense que pour gmail c'est :
ssl://smtp.gmail.com:465
De plus, avec Gmail (quelle idée ?!!), tu as besoin d'aller configurer ton compte Gmail afin qu'il "laisse passer" ce type de messages "extérieurs" (https://support.google.com/a/answer/6260879?hl=fr)

Répondre
#43  - Djouls a dit :

Hello,
Merci pour ce tuto, je m'en suis largement inspiré pour installer et configurer mon serveur de mail.

Juste une question, j'arrivais bien à envoyer des mails de :
- serveur local vers serveur local
- serveur local vers serveur distant

Par contre ce qui ne marchait pas était :
- serveur distant vers serveur local => et je recevait par la suite un mail delivery system : connection refused sur le port 25.

En effet, mon serveur n'écoutait pas sur ce port.
Dans mon mail.cf
Je n'avais que les parties submission et smtps qui étaient décommentées.
En décommentant :
smtp inet n - y - - smtpd

mon serveur écoute ce coup-ci aussi bien sur le port 25 et je réussis à faire marcher mail_serveur_distant vers mail_serveur_local.

Par contre j'ai peur en faisant ça d'avoir bypassé plein de choses. Fallait-il bien le faire ou mon problème se situait-il autre part?

Répondre
#44  - citizenz a dit :

Salut @Djouls
L'idée dans le tuto est de ne pas passer par le port 25 (SMTP) mais plutôt par submission (port 587) voire SMTPS (465). On utilise ainsi TLS ou SSL pour "sécuriser" les connexions.
Dans ma config :
smtp inet n - y - - smtpd
...est ouvert et ne devrait pas être commenté... (port 25... que je n'utilise pas)
Essaie de vérifier si ton serveur SMTP écoute bien sur les ports 587 et 465...
Après si ton serveur fonctionne, pas de soucis mais l'idée était de configurer des connexions plus "sécurisées"...

Dans Rainloop (webmail), pour chaque domaine configuré, j'ai :
IMAP --> serveur : mail.s2ii.xyz (mon serveur mail SMTP + IMAP) --> port 993 (SSL/TLS)
SMTP --> serveur : mail.s2ii.xyz (mon serveur mail SMTP + IMAP) --> port 587 (STARTTLS)

Et pour la configuration Sieve :
Autoriser les scripts Sieve (coché)
serveur : mail.s2ii.xyz
Port : 4190
Sécurité : STARTTLS

Répondre
#45  - Ragnaros a dit :

Salut,

J'avais concernant le configuration du "hostname" est qu'il y a quelques choses à faire de particulier ?

Merci encore !

Répondre
#46  - Ragnaros a dit :

Salut,

Alors j'ai des bonnes nouvelles, l'email s'envoie bien mais maintenant j'ai un problème lorsque je veux ajouter mon domaine (perso mail) à rainloop , pour imap : negativeresponseexception (imapclient.php~1876) et pour smtp : unable to connect tcp://mail.example.com:587 (connection timed out)

Répondre
#47  - citizenz a dit :

@Ragnaros
Hummmm....
Pour les deux erreurs, cela semble venir du fait que quelque chose "bloque" (les ports ne sont pas ouverts, pas joignables, ...) :
- firewall ?
- routeur ?
- ...
C'est bien le non nom de domaine ? (et pas example.com) ... rigole pas, j'ai cherché 3 plombes une fois parceque j'avais laissé example.com dans la config...

Répondre
#48  - citizenz a dit :

@Ragnaros
Concernant le host name, ca peut être très important (tout comme le /etc/hosts) :
Pour le hostname j'ai dans /etc/hostname :
mail.s2ii.xyz
Je mets toujours le fqdn (full qualified domain name)
Pour /etc/hosts :
127.0.0.1 localhost.localdomain localhost
xxx.xxx.xxx.xxx mail.s2ii.xyz mail

xxx.xxx.xxx.xxx ---> étant bien sur l'adresse IP publique du serveur

Répondre
#49  - citizenz a dit :

Je viens juste de créer un salon Discord.
Ca serait certainement plus simple pour discuter de tout ça...
Sans emploi actuellement, ça me laisse un peu plus de temps... un peu.
C'est ici : https://discord.gg/neVZtE3

Répondre
#50  - vlp a dit :

J'ai pas lu tous les commentaires donc c'est déjà peut-être remonté mais t'as une typo ici:

quota = dict:User
quota::proxy::sqlquota

Il y a pas de retour à la ligne !

A+

vlp

Répondre
#51  - citizenz a dit :

@vlp MERCI !!!!!
Corrigé !

Répondre
#52  - stcryogen a dit :

Salut, merci pour ce tuto,
Juste une petite chose, dans /etc/dovecot/conf.d/15-mailboxes.conf, tu es certain que ce n'est pas:
special_use = Drafts, special_use = Junk
au lieu de: special_use = Drafts, special_use = Junk
?
Parce que sinon, il m’envoie bouler lors de la compil des scripts Sieve.

Répondre
#53  - stcryogen a dit :

Ok, je viens de comprendre en postant ce petit message.
Les anti-slaches ne sont pas affichés par le site.

Répondre
#54  - stcryogen a dit :

Sur Debian 10, pour la clef Dkim, je n'avais pas non plus les deux fichiers.
Cela s'est résolu avec des sh -c:
mkdir /var/lib/rspamd/dkim
sh -c 'rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail.key > /var/lib/rspamd/dkim/mail.pub'
chown -R _rspamd: /var/lib/rspamd/dkim
sh -c 'chmod 440 /var/lib/rspamd/dkim/*'

Si cela peut aider...

Répondre
#55  - Ludo a dit :

Bonjour Citizen,

Tout d'abord, merci pour ce super tutoriel, complet, et qui permet de configurer un "vrai" serveur email en prenant en compte la sécurité (SSL Let'sEncrypt, DKIM, SPF...).

J'ai installé tout jusqu'au bout, mais évidemment, tout ne fonctionne pas du 1er coup. Il faut entrer en mode debug.
Mon Rainloop n'arrive pas à se connecter, ni au SMTP, ni à l'IMAP hmm
Aurais-tu des pistes à me donner pour savoir d'où cela vient ? Je vais chercher les logs, relire ma conf, des fois que j'aurais oublié un petit truc...

J'ai adapté le tuto sur un serveur apache (déjà utilisé par mon site web).

Merci d'avance pour tes lumières smile

Répondre
#56  - Ludo a dit :

J'ai avancé dans mon débug.
Maintenant, les voyants sont au verts dans Rainloop, et j'arrive à envoyer des emails vers l'extérieur en passant les filtres antispam (Jolie note de 8.9/10 sur mail-tester.com).
J'arrive à recevoir des emails en interne (user1@domaine.com reçoit des emails de user2@domaine.com et vice-versa), mais pas depuis des domaines extérieurs (par exemple depuis gmail.com).
J'ai du "RecipientNotFound" ou bien du "the recipient server did not accept our requests to connect" en fonction de mes bricolages.

Any idea où chercher (ports 597 et 993 ouverts côté serveur) ?

Répondre
#57  - citizenz7 a dit :

Salut @Ludo,
note de 8.9/10 sur mail-tester.com --> ca veut dire qu'il y a encore un truc (important) qui coince. Il faudrait regarder exactement les erreurs de mail-tester.com et voir comment corriger cela.
"RecipientNotFound" et "the recipient server did not accept our requests to connect" : ca veut dire qu'il y a des erreurs dans la config Postfix, à mon avis.
Impossible de diagnostiquer quoi que ce soit à ce stade sans autres infos + précises...
Tu dois avoir des logs (/var/logs/mail.info). Ca peut être utile ! big_smile

Répondre
#58  - Ludo a dit :

Salut @Citizenz,

Je vais continuer d'améliorer la note en regardant les points négatifs smile C'est pas trop mal quand même comme note pour le début.

Sinon, j'ai trouvé grâce à de l'aide demandée sur un forum Ubuntu.
Voici la solution : Il a fallu décommenter la ligne :
smtp inet n - y - - smtpd
et ouvrir le port 25 sur le firewall.

J'ai appris que ce port était essentiel pour une communication entre les serveurs, qui passent ensuite en TLS (vérifié dans les logs du serveur).
Du coup, ça fonctionne maintenant. Je pense que j'ai dû louper un truc sur ton tuto.

Maintenant, je vais optimiser et surtout veiller à la sécurité. Aurais-tu des outils à me conseiller pour vérifier que le serveur est bien sécurisé et ne sera pas la cible d'attaques ?

Répondre
#59  - citizenz7 a dit :

Ah oui effectivement ça aide ! big_smile
Bravo !

Répondre
#60  - Almazter a dit :

Salut j'ai fait ton tuto qui est génial et je t'en remercie grandement. Cependant j'ai un petit souci avec la réception de mail. Je reçoit bien en interne mais de l’extérieur les mails n'arrivent pas. j'ai testé avec Outlook & Gmail. J'ai essayé de regarder dans les logs mail.log/err mais rien ne se passe quand j'envoie un mail. Aurais-tu une idée d'où cela peut venir ?

Cordialement,

Répondre
#61  - Almazter a dit :

Petit retour:
J'ai réussi a régler mon souci. dans le fichier "master.cf" j'avais la ligne
smtp inet n - y - - smtpd (qui correspond au port 25 il me semble)
qui était commentée. je l'ai décommentée et ça fonctionne du tonerre.

Merci beaucoup pour ton tuto !

Répondre
#62  - Ludo a dit :

Salut @Citizenz,

J'ai monté un disque additionnel sur mon VPS (pour y monter un Nextcloud), et je me disais "tiens, si on mettait les répertoires contenant les emails sur ce disque pour avoir des boites emails plus conséquentes ? ".

Cependant, en reprenant le tuto, voici tout ce qui se réfère à l'emplacement des emails :

Tu crée un user vmail et met son home dans "/var/mail/vmail", puis tu configure Dovecot comme ça :

1) #Fichier /etc/dovecot/dovecot-sql.conf.ext :

user_query = SELECT CONCAT('/var/mail/vmail/',maildir) AS home, CONCAT('maildir:/var/mail/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=',quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = 1

2) #Fichier /etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:/var/mail/vmail/%d/%n

3) # Fichier /etc/dovecot/conf.d/90-sieve.conf :

plugin {
...
# sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_before = /var/mail/vmail/sieve/global/spam-global.sieve
sieve = file:/var/mail/vmail/sieve/%d/%n/scripts;active=/var/mail/vmail/sieve/%d/%n/active-script.sieve

imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/var/mail/vmail/sieve/global/report-spam.sieve

imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/var/mail/vmail/sieve/global/report-ham.sieve
....
}

Et enfin encore tout ça :

4) # mkdir -p /var/mail/vmail/sieve/global

5) # nano /var/mail/vmail/sieve/global/spam-global.sieve
require ["fileinto","mailbox"];

if anyof(
header :contains ["X-Spam-Flag"] "YES",
header :contains ["X-Spam"] "Yes",
header :contains ["Subject"] "*** SPAM ***"
)
{
fileinto :create "Spam";
stop;
}

6) # nano /var/mail/vmail/sieve/global/report-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

7) # nano /var/mail/vmail/sieve/global/report-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];

# systemctl restart dovecot

8) # sievec /var/mail/vmail/sieve/global/spam-global.sieve
9) # sievec /var/mail/vmail/sieve/global/report-spam.sieve
10) # sievec /var/mail/vmail/sieve/global/report-ham.sieve
11) # chown -R vmail: /var/mail/vmail/sieve/


Donc ma question est : Quels conseils me donnes tu pour que tous les mails ne se stockent plus dans "/var/mail/vmail" mais plutôt dans "/mnt/sdb/vmail" ?
Juste remplacer tous les chemins et recréer les répertoires à l'identique dans les fichiers de conf ?

Je préfère te demander, avant de tout casser ce qui a déjà été fait (serveur en prod).

Merci d'avance pour ton aide.

Répondre
#63  - citizenz a dit :

Salut,
Désolé, je viens juste de voir le message. Période compliquée, je suis en formation smile
Pour ta question la théorie voudrait que OUI, il faut recréer les rep et changer tous les chemins.
Je n'ai pas les moyens de tester.

Répondre
#64  - Shar0w_ a dit :

Salut.

Tout semble fonctionner jusqu'à la configuration du domaine dans RainLoop.
J'obtiens cette erreur pour les serveurs IMAP et SMTP : "stream_socket_client(): unable to connect to ssl://example.com:993 (Connection refused) avec bien évidemment mon domaine à la place de example.com.

Aurais-tu une idée ?
Merci d'avance.

Répondre
#65  - Shar0w_ a dit :

Edit : Dovecot ne se lançait pas au démarrage donc il n'avait pas démarré au reboot de ma machine.
Cependant, j'ai toujours le même problème pour le serveur SMTP hmm

Répondre
#66  - Shar0w_ a dit :

C'est fix, j'avais oublié de décommenter une ligne dans master.cf
Désolé pour le spam.

Répondre
#67  - Eric a dit :

Hello,

J'ai suivi le tuto et tout va bien à un détail près, je n'arrive pas à envoyer de mail depuis rainloop.
l'erreur dans les log est la suivante :

Jul 31 16:56:21 hosting-smtp postfix/smtp[17301]: 12BB75781ABD: to=<system@bol-d-air.net>, relay=vade-in2.mail.dreamhost.com[66.33.205.213]:25, delay=2, delays=0.18/0.03/1.6/0.19, dsn=5.5.2, status=bounced (host vade-in2.mail.dreamhost.com[66.33.205.213] said: 504 5.5.2 <www-data@hosting-smtp>: Sender address rejected: need fully-qualified address (in reply to RCPT TO command))

(le bounce echoue également)

L'erreur semble provenir du fait que l'adresse d'envoi (et de réception du bounce) n'est pas le fqdn
pourtant je l'ai renseigne dans /etc/hostname, et dans /etc/ mailname et dans /etc/hosts, j'ai

94.23.xx.xx hosting-smtp.boldair.network

en revanche, si j'envoie un mail depuis le shell, je n'ai pas d'erreur...

Une idée ?

(j'ai aussi des problème de connexion via thunderbird, liés au certificat SSL, mais c'est un autre problème)

Répondre
#68  - Eric a dit :

Bon, j'ai résolu en fait.

j'ai changé l'ordre de résolution dans /etc/resolv.conf en supprimant le domaine de recherche par défaut et en forçant hosts en premier (sans l'alias court dans /etc/host) et ça passe.

(et pour mon problème de certificat SSL avec Thunderbird, c'était entre la chaise et le clavier, j'avais mis le certificat de rspamd au lieu de celui du serveur, dans la conf ssl de Postfix et dans celle de Dovecot du coup ça répondait moins bien big_smile )

Merci pour le tuto il est précieux, vu l'ampleur de la config à faire pour que tout fonctionne smile

Répondre
#69  - Heaven a dit :

Bonjour à tous et merci pour ce tuto,
Je mets en place un nouveau serveur de messagerie et je suis donc ce tuto.
Tout irait très bien, mais je m'aperçois que ce tuto est prévu pour de l'IMAP.
Hors, l'imap ne sait pas stocker plusieurs comptes dans un même dossier et en plus on est limité en général à 5 Go d'espace.
Ma messagerie en faisant déjà 35 Go, l'Imap n'est pas pour moi.
Je dois donc rester en POP3.
D'où ma question, peut-on adapter ce tuto pour avoir un accès POP et Imap ?
Merci pour vos solutions et très bonne journée.

Répondre
#70  - Eric a dit :

J'ai une question bête :

J'ai un certain nombre d'utilisateurs avec des comptes préexistants en imap... si je veux importer le contenu de leur messagerie dans le nouveau serveur :
- y'a-t-il un outil pour importer mes anciens compte imap vers dovecot dans le nouveau serveur ?
- pour augmenter les quotas (de 5gb à .. beaucoup plus) c'est juste dans '/etc/dovecot/conf.d/90-quota.conf' ou il y'a d'autres endroits à vérifier ?

Répondre

Fil RSS des commentaires de cet article

Écrire un commentaire

 Se rappeler de moi sur ce site
Quelle est la septième lettre du mot 4hw65vlk ?