Zpět na blog
Vývoj Publikováno 16.09.2026 7 min čtení

Když kontaktní formulář řekne „Děkujeme“, ale žádný e-mail nedorazí

Kontaktní formulář se může porouchat, aniž by kdokoli viděl chybu: návštěvník dostane vlídné potvrzení, vy nedostanete nic. Proč se to děje a jak si toho včas všimnout.

Představte si malou fyzioterapeutickou ordinaci. Její web má kontaktní formulář a formulář funguje – nebo to tak alespoň vypadá. Návštěvníci jej vyplní, kliknou na „Odeslat“ a uvidí vlídné „Děkujeme, brzy se vám ozveme“. Co nikdo nevidí: zprávy už nějakou dobu do schránky ordinace nedocházejí. Žádná chyba, žádná vrácená zpráva v ničí schránce, nikde žádné červené světlo. Formulář selhává potichu.

Proč si toho nikdo nevšimne

Děkovací stránka formuláře obvykle znamená jen jedno: web zprávu předal dál. Zda ji poštovní server přijme, zařadí do spamu nebo po cestě odmítne, se děje později, mimo dohled formuláře. Funkce mail() v PHP například hlásí úspěch, jakmile místní systém přijme zprávu k doručení – ne když se k někomu dostane. Návštěvník tedy dostane potvrzení a jde dál. Majitel mezitím vidí prázdnou schránku a předpokládá, že jde jen o klidný měsíc. Méně poptávek samo o sobě jen zřídka znepokojí: dovolené, počasí, ekonomika – vždy existuje vysvětlení, které zní věrohodněji než „formulář je rozbitý“.

Hypotetická časová osa
  1. Den 0
    Přes noc proběhne rutinní aktualizace pluginu. Web vypadá přesně jako předtím.
  2. Den 1
    Dorazí poslední zpráva. Nikdo neví, že je poslední.
  3. Dny 2–13
    Návštěvníci dál odesílají formulář a dál vidí „Děkujeme“. Do schránky nedorazí nic.
  4. Den 14
    Někdo zavolá a mírně podrážděně se ptá, proč mu nikdo nikdy neodpověděl na jeho dotaz.
  5. Den 15
    Příčina je nalezena do hodiny. Zprávy z oněch dvou týdnů jsou pryč – pokud si formulář neuchovával i kopii.
Nejde o skutečný případ – ale o velmi typický vzorec.

Obvyklé příčiny

  • Změnilo se heslo SMTP nebo poskytovatel e-mailu. Formulář se dál přihlašuje se starými údaji a poštovní server odmítá – z pohledu návštěvníka potichu.
  • PHP mail() bez ověření. Webový server odesílá poštu přímo, bez přihlášení k řádnému poštovnímu serveru. Mnoho přijímajících serverů považuje takovou poštu za podezřelou: skončí ve spamu nebo je rovnou odmítnuta.
  • SPF, DKIM a DMARC spolu nesouhlasí. Mnoho formulářů vkládá adresu návštěvníka do pole From. Zpráva pak tvrdí, že pochází například z adresy gmail.com, ale odesílá ji váš webový server – přesně to má DMARC zastavit.
  • Aktualizace pluginu nebo změna šablony rozbije formulář nebo jeho CAPTCHA. Změněná šablona vynechá pole, skript se přestane načítat nebo se widget CAPTCHA objeví bez svého skriptu – a každé odeslání neprojde validací.
  • Přijímající schránka je plná. Poštovní server odmítá nové zprávy a vrácená zpráva jde na adresu, kterou nikdo nečte.
  • Cookie lišta blokuje skript formuláře. Pokud nástroj pro souhlas zařadí CAPTCHA nebo skript formuláře do kategorie „marketing“, mohou návštěvníci, kteří cookies odmítnou, dostat formulář, který nelze odeslat, nebo jehož odeslání jsou odmítnuta kvůli chybějícímu tokenu.
  • Prošlý certifikát TLS nebo doména. Návštěvníci uvidí varování prohlížeče a odejdou, nebo poštovní server už není bezpečně dosažitelný. Pokud vyprší doména přijímající schránky, pošta na ni prostě přestane chodit.
  • Vrstva cache poskytuje zastaralé stránky. Cache celých stránek může doručit formulář s prošlým bezpečnostním tokenem (nonce nebo token CSRF). Server odeslání odmítne a podle nastavení návštěvník neuvidí žádnou jasnou chybu.

Past jménem adresa From

Třetí příčina si zaslouží bližší pohled, protože ji mnoho nastavení formulářů má ve výchozím stavu zabudovanou. DMARC kontroluje, zda doména ve viditelné adrese From odpovídá doméně, za kterou ručí SPF nebo DKIM. Pokud formulář posílá zprávu „od“ adresy návštěvníka, váš server není oprávněn za tuto doménu odesílat, takže kontrola selže. Podle politiky DMARC domény návštěvníka a podle vašeho vlastního poskytovatele e-mailu zpráva skončí ve spamu nebo je odmítnuta. Oprava je jednoduchá: odesílejte z adresy ve vlastní doméně a adresu návštěvníka uveďte v Reply-To. Kliknutím na „Odpovědět“ se k návštěvníkovi stále dostanete.

Dva způsoby, jak odeslat stejnou zprávu z formuláře
Křehké
  • From: adresa návštěvníka
  • Žádné Reply-To
  • PHP mail() přímo z webového serveru
  • Žádné SPF, DKIM ani DMARC pro odesílající doménu
  • Zpráva existuje pouze jako e-mail
Robustní
  • From: adresa ve vlastní doméně, např. form@vasedomena
  • Reply-To: adresa návštěvníka
  • SMTP s ověřením nebo odesílací služba
  • SPF, DKIM a DMARC nastavené a sladěné
  • Kopie se ukládá i do databáze
Pravý sloupec nedá skoro žádnou práci navíc – jde většinou o konfiguraci.

Co dělat

  1. 1Pravidelně posílejte testovací zprávu přes vlastní formulář – alespoň jednou měsíčně a vždy po aktualizacích, změnách šablony nebo změnách nastavení pošty. Jasně ji označte jako test, aby na ni nikdo neodpovídal.
  2. 2Znejte svůj běžný rytmus. Pokud formulář obvykle přinese pár zpráv týdně, dva týdny ticha jsou důvodem ke kontrole, ne klidným měsícem.
  3. 3Odesílejte přes SMTP s ověřením – přes svého poskytovatele e-mailu nebo specializovanou odesílací službu – místo spoléhání na PHP mail().
  4. 4V poli From používejte vlastní doménu a adresu návštěvníka v Reply-To. Pak pro tuto doménu nastavte SPF, DKIM a DMARC, aby zprávy kontrolami prošly.
  5. 5Uchovávejte kopii každého odeslání v databázi. Mnoho formulářových pluginů to nabízí, někdy jako doplněk. Pokud pošta selže, poptávky jsou stále k dispozici.
  6. 6Po každé aktualizaci pluginu zkontrolujte formulář – včetně CAPTCHA a také s odmítnutými cookies.

Na takové kontroly se snadno zapomíná, a proto se vyplatí je automatizovat. S účtem a ověřenou doménou může formexposed odeslat jasně označené testovací odeslání a zkontrolovat, zda skutečně dorazí (kontrola doručení, pouze po zapnutí). Rozpozná také ticho – formulář, který obvykle dostává zprávy, náhle nedostává žádné – a kontroluje SPF, DKIM a DMARC e-mailů s oznámeními i vypršení certifikátu TLS a domény. Upozornění dostanete jen tehdy, když se něco změní.

Pokud chcete jen první pohled: bezplatná kontrola na formexposed.com nepotřebuje účet a nic neodesílá. Mimo jiné ukáže, zda je CAPTCHA přítomna, ale nefunkční – widget bez skriptu, veřejný testovací klíč, chyby v prohlížeči –, což je jeden z tišších způsobů, jak formulář přestane fungovat. Zda zprávy skutečně docházejí, potvrdí jen skutečná testovací zpráva, takže ji pošlete ještě dnes.