it:server:dma

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.


sudo apt-get update
sudo apt-get install -y dma

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


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

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!


# 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

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í


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ě! ❌


# Zobraz frontu (co čeká na odeslání)
sudo dma -q
 
# Prázdný output = všechno odesláno ✅
# Neprázdný output = emaily čekají

# 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)


# 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

# 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)


# 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!

# 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

# 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

# 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!


# 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

# 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

# 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

# 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

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


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

#!/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

  • ☐ dma nainstalován (apt-get install dma)
  • /etc/dma/dma.conf nakonfigurován
    • SMARTHOST smtp.gmail.com
    • PORT 587
    • ALIASES /etc/aliases (ODKOMENTOVANÉ!)
    • SECURETRANSFER
    • STARTTLS (KRITICKÉ!)
  • /etc/dma/auth.conf vytvořen
    • ☐ Formát: email|server:password
    • ☐ Práva: 640, owner: root:mail
    • ☐ Gmail App Password použitý (NE běžné heslo)
  • /etc/aliases nakonfigurován
    • root: your-email@example.com
    • newaliases spuš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é)

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


# NE jen toto:
SECURETRANSFER
 
# MUSÍ být OBĚ:
SECURETRANSFER
STARTTLS

Bez STARTTLS: - dma procesy zamrznou - Queue se neodesílá - Procesy visí hodiny


# Š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


# Správně (pipe separator):
email@gmail.com|smtp.gmail.com:password

# Špatně (colon separator):
email@gmail.com:smtp.gmail.com:password

  • Spouští se on-demand
  • Po odeslání se ukončí
  • Žádný persistent process
  • Pokud proces visí >5 minut → problém!

# Queue plná ≠ dma běží v pozadí
# Queue plná = problém s odesíláním (TLS/auth/network)

# 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
  • it/server/dma.1767003322.txt.gz
  • Poslední úprava: 2025/12/29 10:15
  • autor: Petr Nosek