Skip to content

Instantly share code, notes, and snippets.

@mafulafunk
Created May 21, 2025 13:46
Show Gist options
  • Select an option

  • Save mafulafunk/d59d878d703d114502e0bae8a3643a51 to your computer and use it in GitHub Desktop.

Select an option

Save mafulafunk/d59d878d703d114502e0bae8a3643a51 to your computer and use it in GitHub Desktop.
SMTP Test Script
#!/bin/bash
if [ -z "$BASH_VERSION" ]; then
echo "Dieses Skript muss mit bash ausgeführt werden. Bitte verwenden Sie: bash $0"
exit 1
fi
# Protokolldateiname mit Zeitstempel erstellen
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="connection_test_${TIMESTAMP}.log"
TCPDUMP_FILE="tcpdump_${TIMESTAMP}.pcap"
# Fest kodierte Server
SMTP_HOST1="smtp.strato.de"
SMTP_PORT1="587"
SMTP_HOST2="smtp.mailbox.org"
SMTP_PORT2="587"
TRIES=100
TIMEOUT=5
# Statistik-Zähler für beide Server
SUCCESS1=0
FAIL1=0
SUCCESS2=0
FAIL2=0
# Funktion zum Sammeln von Systeminformationen
collect_system_info() {
{
echo "=== SYSTEMINFORMATIONEN ==="
echo "Datum und Uhrzeit: $(date)"
echo ""
echo "=== NETZWERKINFORMATIONEN ==="
echo "IP-Adressen:"
ifconfig | grep "inet " || ip addr show | grep "inet "
echo ""
echo "DNS-Server:"
cat /etc/resolv.conf
echo ""
echo "=== TRACEROUTE ZU DEN SERVERN ==="
echo "Traceroute zu $SMTP_HOST1:"
traceroute -n "$SMTP_HOST1" 2>&1
echo ""
echo "Traceroute zu $SMTP_HOST2:"
traceroute -n "$SMTP_HOST2" 2>&1
echo ""
echo "=== PING TESTS ==="
echo "Ping zu $SMTP_HOST1:"
ping -c 5 "$SMTP_HOST1" 2>&1
echo ""
echo "Ping zu $SMTP_HOST2:"
ping -c 5 "$SMTP_HOST2" 2>&1
echo ""
# Die folgenden Sektionen wurden entfernt:
# - NETZWERK-PEERING UND RESSOURCEN (speedtest-cli)
# - SYSTEM RESSOURCEN (CPU/RAM)
# - TIMEOUT TOOL INFO (gtimeout/timeout)
# - Netcat (nc) Info
} > "${LOG_FILE}"
echo "Systeminformationen in ${LOG_FILE} gespeichert"
}
# tcpdump starten, falls verfügbar
start_tcpdump() {
if command -v tcpdump >/dev/null 2>&1; then
echo "Starte tcpdump, speichere in ${TCPDUMP_FILE}..."
echo "Bitte einmalig das sudo-Passwort eingeben für tcpdump:"
# Sudo-Rechte einmalig erhalten
sudo -v
sudo tcpdump -i any -w "${TCPDUMP_FILE}" "host $SMTP_HOST1 or host $SMTP_HOST2" &
TCPDUMP_PID=$!
echo "tcpdump gestartet mit PID ${TCPDUMP_PID}"
# Kurze Pause, um sicherzustellen, dass tcpdump gestartet ist
sleep 2
else
echo "tcpdump ist nicht installiert. Keine Netzwerkpakete werden aufgezeichnet."
TCPDUMP_PID=""
fi
}
# tcpdump stoppen
stop_tcpdump() {
if [ -n "$TCPDUMP_PID" ]; then
echo "Stoppe tcpdump..."
# Verwende bereits authentifizierte sudo-Session
sudo kill -9 $TCPDUMP_PID 2>/dev/null || sudo pkill -9 tcpdump 2>/dev/null
echo "tcpdump gestoppt. Aufzeichnung gespeichert in ${TCPDUMP_FILE}"
fi
}
# Sicherstellen, dass wir tcpdump bei Skriptabbruch stoppen
trap 'stop_tcpdump; echo "Skript wurde unterbrochen. Bereinige..."; exit 1' INT TERM
# Sammle Systeminformationen
collect_system_info
# Starte tcpdump
start_tcpdump
# Start der Tests
{
echo "=== VERBINDUNGSTESTS ==="
echo "Test gestartet am $(date)"
echo "SMTP Server 1: $SMTP_HOST1:$SMTP_PORT1"
echo "SMTP Server 2: $SMTP_HOST2:$SMTP_PORT2"
echo "Anzahl Versuche pro Server: $TRIES"
echo "Timeout pro Verbindung: $TIMEOUT Sekunden"
echo "--------------------------------------"
} | tee -a "${LOG_FILE}"
# Prüfen ob netcat installiert ist
if ! command -v nc >/dev/null 2>&1; then
echo "netcat (nc) ist nicht installiert. Bitte installieren Sie netcat." | tee -a "${LOG_FILE}"
stop_tcpdump
exit 1
fi
# Verwende gtimeout wenn verfügbar, sonst timeout
TIMEOUT_CMD="timeout"
if command -v gtimeout >/dev/null 2>&1; then
TIMEOUT_CMD="gtimeout"
fi
# Testen beider Server im Wechsel
for ((i=1; i<=TRIES; i++)); do
echo "Durchlauf $i/$TRIES:" | tee -a "${LOG_FILE}"
# Aktuelle Zeit für jede Verbindung protokollieren
CURRENT_TIME=$(date +"%H:%M:%S")
# Server 1 testen
echo " [$CURRENT_TIME] Teste $SMTP_HOST1:$SMTP_PORT1..." | tee -a "${LOG_FILE}"
CONN_OUTPUT=$($TIMEOUT_CMD $TIMEOUT nc -zv "$SMTP_HOST1" "$SMTP_PORT1" 2>&1)
if [ $? -eq 0 ]; then
((SUCCESS1++))
echo " $SMTP_HOST1:$SMTP_PORT1 - Erfolg" | tee -a "${LOG_FILE}"
else
((FAIL1++))
echo " $SMTP_HOST1:$SMTP_PORT1 - Fehler (Ausgabe: $CONN_OUTPUT)" | tee -a "${LOG_FILE}"
fi
# Kurze Pause
sleep 0.5
# Aktuelle Zeit für zweite Verbindung
CURRENT_TIME=$(date +"%H:%M:%S")
# Server 2 testen
echo " [$CURRENT_TIME] Teste $SMTP_HOST2:$SMTP_PORT2..." | tee -a "${LOG_FILE}"
CONN_OUTPUT=$($TIMEOUT_CMD $TIMEOUT nc -zv "$SMTP_HOST2" "$SMTP_PORT2" 2>&1)
if [ $? -eq 0 ]; then
((SUCCESS2++))
echo " $SMTP_HOST2:$SMTP_PORT2 - Erfolg" | tee -a "${LOG_FILE}"
else
((FAIL2++))
echo " $SMTP_HOST2:$SMTP_PORT2 - Fehler (Ausgabe: $CONN_OUTPUT)" | tee -a "${LOG_FILE}"
fi
sleep 0.5
done
# Stoppe tcpdump
stop_tcpdump
# Erfolgsraten berechnen
SUCCESS_RATE1=$(echo "scale=2; $SUCCESS1*100/$TRIES" | bc)
FAIL_RATE1=$(echo "scale=2; $FAIL1*100/$TRIES" | bc)
SUCCESS_RATE2=$(echo "scale=2; $SUCCESS2*100/$TRIES" | bc)
FAIL_RATE2=$(echo "scale=2; $FAIL2*100/$TRIES" | bc)
# Ergebnisse ausgeben
{
echo "--------------------------------------"
echo "Testergebnisse:"
echo "--------------------------------------"
echo "Host: $SMTP_HOST1"
echo "Port: $SMTP_PORT1"
echo "Erfolgreiche Verbindungen: $SUCCESS1/$TRIES (${SUCCESS_RATE1}%)"
echo "Fehlgeschlagene Verbindungen: $FAIL1/$TRIES (${FAIL_RATE1}%)"
echo "--------------------------------------"
echo "Host: $SMTP_HOST2"
echo "Port: $SMTP_PORT2"
echo "Erfolgreiche Verbindungen: $SUCCESS2/$TRIES (${SUCCESS_RATE2}%)"
echo "Fehlgeschlagene Verbindungen: $FAIL2/$TRIES (${FAIL_RATE2}%)"
echo "--------------------------------------"
echo "Test abgeschlossen am $(date)"
echo ""
echo "Alle Logs wurden in ${LOG_FILE} gespeichert"
if [ -n "$TCPDUMP_PID" ]; then
echo "Netzwerkdaten wurden in ${TCPDUMP_FILE} gespeichert"
fi
echo ""
echo "HINWEIS ZUR VERWENDUNG DER PROTOKOLLDATEN:"
echo "Um die Protokolldaten an den Support zu senden, fügen Sie bitte folgende Dateien bei:"
echo "1. ${LOG_FILE} - Enthält alle Testergebnisse und Systeminformationen"
if [ -n "$TCPDUMP_PID" ]; then
echo "2. ${TCPDUMP_FILE} - Enthält die Netzwerkpakete (tcpdump)"
echo " Mit dem Befehl 'tcpdump -r ${TCPDUMP_FILE}' können Sie sich die Pakete ansehen"
fi
} | tee -a "${LOG_FILE}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment