Scripts pour gestion d'un serveur mail

This commit is contained in:
Cédric Abonnel 2025-03-08 02:03:38 +01:00
parent c88689b5e9
commit 027c3ab250
15 changed files with 486 additions and 0 deletions

View File

@ -0,0 +1,20 @@
---
# **📌 Résumé des Scripts**
| **Script** | **Action** | **Exemple d'utilisation** |
|----------------------|-----------------------------------------------|--------------------------|
| `install_mailserver.sh` | Installer Postfix/Dovecot + ajouter un domaine | `bash install_mailserver.sh domain.top` |
| `add_domain.sh` | Ajouter un domaine | `bash add_domain.sh domain2.top` |
| `add_user.sh` | Ajouter un utilisateur | `bash add_user.sh user@domain.top "password"` |
| `add_alias.sh` | Ajouter un alias | `bash add_alias.sh contact@domain2.top user@domain.top` |
| `add_forward.sh` | Ajouter une redirection | `bash add_forward.sh contact@domain.top user@domain2.top` |
| `list_domains.sh` | Lister les domaines | `bash list_domains.sh` |
| `list_users.sh` | Lister les utilisateurs | `bash list_users.sh` |
| `list_aliases.sh` | Lister les alias/redirections | `bash list_aliases.sh` |
| `del_user.sh` | Supprimer un utilisateur | `bash del_user.sh user@domain.top` |
| `del_alias.sh` | Supprimer un alias | `bash del_alias.sh contact@domain2.top` |
| `del_domain.sh` | Supprimer un domaine | `bash del_domain.sh domain2.top` |

View File

@ -0,0 +1,18 @@
#!/bin/bash
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 <alias> <cible>"
exit 1
fi
ALIAS=$1
TARGET=$2
echo "$ALIAS $TARGET" >> $POSTFIX_ALIASES
postmap $POSTFIX_ALIASES
systemctl reload postfix
echo "Alias $ALIAS ajouté vers $TARGET 🎉"

View File

@ -0,0 +1,53 @@
#!/bin/bash
# Définition des variables
MAILDIR="/var/mail/vhosts"
POSTFIX_CONFIG="/etc/postfix/virtual_domains"
USER_VMAIL="vmail"
GROUP_VMAIL="vmail"
# Vérifier si le script est exécuté en root
if [[ $EUID -ne 0 ]]; then
echo "❌ Ce script doit être exécuté en tant que root."
exit 1
fi
# Vérifier si un domaine a été passé en paramètre
if [[ -z "$1" ]]; then
echo "Usage: $0 <domaine>"
exit 1
fi
DOMAIN=$1
# Vérifier si le domaine est déjà enregistré
if grep -q "^$DOMAIN$" "$POSTFIX_CONFIG"; then
echo "⚠️ Le domaine $DOMAIN est déjà configuré dans Postfix."
exit 1
fi
echo "🔹 Ajout du domaine : $DOMAIN"
echo "$DOMAIN" >> "$POSTFIX_CONFIG"
# Création du répertoire pour le domaine
DOMAIN_DIR="$MAILDIR/$DOMAIN"
if [[ ! -d "$DOMAIN_DIR" ]]; then
echo "📁 Création du dossier mail pour $DOMAIN"
mkdir -p "$DOMAIN_DIR"
chown -R "$USER_VMAIL:$GROUP_VMAIL" "$DOMAIN_DIR"
chmod -R 770 "$DOMAIN_DIR"
else
echo "⚠️ Le dossier $DOMAIN_DIR existe déjà."
fi
# Recharger Postfix pour appliquer les changements
echo "🔄 Rechargement de Postfix..."
systemctl reload postfix
# Vérification de la bonne prise en compte
if systemctl is-active --quiet postfix; then
echo "✅ Domaine $DOMAIN ajouté avec succès et Postfix rechargé 🎉"
else
echo "❌ Erreur : Postfix ne fonctionne pas correctement après la mise à jour."
exit 1
fi

View File

@ -0,0 +1,21 @@
#!/bin/bash
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 <adresse_source> <adresse_cible1> [adresse_cible2] ..."
exit 1
fi
SOURCE=$1
shift # Supprime le premier argument (l'adresse source)
TARGETS="$@"
echo "Ajout de la redirection de $SOURCE vers $TARGETS"
echo "$SOURCE $TARGETS" >> $POSTFIX_ALIASES
postmap $POSTFIX_ALIASES
systemctl reload postfix
echo "Redirection de $SOURCE vers $TARGETS ajoutée"

View File

@ -0,0 +1,29 @@
#!/bin/bash
DOVECOT_USERS="/etc/dovecot/users"
MAILDIR="/var/mail/vhosts"
if [[ -z "$1" ]]; then
echo "Usage: $0 <adresse email>"
exit 1
fi
EMAIL=$1
DOMAIN=$(echo $EMAIL | cut -d@ -f2)
USER=$(echo $EMAIL | cut -d@ -f1)
# Vérifier si l'utilisateur existe déjà
if grep -q "^$EMAIL:" "$DOVECOT_USERS"; then
echo "Erreur : L'utilisateur $EMAIL existe déjà."
exit 1
fi
# Ajouter l'utilisateur sans mot de passe
echo "$EMAIL:" >> "$DOVECOT_USERS"
# Création du répertoire de messagerie
mkdir -p "$MAILDIR/$DOMAIN/$USER"
chown -R vmail:vmail "$MAILDIR/$DOMAIN/$USER"
chmod -R 770 "$MAILDIR/$DOMAIN/$USER"
echo "Utilisateur $EMAIL créé avec succès. Utilisez 'generate_password.sh $EMAIL' pour lui assigner un mot de passe."

View File

@ -0,0 +1,20 @@
#!/bin/bash
POSTFIX_ALIASES="/etc/postfix/virtual_aliases"
if [[ -z "$1" ]]; then
echo "Usage: $0 <alias>"
exit 1
fi
ALIAS=$1
echo "Suppression de l'alias : $ALIAS"
# Supprimer l'entrée de l'alias
sed -i "/^$ALIAS /d" $POSTFIX_ALIASES
postmap $POSTFIX_ALIASES
systemctl reload postfix
echo "Alias $ALIAS supprimé"

View File

@ -0,0 +1,23 @@
#!/bin/bash
MAILDIR="/var/mail/vhosts"
POSTFIX_CONFIG="/etc/postfix/virtual_domains"
if [[ -z "$1" ]]; then
echo "Usage: $0 <domaine>"
exit 1
fi
DOMAIN=$1
echo "Suppression du domaine : $DOMAIN"
# Supprimer le domaine du fichier de Postfix
sed -i "/^$DOMAIN$/d" $POSTFIX_CONFIG
# Supprimer les boîtes mail associées
rm -rf $MAILDIR/$DOMAIN
systemctl reload postfix
echo "Domaine $DOMAIN supprimé"

View File

@ -0,0 +1,23 @@
#!/bin/bash
DOVECOT_USERS="/etc/dovecot/users"
MAILDIR="/var/mail/vhosts"
if [[ -z "$1" ]]; then
echo "Usage: $0 <adresse mail>"
exit 1
fi
EMAIL=$1
DOMAIN=$(echo $EMAIL | cut -d@ -f2)
USER=$(echo $EMAIL | cut -d@ -f1)
echo "Suppression de l'utilisateur : $EMAIL"
# Supprimer l'entrée du fichier des utilisateurs
sed -i "/^$EMAIL:/d" $DOVECOT_USERS
# Supprimer le répertoire de la boîte mail
rm -rf $MAILDIR/$DOMAIN/$USER
echo "Utilisateur $EMAIL supprimé"

View File

@ -0,0 +1,83 @@
# Récupérer le nom dhôte complet (FQDN)
SERVER_NAME=$(hostname -f) # Privilégier hostname -f
# Vérifier si le FQDN est vide (cas rare)
if [[ -z "$SERVER_NAME" ]]; then
SERVER_NAME=$(cat /etc/hostname) # Lecture depuis /etc/hostname
fi
# Construire l'URL du serveur
SERVER_URL="http://$SERVER_NAME/passwords"
echo "Serveur détecté : $SERVER_NAME"
DOVECOT_USERS="/etc/dovecot/users"
WEB_DIR="/var/www/passwords"
EXPIRATION_TIME=600 # 10 minutes avant suppression
if [[ -z "$1" ]]; then
echo "Usage: $0 <adresse email>"
exit 1
fi
EMAIL=$1
# Vérifier si l'utilisateur existe
if ! grep -q "^$EMAIL:" "$DOVECOT_USERS"; then
echo "Erreur : L'utilisateur $EMAIL n'existe pas. Utilisez 'create_user.sh' d'abord."
exit 1
fi
# Génération d'un mot de passe sécurisé
PASSWORD=$(tr -dc 'A-Za-z0-9@#%&*()-_=+' </dev/urandom | head -c 20)
# Hachage sécurisé du mot de passe
HASHED_PASS=$(doveadm pw -s SHA512-CRYPT -p "$PASSWORD")
# Mettre à jour le mot de passe dans le fichier des utilisateurs
sed -i "s|^$EMAIL:.*|$EMAIL:$HASHED_PASS|" "$DOVECOT_USERS"
# Génération d'un lien temporaire
mkdir -p "$WEB_DIR"
chmod 750 "$WEB_DIR"
FILE_ID=$(uuidgen)
FILE_PATH="$WEB_DIR/$FILE_ID.html"
# Création de la page HTML temporaire
cat <<EOF > "$FILE_PATH"
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Votre nouveau mot de passe</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
.container { background: #f4f4f4; padding: 20px; border-radius: 10px; display: inline-block; }
h1 { color: #333; }
.password { font-size: 20px; font-weight: bold; background: #ddd; padding: 10px; border-radius: 5px; }
</style>
</head>
<body>
<div class="container">
<h1>Votre nouveau mot de passe</h1>
<p>Adresse email : <strong>$EMAIL</strong></p>
<p>Mot de passe temporaire :</p>
<p class="password">$PASSWORD</p>
<p><strong>Notez-le, cette page sera supprimée après consultation.</strong></p>
</div>
<script>
fetch(window.location.href, { method: 'DELETE' }).then(() => console.log('Fichier supprimé'));
</script>
</body>
</html>
EOF
chmod 600 "$FILE_PATH"
# Suppression automatique après expiration
(sleep $EXPIRATION_TIME && rm -f "$FILE_PATH") &
echo "Mot de passe mis à jour pour $EMAIL"
echo "Lien temporaire pour récupérer le mot de passe : $SERVER_URL/$FILE_ID.html"

View File

@ -0,0 +1,3 @@
#!/bin/bash
echo "=== Liste des alias et redirections ==="
cat /etc/postfix/virtual_aliases

View File

@ -0,0 +1,3 @@
#!/bin/bash
echo "=== Liste des domaines gérés ==="
cat /etc/postfix/virtual_domains

View File

@ -0,0 +1,3 @@
#!/bin/bash
echo "=== Liste des utilisateurs ==="
cat /etc/dovecot/users | cut -d: -f1

View File

@ -0,0 +1,145 @@
#!/bin/bash
# Vérifier si le script est exécuté en root
if [[ $EUID -ne 0 ]]; then
echo "❌ Ce script doit être exécuté en tant que root."
exit 1
fi
echo "=== Mise à jour du système ==="
apt update && apt upgrade -y
echo "=== Installation de Postfix, Dovecot et outils nécessaires ==="
apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-sieve certbot curl dnsutils
# Récupérer le nom dhôte complet (FQDN)
FQDN=$(hostname -f)
# Vérifier si le FQDN est vide
if [[ -z "$FQDN" ]]; then
FQDN=$(cat /etc/hostname)
fi
# Extraire le domaine principal (ex: mail.acemail.fr -> acemail.fr)
DOMAIN=$(echo "$FQDN" | sed -E 's/^[^.]+\.//')
echo "🔍 Serveur détecté : $FQDN"
echo "🌐 Domaine géré pour les emails : $DOMAIN"
# Récupération des IP
SERVER_IP=$(curl -s ifconfig.me || hostname -I | awk '{print $1}') # IP publique ou locale
FQDN_IP=$(dig +short "$FQDN" | tail -n1) # IP associée au domaine
echo "🌍 IP publique du serveur : $SERVER_IP"
echo "🔎 IP DNS du serveur : $FQDN_IP"
# Vérification du DNS
if [[ -z "$FQDN_IP" ]]; then
echo "❌ Impossible de récupérer l'IP du serveur ($FQDN)."
echo "🔹 Vérifie la configuration DNS et assure-toi que le nom de serveur pointe bien vers ce serveur."
exit 1
fi
if [[ "$SERVER_IP" != "$FQDN_IP" ]]; then
echo "⚠️ Problème DNS : L'IP du serveur ($FQDN_IP) ne correspond pas à l'IP du serveur ($SERVER_IP)."
echo "🔹 Corrige l'entrée DNS ou attends sa propagation avant de continuer."
exit 1
fi
echo "✅ DNS correct : $FQDN pointe bien vers $SERVER_IP"
# Variables
MAIL_DIR="/var/mail/vhosts"
LE_DIR="/etc/letsencrypt/live/$FQDN"
BACKUP_DIR="/backup/mail"
echo "=== Génération du certificat SSL avec Let's Encrypt ==="
if [[ -f "$LE_DIR/fullchain.pem" ]]; then
echo "✅ Certificat SSL déjà existant."
openssl x509 -noout -text -in "$LE_DIR/fullchain.pem" | grep "Not After"
else
echo "🔄 Génération dun nouveau certificat SSL..."
certbot certonly --standalone -d "$FQDN" --non-interactive --agree-tos --register-unsafely-without-email
if [[ $? -ne 0 ]]; then
echo "❌ Erreur lors de la génération du certificat Let's Encrypt."
exit 1
fi
fi
# Création des fichiers de configuration
mkdir -p "$BACKUP_DIR"
echo "=== Configuration de Postfix ==="
cat > /etc/postfix/main.cf <<EOF
smtpd_banner = \$myhostname ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = $FQDN
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
# Sécurisation avec TLS
smtpd_tls_cert_file=$LE_DIR/fullchain.pem
smtpd_tls_key_file=$LE_DIR/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
EOF
echo "=== Configuration de Dovecot ==="
cat > /etc/dovecot/dovecot.conf <<EOF
disable_plaintext_auth = no
ssl = required
ssl_cert = <$LE_DIR/fullchain.pem
ssl_key = <$LE_DIR/privkey.pem
mail_location = maildir:$MAIL_DIR/%d/%n
protocols = imap pop3 lmtp
auth_mechanisms = plain login
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
EOF
echo "=== Redémarrage des services ==="
systemctl restart postfix dovecot
systemctl enable postfix dovecot
echo "=== Vérification des ports ouverts ==="
ss -tulpen | grep -E "postfix|dovecot"
echo "=== Ajout dun cron pour renouveler le certificat ==="
echo "0 3 * * * certbot renew --quiet && systemctl reload postfix dovecot" > /etc/cron.d/letsencrypt-renew
echo "✅ Configuration terminée avec succès !"

View File

@ -0,0 +1,21 @@
# Scimagic New Multi Frequency Universal Remote Control Duplicator
Best Copy Position
## Programming
### Standard
1. Press and hold button 1 and press button 2 four times at same time
2. Release 2 buttons LED fashed once every three seconds
3. Put original remote in te front of new remote (as closer as possible), press the orignial remote button which need to be copied until the LED of new remote flash quickly
(LED have regular flashes)
4. Press the button of New remote that you want to use to sav the code
5. if you do not copy successfully, please repeat above steps
6. To duplicate a second button, repeat the above steps

View File

@ -0,0 +1,21 @@
# Scimagic Nouvelle Télécommande Universelle Multi-Fréquence
Meilleure Position de Copie
## Programmation
### Standard
1. Appuyez et maintenez le bouton 1 tout en appuyant quatre fois sur le bouton 2 en même temps.
2. Relâchez les deux boutons, la LED clignote une fois toutes les trois secondes.
3. Placez la télécommande d'origine en face de la nouvelle télécommande (le plus proche possible), appuyez sur le bouton de la télécommande d'origine qui doit être copié jusqu'à ce que la LED de la nouvelle télécommande clignote rapidement.
(La LED a des clignotements réguliers)
4. Appuyez sur le bouton de la nouvelle télécommande que vous souhaitez utiliser pour enregistrer le code.
5. Si la copie n'est pas réussie, veuillez répéter les étapes ci-dessus.
6. Pour dupliquer un deuxième bouton, répétez les étapes ci-dessus.