Migrace z vlastního Postfixu: proč e-maily z VPS padají do spamu a jak Postfix přesměrovat přes smtp.topemail.cz
Vlastní VPS s Postfixem posílá e-maily, které končí ve spamu nebo se vracejí: reputace IP, chybějící PTR, blokovaný port 25, žádný DKIM. Návod, jak nechat Postfix na místě a všechnu odchozí poštu poslat přes relay smtp.topemail.cz: relayhost, SASL, TLS, přepis odesílatele, test a ladění z logu.
Aplikace na VPS posílá e-maily přes lokální Postfix. Fungovalo to roky, až jednou Gmail začne vracet 550-5.7.1 … likely unsolicited mail a Seznam odkládá doručení o hodiny. Provozovat vlastní odchozí poštovní server v roce 2026 znamená hlídat reputaci IP, DNS, DKIM a změny pravidel velkých příjemců; práce, kterou chcete dělat jen tehdy, když je pošta váš byznys. Dobrá zpráva: Postfix nemusíte rušit. Stačí mu říct, aby všechnu odchozí poštu předával relay serveru, a aplikace o změně ani nevědí.
Proč e-mail z vlastního VPS končí ve spamu
- Reputace IP adresy. IP od poskytovatele VPS měla před vámi někoho jiného, a často někoho, kdo spamoval. Rozsahy cloudových poskytovatelů jsou navíc na blokovaných seznamech plošně, protože z nich spam chodí nejčastěji. Postavit reputaci nové IP trvá týdny stabilního, čistého objemu, který malá aplikace nemá.
- Chybějící nebo nesedící PTR záznam. Příjemci kontrolují, že reverzní záznam IP (
1.2.3.4 → mail.firma.cz) odpovídá jménu, kterým se server hlásí vHELO, a že to jméno míří zpět na tutéž IP. U VPS bývá PTRvps-1234.provider.netnebo žádný. Gmail e-maily bez PTR rovnou odmítá. - Blokovaný port 25. Řada poskytovatelů (a prakticky všechny domácí přípojky) odchozí port 25 blokuje nebo povoluje na žádost. Postfix se pak marně pokouší doručit a zpráva po pěti dnech vyprší s hláškou connection timed out.
- Žádný DKIM. Postfix sám nepodepisuje; potřebujete OpenDKIM nebo Rspamd, správu klíčů a jejich rotaci. Bez DKIM nemá DMARC o co se opřít a od roku 2024 Gmail i Yahoo autentizaci vyžadují.
- Žádná zpětná vazba. Když Seznam zprávu přijme a potichu zahodí do spamu, Postfix o tom neví. Bounce vidíte jen v
mail.log, stížnosti vůbec.
Relay to řeší za vás: odesílá z IP adres s hlídanou reputací, podepisuje DKIM vaší doménou, používá port 587 místo 25, a u každé zprávy ukazuje stav včetně důvodu odmítnutí. Co od vás příjemci chtějí, shrnuje článek o požadavcích Gmailu, Yahoo a Seznamu.
Co potřebujete
- Ověřenou doménu v TopEmail: TXT
topemail._domainkey,include:spf.topemail.czv SPF,_dmarc. Postup v návodu k SPF, DKIM a DMARC. - API klíč:
clientIdasecret. - Na serveru Postfix a SASL knihovny. Na Debianu/Ubuntu:
apt install libsasl2-modules; na RHEL/Rocky:dnf install cyrus-sasl-plain.
Konfigurace Postfixu
Přihlašovací údaje do samostatného souboru /etc/postfix/sasl_passwd:
[smtp.topemail.cz]:587 CLIENT_ID:SECRET
Formát je cíl uživatel:heslo; první dvojtečka odděluje uživatele od hesla. Soubor převeďte na databázi a zabezpečte:
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
Do /etc/postfix/main.cf přidejte (nebo přepište stávající hodnoty):
# Veškerá odchozí pošta přes relay
relayhost = [smtp.topemail.cz]:587
# SASL autentizace
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
# TLS povinné (STARTTLS na 587)
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_loglevel = 1
Hranaté závorky kolem hostname vypínají vyhledávání MX záznamů, takže Postfix se připojí přímo na smtp.topemail.cz. smtp_tls_security_level = encrypt zajistí, že bez TLS se přihlašovací údaje nikdy neodešlou. Na RHEL je cesta k certifikátům /etc/pki/tls/certs/ca-bundle.crt.
Pokud váš poskytovatel blokuje i port 587, použijte implicitní TLS na 465:
relayhost = [smtp.topemail.cz]:465
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
a stejný port uveďte i v sasl_passwd. Pak:
postfix check && systemctl reload postfix
Přepis odesílatele: nejčastější důvod odmítnutí
Relay přijme jen zprávy s odesílatelem na ověřené doméně. Cron, logrotate, fail2ban nebo aplikace spuštěná pod systémovým uživatelem posílají z root@vps-1234.provider.net nebo www-data@localhost, a relay odpoví 550 5.7.1. Řešení je smtp_generic_maps, který přepíše adresy odesílatele těsně před předáním relay:
# /etc/postfix/generic
root@vps-1234.provider.net server@firma.cz
www-data@vps-1234.provider.net app@firma.cz
@vps-1234.provider.net server@firma.cz
@localhost server@firma.cz
# main.cf
smtp_generic_maps = hash:/etc/postfix/generic
postmap /etc/postfix/generic && systemctl reload postfix
Řádek začínající @doména je záchytný: cokoli z té domény se přepíše na jednu adresu. Přepis se týká obálky i hlavičky From, přesně to, co relay kontroluje. Pokud chcete, aby chybové zprávy z cronu chodily vám, nastavte navíc v /etc/aliases root: admin@firma.cz a spusťte newaliases.
Test a kontrola
echo "Test relay $(date)" | mail -s "Postfix přes TopEmail" -r server@firma.cz vas@gmail.com
(mail je z balíku bsd-mailx nebo mailutils; bez něj použijte sendmail -f server@firma.cz vas@gmail.com < zprava.txt.) Sledujte log:
journalctl -u postfix -f # nebo tail -f /var/log/mail.log
Úspěch vypadá takto:
postfix/smtp[1234]: 7A2B3C: to=<vas@gmail.com>, relay=smtp.topemail.cz[…]:587,
delay=0.6, status=sent (250 2.0.0 Queued as cm3x1…)
Queued as <id> je ID e-mailu v TopEmail: stav dohledáte v dashboardu nebo přes GET /api/email/{id}. Pak zprávu otevřete v Gmailu, Zobrazit originál, a zkontrolujte SPF, DKIM a DMARC PASS s podpisem d=firma.cz.
Časté hlášky v logu a co znamenají:
| Hláška | Příčina |
|---|---|
535 5.7.8 Authentication credentials invalid | překlep v sasl_passwd, zapomenutý postmap, nebo klíč zneplatněný |
550 5.7.1 … not on a verified domain | odesílatel mimo ověřenou doménu; doplňte generic mapu |
SASL authentication failure: No worthy mechs found | chybí libsasl2-modules / cyrus-sasl-plain |
TLS is required, but was not offered | připojujete se na špatný port, nebo mezi vámi a relay je proxy |
connect to smtp.topemail.cz[…]:587: Connection timed out | firewall poskytovatele; zkuste 465 s smtp_tls_wrappermode |
452 4.3.1 Insufficient credit | dobijte kredit; Postfix zprávu zopakuje sám |
Postfix dočasné chyby (4xx) sám opakuje podle maximal_queue_lifetime (výchozí 5 dní), takže krátký výpadek sítě nic neztratí. Frontu zkontrolujete příkazem mailq, po opravě chyby ji protlačíte postqueue -f.
Co s původním nastavením
- Port 25 a MX záznam. Pokud server zároveň přijímá poštu (má MX), relay se týká jen odesílání; příjem (
smtpd) nechte beze změny. Pokud nepřijímá, zavřete port 25 ve firewallu. - OpenDKIM odinstalujte nebo vypněte; podepisuje relay a dvojí podpis jen mate.
- SPF: odeberte z něj IP adresu VPS (
ip4:1.2.3.4), jakmile přes ni nic neodchází, a ponechteinclude:spf.topemail.cz. Méně mechanismů, menší riziko překročení limitu deseti dotazů. - Limity: relay přijme až 50 příjemců na zprávu a odesílání ve velkém objemu brzdí hlavičkou
421 4.7.0 Too many messages, slow down, kterou Postfix ctí a zopakuje. Pro hromadné odesílání z fronty použijte radši REST API.
Postup je stejný i pro Exim nebo sendmail, jen s jinou syntaxí; princip „smarthost na portu 587 s SASL a TLS" mají všechny. Pokud migrujete z jiné e-mailové služby místo z vlastního serveru, projděte checklist migrace.
Shrnutí
Vlastní Postfix na VPS prohrává na reputaci IP, PTR, portu 25 a DKIM, a nikdy se nedozví, co se s poštou stalo. Pět řádků v main.cf (relayhost, SASL, smtp_tls_security_level = encrypt), sasl_passwd s CLIENT_ID:SECRET a generic mapa pro systémové odesílatele pošlou všechno přes smtp.topemail.cz, bez změny v aplikacích. V logu uvidíte 250 2.0.0 Queued as <id> a v dashboardu stav každé zprávy. Cena je 0,06 Kč za e-mail, prvních 1 000 měsíčně zdarma, bez paušálu; co relay umí a jaké stavy vrací, najdete v přehledu API a SMTP.
Transakční e-maily z vaší domény přes API nebo SMTP, od 0,025 do 0,06 Kč za e-mail podle objemu, prvních 1 000 e-mailů měsíčně zdarma. Registrace zdarma, bez platební karty.
Registrovat zdarma →