Skip to content

Skript für Quota Warnings

Quota Warnings

Für Quota Warnings erstellen wir uns ein Skript, was bei erreichen der Schwellwerte eine Email an die jeweilige Mailbox sendet. Damit wir auch das Quota Limit ermitteln können, benötigen wir dazu auch die Zugangsdaten zur PostfixAdmin Datenbank. Das Passwort speichern wir in der Variable $sqlpw.

sqlpw='<SECRET>'

Dann erstellen wir das Skript /usr/local/bin/quota-warning mit folgendem Befehl. Im Skript wird auf ein Bild /etc/dovecot/dovecot.png verwiesen. Es handelt sich dabei um dieses Bild, was man hier herunterladen und nach /etc/dovecot/dovecot.png speichern sollte.

dovecot.png

cat <<SCRIPT | tee /usr/local/bin/quota-warning >/dev/null
#!/usr/bin/env bash
# -------------------------------
# Dovecot Quota-Warning Script
# HTML + Plain + CID Image
# Arguments
#     \$1 - Quota-Warning Schwellwert
#     \$2 - E-Mail Adresse des Empfängers (der Mailbox)
# -------------------------------

declare -A cfg

cfg[dbuser]="postfixadmin"
cfg[dbpass]='$sqlpw'
cfg[dbname]="postfixadmin"
cfg[unit]="GB"
cfg[date]=\$(date '+%Y-%m-%d %H:%M:%S')
cfg[from]="postmaster@\$(hostname -d)"
cfg[subject]="[Quota-Warnung] ⚠ Ihr Postfach hat derzeit %d%% des Speicherlimits erreicht"
cfg[logo]="/etc/dovecot/dovecot.png"
cfg[logfile]="/tmp/quota-warning.log"

function quota_limit () {

local email="\$1"
local unit="\${2:-GB}"   # Standard: GB

[ -z "\$email" ] && return 1

local unit=\$(echo "\$unit" | tr '[:lower:]' '[:upper:]')

local divisor
case "\$unit" in
    B)  divisor=1 ;;
    KB) divisor=1024 ;;
    MB) divisor=\$((1024*1024)) ;;
    GB) divisor=\$((1024*1024*1024)) ;;
    *)  echo "Ungültige Einheit: \$unit" >&2; return 1 ;;
esac

local quota=\$(
    mysql -u"\${cfg[dbuser]}" -p"\${cfg[dbpass]}" -D"\${cfg[dbname]}" -N -B -e \
    "SELECT ROUND(quota / \$divisor, 2)
    FROM mailbox
    WHERE username = '\$email';"
)

[ -z "\$quota" ] && quota="N/A"

echo "\$quota \$unit"

}

# **************************************************
# MAIN

export LANG=C.UTF-8
export LC_ALL=C.UTF-8

QUOTA=\$1
USER=\$2

QUOTA_LIMIT=\$( quota_limit "\${USER}" "\${cfg[unit]}" )

# MIME Boundaries
BOUNDARY_MAIN="mixed-\$(date +%s)"
BOUNDARY_ALT="alt-\$(date +%s)"

# Plaintext Version (Fallback für Clients ohne HTML)
BODY_PLAIN=\$(cat <<EOF
Guten Tag,

wir möchten Sie darüber informieren, dass das Speicherlimit Ihres Postfachs \$USER derzeit zu \$QUOTA% ausgelastet ist.

Damit der E-Mail-Empfang und -Versand weiterhin reibungslos funktioniert, empfehlen wir Ihnen, Ihr Postfach zeitnah zu überprüfen und nicht mehr benötigte Nachrichten sowie Anhänge zu löschen. Bitte denken Sie auch daran, den Papierkorb und den Spam-Ordner zu leeren, da diese ebenfalls Speicherplatz belegen.

Das maximale Speicherlimit Ihres Postfachs beträgt \$QUOTA_LIMIT. Sobald dieses Limit erreicht ist, können unter Umständen keine neuen E-Mails mehr zugestellt werden.

Sollten Sie Fragen haben oder Unterstützung benötigen, wenden Sie sich bitte an unseren Support.

--
Mit freundlichen Grüßen
Ihr Mailservice-Team
EOF
)

# HTML Version
BODY_HTML=\$(cat <<EOF
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
</head>
<body style="margin:0;padding:0;background:#f4f6f8;font-family:Arial,Helvetica,sans-serif;color:#333;">
<div style="max-width:600px;margin:20px auto;background:#ffffff;border-radius:6px;border:1px solid #e0e0e0;padding:30px;">
    <div style="text-align:center;margin-bottom:25px;">
        <h2>Postfach-Warnung</h2>
    </div>

    <p>Guten Tag,</p>

    <p>
        wir möchten Sie darüber informieren, dass das Speicherlimit Ihres Postfachs <a href="mailto:\$USER">\$USER</a> derzeit zu <strong>\$QUOTA%</strong> ausgelastet ist.
    </p>

    <p>
        Damit der E-Mail-Empfang und -Versand weiterhin reibungslos funktioniert, empfehlen wir Ihnen, Ihr Postfach zeitnah zu überprüfen
        und nicht mehr benötigte Nachrichten sowie Anhänge zu löschen. Bitte denken Sie auch daran, den Papierkorb und den Spam-Ordner zu leeren,
        da diese ebenfalls Speicherplatz belegen.
    </p>

    <p>
        Das maximale Speicherlimit Ihres Postfachs beträgt <strong>\$QUOTA_LIMIT</strong>. Sobald dieses Limit erreicht ist, können unter Umständen keine neuen E-Mails
        mehr zugestellt werden.
    </p>

    <p>
        Sollten Sie Fragen haben oder Unterstützung benötigen, wenden Sie sich bitte an unseren Support.
    </p>

    <p>
        Mit freundlichen Grüßen<br/>
        <strong>Ihr Mailservice-Team</strong>
    </p>

    <div style="margin-top:30px;padding-top:15px;border-top:1px solid #e0e0e0;text-align:center;">
        <img src="cid:dovecot" alt="Dovecot Logo" width="175" style="display:block;margin:0 auto;">
    </div>
</div>
</body>
</html>
EOF
)

# Logo Base64 kodieren
LOGO_BASE64=\$(base64 -w 0 "\${cfg[logo]}")

SUBJECT_RAW=\$(printf "\${cfg[subject]}" \$QUOTA)
SUBJECT_ENCODED=\$(echo -n "\$SUBJECT_RAW" | iconv -f UTF-8 -t UTF-8 | base64 -w 0)
SUBJECT="=?UTF-8?B?\${SUBJECT_ENCODED}?="

# Mail senden
{
echo "From: \${cfg[from]}"
echo "To: \$USER"
echo "Subject: \$SUBJECT"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/related; boundary=\"\$BOUNDARY_MAIN\""
echo
echo "--\$BOUNDARY_MAIN"
echo "Content-Type: multipart/alternative; boundary=\"\$BOUNDARY_ALT\""
echo

# Plain
echo "--\$BOUNDARY_ALT"
echo "Content-Type: text/plain; charset=UTF-8"
echo "Content-Transfer-Encoding: 8bit"
echo
echo "\$BODY_PLAIN"
echo

# HTML
echo "--\$BOUNDARY_ALT"
echo "Content-Type: text/html; charset=UTF-8"
echo "Content-Transfer-Encoding: 8bit"
echo
echo "\$BODY_HTML"
echo
echo "--\$BOUNDARY_ALT--"
echo

# Image Part
echo "--\$BOUNDARY_MAIN"
echo "Content-Type: image/png; name=\"dovecot.png\""
echo "Content-Transfer-Encoding: base64"
echo "Content-ID: <dovecot>"
echo "Content-Disposition: inline; filename=\"dovecot.png\""
echo
echo "\$LOGO_BASE64"
echo
echo "--\$BOUNDARY_MAIN--"
} | /usr/sbin/sendmail -t


if [ -e "\${cfg[logfile]}" ]; then
    if [ -w "\${cfg[logfile]}" ]; then
        echo "\${cfg[date]} - Quota-Warnung: \$USER - \$QUOTA%" >>"\${cfg[logfile]}"
    fi
else
    if [ -w "\$(dirname \${cfg[logfile]})" ]; then
        echo "\${cfg[date]} - Quota-Warnung: \$USER - \$QUOTA%" >"\${cfg[logfile]}"
    fi
fi

# EOF
SCRIPT

Dann müssen wir das Skript /usr/local/bin/quota-warning noch ausführbar machen.

chmod 755 /usr/local/bin/quota-warning
chown vmail:vmail /usr/local/bin/quota-warning

Um das Skript zu testen, fürhren wir es wie folgt aus. Als ersten Parameter setzen wir die Warning Schwelle, z.B. 80 und als zweiten Parameter setzen wir den Empfänger bzw. Mailbox E-Mail Adresse.

/usr/local/bin/quota-warning 80 info@example.com