Toto je starší verze dokumentu!
DMA - e-mail přes SMTP
DMA (DragonFly Mail Agent) je malý a jednoduchý forwarder pro posílání e-mailů přes SMTP. I když článek vypadá dlouze, stačí Quick Setup. Další kroky jsou spíš pro případ problémů. Je ideální náhradou za sSMTP či mSMTP.
🎯 Quick Setup (5 minut)
Krok 1: Instalace
sudo apt-get update sudo apt-get install -y dma
Krok 2: Konfigurace dma.conf
sudo nano /etc/dma/dma.conf
Přidej/uprav tyto řádky:
# Gmail SMTP server SMARTHOST smtp.gmail.com # SMTP port (587 = submission port) PORT 587 # ⚠️ KRITICKÉ: Aliasy MUSÍ být odkomentované! ALIASES /etc/aliases # Spool directory (fronta emailů) SPOOLDIR /var/spool/dma # Authentication file AUTHPATH /etc/dma/auth.conf # ⚠️ KRITICKÉ: TLS konfigurace pro Gmail # MUSÍ být OBĚ tyto řádky! SECURETRANSFER STARTTLS # Hostname (Debian specific) MAILNAME /etc/mailname
💡 DŮLEŽITÉ POZNATKY: - SECURETRANSFER = zapne TLS - STARTTLS = upgrade na TLS během spojení (Gmail VYŽADUJE!) - Bez STARTTLS = dma procesy zamrznou při handshake - ALIASES musí být odkomentované, jinak dma ignoruje /etc/aliases
Krok 3: Authentication (Gmail přihlášení)
sudo nano /etc/dma/auth.conf
Formát (PŘESNĚ takto!):
your-email@gmail.com|smtp.gmail.com:your-app-password
⚠️ KRITICKÉ DETAILY: - Separator mezi emailem a serverem: | (pipe, NE colon!) - Format: email|server:password - Heslo je Gmail App Password (16 znaků) - Vytvoř na: https://myaccount.google.com/apppasswords - Žádné mezery na začátku/konci! - Pouze jedna řádka!
Příklad:
petr@gmail.com|smtp.gmail.com:abcdefghijklmnop
Práva (obsahuje heslo!):
sudo chmod 640 /etc/dma/auth.conf sudo chown root:mail /etc/dma/auth.conf
Krok 4: Aliasy (přeposílání root → tvůj email)
sudo nano /etc/aliases
Přidej NA ZAČÁTEK:
root: info@petrnosek.cz nosek: info@petrnosek.cz default: info@petrnosek.cz
Reload aliases:
sudo newaliases
💡 Jak to funguje: - Email na root → automaticky se přepošle na info@petrnosek.cz - dma nativně podporuje /etc/aliases - Žádný wrapper script potřeba!
Krok 5: Test
# Jednoduchý test echo "Test dma setup" | mail -s "DMA Test" info@petrnosek.cz # Počkej 10 sekund sleep 10 # Zkontroluj queue (měla by být prázdná) sudo dma -q # Pokud queue není prázdná → něco je špatně # Verbose flush pro debug: sudo dma -q -v
📂 Jak dma funguje
dma není daemon!
DŮLEŽITÉ: dma NENÍ persistentní daemon jako Postfix/Sendmail.
Jak to funguje: 1. Přijde email (např. mail -s "Test" user@example.com) 2. dma vytvoří soubory ve frontě (/var/spool/dma/) 3. dma OKAMŽITĚ spustí proces pro odeslání 4. Po odeslání se proces ukončí 5. Žádný běžící daemon v pozadí
To znamená: - ✅ Minimální resource usage (žádný daemon běží pořád) - ✅ Automatické odesílání (ne jako DEFER mode) - ❌ Pokud selže TLS → proces zamrzne a visí
Fronta (Queue) - Jak to funguje
Lokace: /var/spool/dma/
Soubory ve frontě:
M1400a4.xxxxx # Message soubor (obsah emailu) Q1400a4.xxxxx # Queue soubor (metadata - komu, od koho) flush # Lock soubor (když běží flush)
Stavy: - Prázdná queue = všechny emaily odeslané ✅ - Plná queue = emaily čekají (možná problém) ⚠️ - Soubory starší než 1 hodina = něco je špatně! ❌
📋 Užitečné příkazy
Kontrola fronty
# Zobraz frontu (co čeká na odeslání) sudo dma -q # Prázdný output = všechno odesláno ✅ # Neprázdný output = emaily čekají
Manuální flush (vynutit odeslání)
# Odešli všechny emaily ve frontě sudo dma -q flush # S verbose výstupem (debug) sudo dma -q -v
💡 Kdy použít: - Pokud emaily visí ve frontě - Po změně konfigurace - Pro debug (verbose mode)
Přímé odeslání (bypassing queue)
# Odešli email PŘÍMO (verbose, pro debug) echo "Test message" | dma -v recipient@example.com # Sleduj přesně co se děje: # - Connection attempt # - TLS handshake # - SMTP commands # - Authentication # - Message delivery
Zabití zamrzlých procesů
# Pokud dma procesy visí (zamrzly při TLS handshake) sudo pkill -9 dma sudo pkill -9 sendmail # Verifikuj, že jsou pryč ps aux | grep dma | grep -v grep
💡 Kdy použít: - Procesy visí několik minut - Queue se neodesílá - Po změně TLS konfigurace (STARTTLS přidáno)
Debug - sledování procesů
# Kolik dma procesů běží? ps aux | grep dma | grep -v grep # Realtime sledování procesů watch -n 1 'ps aux | grep dma | grep -v grep' # Pokud vidíš procesy starší než 5 minut → problém!
Kontrola konfigurace
# Zobraz aktivní konfiguraci grep -v '^#' /etc/dma/dma.conf | grep -v '^$' # Měl bys vidět: # SMARTHOST smtp.gmail.com # PORT 587 # ALIASES /etc/aliases # SPOOLDIR /var/spool/dma # AUTHPATH /etc/dma/auth.conf # SECURETRANSFER # STARTTLS # MAILNAME /etc/mailname
Testování SMTP konektivity
# Test, jestli je port 587 dostupný timeout 5 bash -c "</dev/tcp/smtp.gmail.com/587" && echo "✅ OK" || echo "❌ BLOCKED" # Test s telnet (detailed) telnet smtp.gmail.com 587 # Měl bys vidět: 220 smtp.google.com ESMTP # Ukonči: Ctrl+] → quit
Čištění staré fronty
# Smaž všechny emaily ve frontě (OPATRNĚ!) sudo rm -f /var/spool/dma/M* sudo rm -f /var/spool/dma/Q* # Nebo jen staré emaily (>24 hodin) sudo find /var/spool/dma -name "M*" -mtime +1 -delete sudo find /var/spool/dma -name "Q*" -mtime +1 -delete
⚠️ POZOR: Tímto TRVALE smažeš neodeslané emaily!
🔍 Troubleshooting
Problém: Queue není prázdná
# 1. Zkontroluj queue sudo dma -q # 2. Pokus se odeslat s verbose sudo dma -q -v # 3. Hledej error message: # - "connection refused" → firewall/network # - "authentication failed" → špatné heslo # - "TLS handshake failed" → chybí STARTTLS
Problém: Procesy visí
# Symptom: Procesy běží 10+ minut ps aux | grep dma # Příčina: TLS problém (nejčastěji chybí STARTTLS) # Řešení: # 1. Zabij procesy sudo pkill -9 dma # 2. Zkontroluj TLS config grep -E "SECURETRANSFER|STARTTLS" /etc/dma/dma.conf # MUSÍ být OBĚ! # 3. Flush queue sudo dma -q -v
Problém: “authentication failed”
# Příčina: Špatné Gmail App Password nebo formát auth.conf # 1. Vygeneruj NOVÉ App Password # https://myaccount.google.com/apppasswords # 2. Zkontroluj formát auth.conf sudo cat /etc/dma/auth.conf # MUSÍ být: email|server:password (pipe!) # 3. Vytvoř nový clean soubor sudo tee /etc/dma/auth.conf > /dev/null <<'EOF' your-email@gmail.com|smtp.gmail.com:new-app-password EOF sudo chmod 640 /etc/dma/auth.conf sudo chown root:mail /etc/dma/auth.conf # 4. Test echo "Auth test" | dma -v info@petrnosek.cz
Problém: Emaily jdou do SPAMu
# Příčina: Gmail vidí sender jako spam # Řešení 1: Použij platnou Gmail adresu jako "from" # V auth.conf použij svůj skutečný Gmail # Řešení 2: V Gmailu označ jako "Not Spam" # Řešení 3: Vytvoř Gmail filtr # From: homeserver@* # Action: Never send to Spam
📊 Monitoring & Logs
Kde dma loguje?
dma NELOGUJE do samostatného souboru! Používá syslog.
Debian/Ubuntu:
# journalctl (systemd) sudo journalctl -t dma -n 50 # Realtime sledování sudo journalctl -t dma -f # Pokud máš rsyslog: sudo grep dma /var/log/syslog sudo tail -f /var/log/syslog | grep dma
💡 Co hledáš v lozích: - ✅ “accepted” / “delivered” = úspěch - ❌ “authentication failed” = špatné heslo - ❌ “connection refused” = firewall - ❌ “TLS handshake failed” = chybí STARTTLS
Vytvoření dedikovaného mail.log (volitelné)
Pokud chceš dedikovaný log soubor:
# rsyslog konfigurace sudo tee /etc/rsyslog.d/50-dma.conf > /dev/null <<'EOF' :programname, isequal, "dma" /var/log/mail.log & stop EOF # Restart rsyslog sudo systemctl restart rsyslog # Vytvoř log soubor sudo touch /var/log/mail.log sudo chmod 644 /var/log/mail.log
Pravidelná kontrola (monitoring script)
#!/bin/bash # /opt/docker/scripts/check-dma-queue.sh QUEUE_COUNT=$(sudo dma -q | wc -l) OLD_MESSAGES=$(sudo find /var/spool/dma -name "M*" -mmin +60 | wc -l) if [ $QUEUE_COUNT -gt 0 ]; then echo "⚠️ WARNING: $QUEUE_COUNT emails in queue" fi if [ $OLD_MESSAGES -gt 0 ]; then echo "❌ ERROR: $OLD_MESSAGES emails stuck >1 hour" echo "Sending alert..." echo "DMA queue stuck: $OLD_MESSAGES old messages" | mail -s "ALERT: DMA Queue Issue" root fi
Přidej do cronu:
# Kontrola každých 15 minut */15 * * * * /opt/docker/scripts/check-dma-queue.sh
✅ Finální Checklist (po instalaci)
- ☐ dma nainstalován (
apt-get install dma) - ☐
/etc/dma/dma.confnakonfigurován- ☐
SMARTHOST smtp.gmail.com - ☐
PORT 587 - ☐
ALIASES /etc/aliases(ODKOMENTOVANÉ!) - ☐
SECURETRANSFER - ☐
STARTTLS(KRITICKÉ!)
- ☐
/etc/dma/auth.confvytvořen- ☐ Formát:
email|server:password - ☐ Práva: 640, owner: root:mail
- ☐ Gmail App Password použitý (NE běžné heslo)
- ☐
/etc/aliasesnakonfigurován- ☐
root: your-email@example.com - ☐
newaliasesspuštěno
- ☐ Test odeslání úspěšný
- ☐
echo "test" | mail -s "Test" your-email@example.com - ☐ Email dorazil do schránky
- ☐ Queue je prázdná (
sudo dma -q)
- ☐ SMTP konektivita OK
- ☐ Port 587 dostupný
- ☐ TLS funguje (STARTTLS)
- ☐ Žádné visící procesy
- ☐
ps aux | grep dma(prázdné nebo čerstvé)
📖 Reference
dma man page:
man dma man dma.conf
Gmail SMTP: - App Passwords: https://myaccount.google.com/apppasswords - SMTP settings: https://support.google.com/a/answer/176600
Debian wiki: - https://wiki.debian.org/dma
🎯 Klíčové poznatky z troubleshootingu
1. STARTTLS je KRITICKÝ pro Gmail!
# NE jen toto: SECURETRANSFER # MUSÍ být OBĚ: SECURETRANSFER STARTTLS
Bez STARTTLS: - dma procesy zamrznou - Queue se neodesílá - Procesy visí hodiny
2. ALIASES musí být odkomentované!
# Špatně: #ALIASES /etc/aliases # Správně: ALIASES /etc/aliases
Bez tohoto: - dma ignoruje /etc/aliases - root emaily nejdou na tvůj email - Musíš specifikovat plnou adresu
3. auth.conf formát je kritický
# Správně (pipe separator): email@gmail.com|smtp.gmail.com:password # Špatně (colon separator): email@gmail.com:smtp.gmail.com:password
4. dma není daemon
- Spouští se on-demand
- Po odeslání se ukončí
- Žádný persistent process
- Pokud proces visí >5 minut → problém!
5. Queue != daemon běží
# Queue plná ≠ dma běží v pozadí # Queue plná = problém s odesíláním (TLS/auth/network)
🚀 Quick Commands Reference
# Test odeslání echo "test" | mail -s "Test" user@example.com # Kontrola fronty sudo dma -q # Flush fronty (verbose) sudo dma -q -v # Zabít zamrzlé procesy sudo pkill -9 dma # Sledování procesů ps aux | grep dma | grep -v grep # Debug - přímé odeslání echo "test" | dma -v user@example.com # Test SMTP konektivity timeout 5 bash -c "</dev/tcp/smtp.gmail.com/587" && echo OK # Zobraz aktivní config grep -v '^#' /etc/dma/dma.conf | grep -v '^$' # Kontrola auth.conf sudo cat /etc/dma/auth.conf # Logy sudo journalctl -t dma -n 50