Skript für 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.

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