Serveur email

De Banane Atomic
Aller à la navigationAller à la recherche

Composents d'un serveur email

Mail Transfer Agents

Gère les connexions SMTP entrantes pour la réception des emails et les connexions SMTP sortantes pour l'envoie des emails.

  • fetchmail
  • postfix

Mail Delivery Agents

Déplace les emails de la file MTA vers les boites email.

  • procmail

IMAP et POP3 Serveurs

Gère les connexions IMAP et POP3 entrantes des clients email pour qu'ils accèdent aux boites email.

  • dovecot
  • courier-imap

Ports

25 SMTP

  • Utilisé pour envoyer et recevoir les mails, doit être ouvert en entrée et en sortie sur le serveur
  • Utilisé pour la connexion et pour la transmission d'emails entre serveurs (relay)
  • Doit accepter les connexions anonymes mais ne doit pas les relayer

587 SMTP

  • Utilisé par les clients mail qui se connecte au serveur pour envoyer des mails
  • non-chiffré, mais utilise STARTTLS
  • Doit rejeter les connexions anonymes et relayer les autres

465 Secure SMTP (SSMTP)

  • utilisé par les clients mail qui se connecte au serveur pour envoyer des mails
  • chiffré
  • Doit rejeter les connexions anonymes et relayer les autres

Autres ports d'entrée

  • 110 POP3
  • 995 SSL-POP (encrypted)
  • 143 IMAP
  • 585 Secure IMAP (IMAP4-SSL)
  • 993 IMAP4 over SSL (IMAPS, encrypted)

STARTTLS

Historiquement les ports 993, 995 et 465 sont utilisés comme connexions chiffrées pour les protocoles IMAP (143), POP (110) et SMTP (25).
Mais il a été décidé qu'avoir 2 ports pour un protocole était du gaspillage.
C'est pourquoi STARTTLS a été créé, il permet d'initier une connexion en clair, puis de basculer sur une connexion chiffrée avec TLS.

PostFix

Liens

Configuration

Outils

Bash.svg
# affiche les paramètres actuels de Postfix
postconf -pf

# affiche les paramètres du fichier /etc/postfix/main.cf
postconf -nf

# affiche les paramètres par défaut
postconf -df

Bases

/etc/postfix/main.cf
# Postfix ne servira pas de relais SMTP (default: subnet)
mynetworks_style = host
# les domaines de destination autorisés vers lesquelles Postix relais les emails, ici aucun (default: $mydestination)
relay_domains =

# spécifier si le hostname est différent de celui du serveur (commande hostname)
myhostname = nom.mon-domaine.fr
mydomain = mon-domaine.fr

# le nom de domaine des emails sortant: user@mon-domain.fr (default: $myhostname)
myorigin = $mydomain

# configure un relais SMTP
relayhost = smtp.free.fr:25

# Réglages par défaut:
# Après 10 erreurs, le serveur retarde toutes les réponses d'1 seconde
# Après 20 erreurs, le client est déconnecté
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

Transport

/etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport
# envoie directement les email pour mon-domaine.fr (user@mon-domaine.fr) et .mon-domaine.fr (user@host.mon-domaine.fr)
mon-domaine.fr    :
.mon-domaine.fr   :
# envoie tous les autres email via le smtp de free
*                 smtp:smtp.free.fr:25
# [] désactive le MX lookups
*                 smtp:[smtp.free.fr]:25
Bash.svg
# hash the « /etc/postfix/transport » file et créé la base de données « /etc/postfix/transport.db »
postmap /etc/postfix/transport

Sécuriser SMTP avec SSL/TLS et SASL

/etc/postfix/master.cf
# décommenter les lignes suivantes
smtp        inet  n       -       n       -       -       smtpd
submission  inet  n       -       n       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
/etc/postfix/main.cf
smtpd_sasl_auth_enable = yes

# choix de l'implémemtation SASL → Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/run/dovecot/auth-client

# domaine d'authentification par défaut, permet de se loguer juste avec le « username » sans le « @mon-domaine.fr »
smtpd_sasl_local_domain = $mydomain

# (défaut noanonymous)
smtpd_sasl_security_options = noanonymous, nodictionary, noplaintext
# (défaut $smtpd_sasl_security_options)
smtpd_sasl_tls_security_options = noanonymous, nodictionary
# noanonymous, noplaintext, nodictionary, forward_secrecy, mutual_auth

# établie une session TLS-encryptée avant l'authentification SASL
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/private/server.crt
smtpd_tls_key_file = /etc/ssl/private/server.key

# pour les emails entrants, contrôle du domaine de destination (mon-domaine.fr)
# (default: permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination)
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
# (default: )
smtpd_recipient_restrictions = $smtpd_relay_restrictions

# niveau de log (défaut 0)
smtpd_tls_loglevel = 1
# 0 → pas de log
# 1 → Log on TLS handshake completion
# 2 → Also log levels during TLS negotiation
# 3 et 4. Use log level 3 only in case of problems. Use of log level 4 is strongly discouraged.

Création des certificats

Comptes virtuels configurés dans des fichiers textes

/etc/postfix/main.cf
# (défaut: $virtual_mailbox_maps)
virtual_mailbox_domains = $mydomain

virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps

# ne délivre les emails qu'aux adresses listées (défaut « proxy:unix:passwd.byname $alias_maps » comptes UNIX et alias)
local_recipient_maps = $virtual_mailbox_maps $virtual_alias_maps
local_transport = virtual

# préfix pour tous les chemins vers les dossiers de boites mail
virtual_mailbox_base = /home/vmail

# taille maximale en bytes d'une boite mail (defaut 51200000 = 48Mo)
virtual_mailbox_limit = 51200000

# spécifie le propriétaire des boites mail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000

Dossiers dans lesquels seront stockés les mails:
compte1@mon-domaine.fr → /home/vmail/ + compte1/

/etc/postfix/virtual_mailbox_maps
compte1@mon-domaine.fr    compte1
compte2@mon-domaine.fr    compte2

Permet de rediriger une adresse vers une autre

/etc/postfix/virtual_alias_maps
compte3@mon-domaine.fr    compte1@mon-domaine.fr
Bash.svg
# après chaque modification des fichiers précédents, pensez à les hasher afin de mettre à jour les bases de données correspondantes
# /etc/postfix/virtual_mailbox_maps.db  et  /etc/postfix/virtual_alias_maps.db
postmap /etc/postfix/virtual_mailbox_maps
postmap /etc/postfix/virtual_alias_maps

Rediriger le compte mail root vers un autre compte

Dans cette configuration le fichier /etc/postfix/aliases ne fonctionne pas, il faut à la place utiliser le fichier /etc/postfix/virtual_alias_maps

/etc/postfix/aliases
root:  compte@mon-domaine.fr
/etc/postfix/virtual_alias_maps
root@mon-domaine.fr    compte@mon-domaine.fr
On peut mettre plus d'un compte dans la colonne de droite (séparés par des espaces)

Copier un email entrant vers d'autres boites email

/etc/postfix/main.cf
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps
/etc/postfix/recipient_bcc_maps
user@example.com  recipient@example.net
Bash.svg
postmap /etc/postfix/recipient_bcc_maps
systemctl reload postfix

Blacklist email entrant

/etc/postfix/sender_access
user@domain.com    REJECT
Bash.svg
cd /etc/postfix
# créer le fichier de bdd sender_access.db
postmap hash:sender_access
/etc/postfix/main.cf
smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/sender_access

PostfixAdmin

Bash.svg
sudo pacman -S postfixadmin
/etc/webapps/postfixadmin/config.inc.php
$CONF['configured'] = true;

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix_user';
$CONF['database_password'] = 'mot de passe';
$CONF['database_name'] = 'postfix_db';

// To create the hash, visit setup.php in a browser and type a password into the field
$CONF['setup_password'] = 'mon hash';
/etc/php/php.ini
extension=imap.so

Base de données

Mysql.svg
CREATE DATABASE `postfix_db` DEFAULT CHARACTER SET utf8  COLLATE utf8_general_ci;
CREATE USER 'postfix_user'@'localhost' IDENTIFIED BY 'mot de passe';
GRANT ALL ON `postfix_db`.* TO `postfix_user`@`localhost`;

Nginx

/etc/nginx/nginx.conf
server {
    listen 80;
    server_name postfixadmin.domain.fr;
    root        /usr/share/webapps/postfixAdmin;
    index       index.php;
    
    location ~ \.php$ {
        try_files       $uri =404;
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   index.php;
        include         /etc/nginx/fastcgi.conf;
    }
}

Aller à l'url suivante: http://postfixadmin.domain.fr/setup.php

  • Vérifier que tout est bien installé
  • Créer un mot de passe pour le setup, puis entrer le hash dans le fichier de configuration ($CONF['setup_password'])
  • Créer un compte administrateur

Comptes virtuels configurés dans mysql

/etc/postfix/main.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual_mailbox_maps.cf

# ne délivre les emails qu'aux adresses listée (défaut « proxy:unix:passwd.byname $alias_maps » comptes UNIX et alias)
local_recipient_maps = $virtual_mailbox_maps
local_transport = virtual

virtual_mailbox_base = /home/vmail
virtual_mailbox_limit = 512000000
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
/etc/postfix/virtual_alias_maps.cf
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT goto FROM alias WHERE address='%s' AND active = true
/etc/postfix/virtual_domains_maps.cf
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true
/etc/postfix/virtual_mailbox_limits.cf
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT quota FROM mailbox WHERE username='%s'
/etc/postfix/virtual_mailbox_maps.cf
user = postfix_user
password = mot de passe
hosts = localhost
dbname = postfix_db
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = true

Test

Se connecter sur PostfixAdmin → Send Email

Le port 25 doit être ouvert en sortie.

Erreur: Connection timed out

Freebox
Bash.svg
telnet localhost 25

ehlo localhost
mail from: root@localhost
rcpt to: test@gmail.com
data
Subject: Test
Test
.
quit

Log

/var/log/mail.log

« syslog-ng » doit être installé et activé au démarrage pour que Postfix écrive dans le fichier de log, sinon l'écriture du log se fera dans le journal.
/etc/logrotate.d/syslog-ng
/var/log/mail.log {
    monthly
    rotate 1
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP $(cat /run/syslog-ng.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

Installation

Bash.svg
sudo pacman postfix

# créer un nouveau groupe
groupadd -g 5000 vmail
# et un nouvel utilisateur
useradd -u 5000 -g vmail -d /home/vmail -s /bin/false vmail
mkdir /home/vmail
chown vmail:vmail /home/vmail
chmod -R 750 /home/vmail
passwd vmail
Dovecot n’autorise que les connexions d'utilisateurs ayant un ID > 500 (ici on force l'ID de vmail à 5000)
Ce réglage peut être modifié dans /etc/dovecot/conf.d/10-mail.conffirst_valid_uid

Dovecot

Permet de se connecter à son compte email et de récupérer ses emails.

Bash.svg
sudo pacman -S dovecot

# copie des fichiers de configuration
cp /etc/dovecot/dovecot.conf.sample /etc/dovecot/dovecot.conf
cp -r /usr/share/doc/dovecot/example-config/conf.d /etc/dovecot
/etc/dovecot/dovecot.conf
protocols = imap

Authentification

/etc/dovecot/conf.d/10-master.conf
service auth {
    # Postfix smtp-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

Stockage des emails

/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/vmail/%u

SSL / TLS

/etc/dovecot/conf.d/10-ssl.conf
# requires SSL/TLS also for non-plaintext authentication
ssl = required

ssl_cert = </etc/ssl/private/server.crt
ssl_key = </etc/ssl/private/server.key
/etc/dovecot/conf.d/10-auth.conf
# allows plaintext authentication only when SSL/TLS is used first
disable_plaintext_auth = yes

# plain: envoie du mot de passe non-encrypté. Dans le cadre d'une connexion SSL/TLS ce n'est pas un problème.
auth_mechanisms = plain

Stockage des mots de passes dans un fichier

Utiliser une userdb static ne permet pas de lister les utilisateurs.
Error: User listing returned failure
Error: Failed to iterate through some users
/etc/dovecot/conf.d/10-auth.conf
# commenter l'authentification système pour interdire l'accès aux comptes réels
#!include auth-system.conf.ext

# décommenter les lignes suivantes pour configurer le stockage des mots de passe dans un fichier
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext
/etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
  driver = passwd-file
  args = /etc/dovecot/passwd
}
/etc/dovecot/conf.d/auth-static.conf.ext
# utilisation du user « vmail »
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/home/vmail/%u
  # gid=nogroup
}
/etc/dovecot/passwd
user1@mon-domaine.fr:{PLAIN}password
user2@mon-domaine.fr:{SSHA}vkIq9ZuTczNGgsinVJgLE/Urc5HNHCYq
« user3 » fait référence à « user3@localhost »
Bash.svg
# génération des hash des mots de passe
doveadm pw -p password                  # MD5
doveadm pw -s ssha -p password          # sha
doveadm pw -s SHA512-CRYPT -p password  # sha512
doveadm pw -s BLF-CRYPT -p password     # blowfish, installer bcrypt
PasswordSchemes

Stockage des mots de passes dans un mysql

Bash.svg
cp /usr/share/doc/dovecot/example-config/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext
chmod 600 /etc/dovecot/dovecot-sql.conf.ext
/etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=postfix_db user=postfix_user password=motdepasse
default_pass_scheme = MD5

user_query = SELECT '/home/vmail/%u' as home, \
  'maildir:/home/vmail/%u' as mail, \
  5000 AS uid, \
  5000 AS gid, \
  concat('dirsize:storage=',  quota) AS quota \
  FROM mailbox \
  WHERE username = '%u' AND active = '1'

password_query = SELECT username as user, \
  password, \
  '/home/vmail/%u' as userdb_home, \
  'maildir:/home/vmail/%u' as userdb_mail, \
  5000 as userdb_uid, \
  5000 as userdb_gid \
  FROM mailbox \
  WHERE username = '%u' AND active = '1'

Log

/etc/dovecot/conf.d/10-logging.conf
# par défaut « syslog » → log dans le journal
# warning et error + info si info_log_path n'est pas renseigné + debug si debug_log_path n'est pas renseigné
log_path = /var/log/dovecot.log

# info si info_log_path n'est pas renseigné + debug si debug_log_path n'est pas renseigné
info_log_path = /var/log/dovecot-info.log
# debug
debug_log_path = /var/log/dovecot-debug.log

# Log unsuccessful authentication attempts and the reasons why they failed.
auth_verbose = yes
/etc/logrotate.d/dovecot
/var/log/dovecot*.log {
    monthly
    rotate 1
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        doveadm log reopen
    endscript
}

Vider automatiquement Trash et Junk

Bash.svg
DOVEADM="/usr/bin/doveadm";

# supprime pour tous les utilisateurs (-A) les mails de plus de 15 jours des boîtes Trash et Junk
$DOVEADM expunge -A mailbox Trash savedbefore 15d
$DOVEADM expunge -A mailbox Junk  savedbefore 15d

# dans le cas d'une userdb static (fichier), il n'est pas possible de lister les utilisateurs
# il faut donc lancer la commande pour chaque utilisateur
users="user1@domain.fr user2@domain.fr"
for user in $users
do
    $DOVEADM expunge -u $user mailbox Trash savedbefore 15d
    $DOVEADM expunge -u $user mailbox Junk  savedbefore 15d
done
crontab
# tous les dimanche à 5h
0 5 * * 0 /path/to/my/script_dovecot_expunge.sh

Liens

Erreurs

master: Warning: /path/folder is no longer mounted

Bash.svg
# ignorer /path/folder
doveadm mount add /path/folder ignore

# ignorer tous les points de montage dans /path
doveadm mount add '/path/*' ignore

Roundcube

Bash.svg
pacman -S roundcubemail php-intl

chown -R http:http /usr/share/webapps/roundcubemail/temp /usr/share/webapps/roundcubemail/logs
/etc/nginx/nginx.conf
server {
    listen 80;
    server_name roundcube.domain;
    root        /usr/share/webapps/roundcubemail;
    index       index.php;

    # Restrictions d'accès
    location ~ ^/config|temp|logs/ {
        deny all;
    }

    location ~ \.php$ {
        try_files       $uri =404;

        # php-fpm
        fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index   index.php;
        include         /etc/nginx/fastcgi.conf;

        # uwsgi
        include uwsgi_params;
        uwsgi_modifier1 14;
        uwsgi_pass unix:/run/uwsgi/roundcubemail.sock;
    }
}
/etc/php/php.ini
open_basedir = /tmp/:/usr/share/webapps/roundcubemail/:/etc/webapps/roundcubemail/:/var/log/roundcubemail/:/var/cache/roundcubemail/

extension=exif.so
extension=iconv.so
extension=intl.so
extension=pdo_mysql.so

Aller à l'url http://roundcube.domain/installer pour générer le fichier /etc/webapps/roundcubemail/config/config.inc.php

Base de données Roundcube

Mysql.svg
CREATE DATABASE `roundcube_db` DEFAULT CHARACTER SET utf8  COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcube_db.* TO 'roundcube_user'@'localhost' IDENTIFIED BY 'password';
Bash.svg
# remplir la base de données
mysql -u root -p roundcubemail < /usr/share/webapps/roundcubemail/SQL/mysql.initial.sql

Fin de l'installation

Supprimer le dossier /usr/share/webapps/roundcubemail/installer
Ou modifier la configuration pour interdire l'utilisation de l'installeur.

/etc/webapps/roundcubemail/config/config.inc.php
$config['enable_installer'] = false;

Logs

  • /var/log/roundcubemail/errors
  • /var/log/roundcubemail/sendmail
  • /var/log/roundcubemail/smtp
/etc/logrotate.d/roundcube
/var/log/roundcubemail/errors /var/log/roundcubemail/sendmail {
    monthly
    rotate 1
    missingok
    notifempty
    compress
    delaycompress
    create 640 http http
}
/etc/webapps/roundcubemail/config/config.inc.php
// Log SMTP conversation to <log_dir>/smtp or to syslog
$config['smtp_debug'] = true;

Plugins

/etc/webapps/roundcubemail/config/config.inc.php
// Ajouter le nom du plugin dans la liste
$config['plugins'] = array('custom_from');
Copier les plugins dans /usr/share/webapps/roundcubemail/plugins

plugin-manager

Après l'installation, une page demandant la mise à jour de la base de données s'affiche.
Ensuite se connecter avec le compte qui deviendra l'administrateur des plugins → Settings:
une page demandant la création d'un fichier *.myrc s'affiche. La création de se fichier autorise le compte connecté à devenir l'administrateur des plugins.

Les plugins ajoutés avec le plugin manager ne doivent pas être ajoutés dans le fichier « config.inc.php »

Reset Plugin Manager ‘superadmin’ account

  • Supprimer le fichier « /usr/share/webapps/roundcubemail/*.myrc »
  • DROP table ‘plugin_manager’
  • Remove entry ‘myrc_plugin_manager’ from ‘system’ table

calendar (myrc)

Nécessite l'installation des plugins

  • jscolor
  • http_auth
  • timepicker

Désinstaller calendar (myrc)

  • Supprimer la table « events », « events_cache », « events_caldav » et « reminders »
  • Supprimer l'entrée « myrc_calendar » de la table « system »

tasklist (kolab)

Bash.svg
# mise à jour de la base de données: /usr/share/webapps/roundcubemail/plugins/tasklist/UPGRADING
cd /usr/share/webapps/roundcubemail/bin
./updatedb.sh --package=tasklist-database --version=x.x.x --dir=../plugins/tasklist/drivers/database/SQL
Impossible de réordonner les taches.

calendar (kolab)

Bash.svg
# mise à jour de la base de données: /usr/share/webapps/roundcubemail/plugins/calendar/UPGRADING
cd /usr/share/webapps/roundcubemail/bin
./updatedb.sh --package=calendar-database --version=x.x.x --dir=../plugins/calendar/drivers/database/SQL

custom_from

Permet de répondre avec le bon expéditeur (From) lorsque l'email à été redirigé depuis un alias.
Permet aussi de modifier l'expéditeur.

OpenDKIM

DomainKeys Identified Mail permet de certifier qu'un email a bien été envoyer depuis son domaine.
Les emails sont signés avec une clé privée. Le serveur destinataire récupère la clé public via le DNS et vérifie la correspondance.

Tests

  • Créer un domaine et un compte email dans PostfixAdmin.
  • Se loguer avec ce compte dans Roundcube puis essayer de s'envoyer un email.
Consulter le journal système pour savoir ce qu'il se passe: journalctl -f

Erreurs

maildir access problem for UID/GID=5000/5000

maildir access problem for UID/GID=5000/5000: 
create maildir file /xxx/vmail/xxx@xxx.xx/tmp/xxx.xxx.xxx: 
Permission denied

L'utilisateur technique (vmail) ne correspond pas aux id (5000) définis dans le fichier de configuration de postfix /etc/postfix/main.cf

pam_unix(dovecot:auth): check pass; user unknown

/etc/dovecot/conf.d/10-auth.conf
# désactiver l'authentification système pour mysql
#!include auth-system.conf.ext
!include auth-sql.conf.ext

imap: Disconnected: Logged out

Roundcube se déconnecte après chaque action et se reconnecte à chaque nouvelle action.
Pour éviter se comportement et garder la connexion ouverte il faut utiliser imap proxy

Roundcube: Erreur SMTP (250) : échec lors de l'authentification

/var/log/roundcubemail/errors
ERROR: SMTP server does not support authentication ()
SMTP Error: Authentication failure: SMTP server does not support authentication (Code: ) in /usr/share/webapps/roundcubemail/program/lib/Roundcube/rcube.php on line 1648
/etc/webapps/roundcubemail/config/config.inc.php
// commenter $config['smtp_pass']
$config['smtp_pass'] = '%p';

Roudcube: 504 Gateway timeout

Augmenter le délai d'attente

/etc/nginx/nginx.conf
location ~ \.php$ {
    try_files $uri =404;
    include uwsgi_params;
    uwsgi_modifier1 14;
    uwsgi_pass unix:/run/uwsgi/roundcubemail.sock;

    uwsgi_read_timeout 120s;  # 60s par défaut
    uwsgi_send_timeout 120s;
}

NOQUEUE: reject: RCPT from domain.fr: 554 5.7.1 <user@externalmail.fr>: Relay access denied

NOQUEUE: reject: RCPT from domain.fr: 554 5.7.1 <user@externalmail.fr>: Relay access denied;
from=<user@domain.fr> to=<user@externalmail.fr> proto=ESMTP helo=<nextcloud.domain.fr>

Problèmes avec Gmail

Our system has detected that this message likely unsolicited mail

Message d'erreur provenant de Gmail lors de l'envoie d'un email vers une adresse Gmail.

host gmail-smtp-in.l.google.com[173.194.67.26] said:
Our system has detected that this message is likely unsolicited mail.
To reduce the amount of spam sent to Gmail, this message has been blocked.
  • Créer un champs SPF.
  • Configurer le reverse DNS (sur la Freebox)

The IP you're using to send mail is not authorized to send email directly to our servers

Message d'erreur provenant de Gmail lors de l'envoie d'un email vers une adresse Gmail.

The IP you're using to send mail is not authorized to send email directly to our servers.
Please use the SMTP relay at your service provider instead.

Faire passer les emails envoyés par le relais SMTP du FAI, qui lui est autoriser à envoyer des emails à Gmail.

/etc/postfix/main.cf
relayhost = smtp.free.fr:25

Received-SPF: softfail

Message d'erreur provenant du header d'un email reçu par Gmail.

Received-SPF: softfail
(google.com: domain of transitioning compte@mon-domaine.fr does not designate x.x.x.x as permitted sender)
client-ip=x.x.x.x;

L'IP x.x.x.x ne correspond pas au champs SPF définit dans le DNS.
Ceci peut être causé par l'utilisation d'un relais SMTP alors que la configuration du champs SPF n'a pas été remise à jour.
« y.y.y.y » représente l'IP du serveur
« 212.27.42.0/24 » représente les IPs des serveurs SMTP de free

.mon-domaine.fr    SPF    v=spf1 a mx ip4:y.y.y.y ip4:212.27.42.0/24 ip6:2a01:e0c:1:1599::0/112 ~all
Configurer aussi les IPv6 au besoin

Received-SPF: permerror

Message d'erreur provenant du header d'un email reçu par Gmail.

Received-SPF: permerror 
(google.com: permanent error in processing during lookup of compte@mon-domaine.fr) 
client-ip=x:x:x:x::x;

Le champs SPF contient une erreur, par exemple l'include n'est pas valide.