WordPress a SMTP relay: kontaktní formuláře a reset hesla přes smtp.topemail.cz, s pluginem i bez něj
Jak dostat všechny e-maily z WordPressu (formuláře, reset hesla, notifikace) na SMTP relay. Nastavení pluginem a varianta bez pluginu přes konstanty ve wp-config.php a hook phpmailer_init, správná From adresa a značky pro párování.
WordPress odesílá e-maily funkcí wp_mail(): odkazy pro reset hesla, upozornění na komentáře, zprávy z kontaktního formuláře, notifikace z pluginů. Ve výchozím stavu wp_mail() předá zprávu PHP funkci mail() a ta ji odešle přímo z webového serveru, bez DKIM podpisu a z IP adresy, kterou sdílíte s desítkami cizích webů. Správným řešením je SMTP relay. V článku ukážeme dvě cesty: pluginem pro ty, kdo nechtějí sahat do kódu, a bez pluginu pro vývojáře, kteří mají WordPress ve verzovaném repozitáři a každý plugin navíc jim vadí.
Hodnoty, které budete potřebovat
Server: smtp.topemail.cz
Port: 587 (STARTTLS), nebo 465 (TLS)
Uživatel: CLIENT_ID
Heslo: SECRET
Odesílatel: adresa na doméně ověřené v TopEmail, např. info@vas-web.cz
Před nastavením ověřte doménu: TXT topemail._domainkey, include:spf.topemail.cz v SPF a _dmarc. Jak na to, popisuje návod k SPF, DKIM a DMARC.
Cesta 1: plugin
Nejrychlejší. Nainstalujte WP Mail SMTP nebo FluentSMTP, zvolte Other SMTP, zadejte hodnoty výše a vynuťte From adresu. Podrobný postup s obrázky polí máme v návodu pro WooCommerce; pro web bez e-shopu je identický, jen vynecháte část o nastavení WooCommerce.
Cesta 2: bez pluginu
wp_mail() interně používá knihovnu PHPMailer a před odesláním volá akci phpmailer_init. Stačí se na ni napojit a přepnout PHPMailer na SMTP. Udělejte to jako mu-plugin: soubory v wp-content/mu-plugins/ se načítají vždy, nelze je vypnout v administraci a nejsou závislé na šabloně.
Přihlašovací údaje patří do wp-config.php, ne do kódu, který by mohl skončit v repozitáři:
// wp-config.php
define( 'TOPEMAIL_SMTP_USER', 'CLIENT_ID' );
define( 'TOPEMAIL_SMTP_PASS', 'SECRET' );
define( 'TOPEMAIL_FROM', 'info@vas-web.cz' );
define( 'TOPEMAIL_FROM_NAME', 'Můj web' );
A samotný mu-plugin:
<?php
// wp-content/mu-plugins/topemail-smtp.php
if ( ! defined( 'ABSPATH' ) ) exit;
add_action( 'phpmailer_init', function ( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.topemail.cz';
$phpmailer->Port = 587;
$phpmailer->SMTPSecure = 'tls'; // STARTTLS; pro port 465 použijte 'ssl'
$phpmailer->SMTPAuth = true;
$phpmailer->Username = TOPEMAIL_SMTP_USER;
$phpmailer->Password = TOPEMAIL_SMTP_PASS;
} );
add_filter( 'wp_mail_from', fn() => TOPEMAIL_FROM );
add_filter( 'wp_mail_from_name', fn() => TOPEMAIL_FROM_NAME );
Filtry wp_mail_from a wp_mail_from_name jsou důležité: bez nich WordPress posílá z wordpress@vas-web.cz, což je sice na vaší doméně, ale působí nedůvěryhodně, a hlavně některé pluginy dosazují jiné odesílatele. Filtr s vysokou prioritou je přepíše:
add_filter( 'wp_mail_from', fn() => TOPEMAIL_FROM, PHP_INT_MAX );
Používejte ho, pokud máte formulářový plugin, který trvá na From adrese návštěvníka.
Kontaktní formuláře: From vs. Reply-To
Klasická chyba: formulář pošle zprávu s From nastaveným na e-mail návštěvníka (jan.novak@gmail.com), aby šlo kliknout na „Odpovědět". Relay takovou zprávu odmítne (550 5.7.1, From není na ověřené doméně) a i bez relay by ji Gmail zahodil, protože porušuje DMARC gmail.com. Správně:
- From: vaše adresa na ověřené doméně, např.
formular@vas-web.cz. - Reply-To: adresa návštěvníka. Tlačítko „Odpovědět" funguje stejně.
V Contact Form 7 to znamená v záložce E-mail pole „Od" [_site_title] <formular@vas-web.cz> a do „Další hlavičky" řádek Reply-To: [your-email]. WPForms a Gravity Forms mají pro Reply-To samostatné pole.
Značky pro párování
Relay umí z hlaviček X-TopEmail-Tag-<klíč> vyrobit značky, které se vrátí ve webhooku a v historii. Ve WordPressu je přidáte filtrem wp_mail:
add_filter( 'wp_mail', function ( $args ) {
$headers = (array) ( $args['headers'] ?? [] );
$headers[] = 'X-TopEmail-Tag-source: wordpress';
$args['headers'] = $headers;
return $args;
} );
Hodí se, když z jednoho účtu posílá web i e-shop nebo fakturace a chcete ve statistikách vidět, kolik čeho odešlo.
Test
Nejrychlejší test bez klikání je WP-CLI:
wp eval 'var_dump( wp_mail( "vas@gmail.com", "Test SMTP", "Ahoj z WordPressu" ) );'
bool(true) znamená, že PHPMailer zprávu předal relay. Pak zprávu otevřete v Gmailu, Zobrazit originál, a zkontrolujte SPF, DKIM a DMARC PASS. Druhý test je Zapomenuté heslo na přihlašovací stránce: je to nejkritičtější e-mail webu a musí dorazit do pár sekund.
Pokud wp_mail() vrátí false, chybu zjistíte akcí wp_mail_failed:
add_action( 'wp_mail_failed', function ( $error ) {
error_log( 'wp_mail: ' . $error->get_error_message() );
} );
V logu pak uvidíte přímo odpověď serveru, typicky 535 5.7.8 Authentication credentials invalid (špatné údaje) nebo 550 5.7.1 (odesílatel mimo ověřenou doménu).
Časté chyby
- Dva mechanismy najednou. SMTP plugin a vlastní
phpmailer_inithook se budou přepisovat. Zvolte jedno. - Heslo v repozitáři. Konstanty patří do
wp-config.php, který je v.gitignore. Pokud klíč unikl, zneplatněte ho v dashboardu a vygenerujte nový. - Multisite s více doménami. Každý web v síti musí posílat z domény, která je v TopEmail ověřená; buď ověřte všechny, nebo posílejte z jedné společné.
- Staging posílá reálným lidem. Na stagingu použijte testovací klíč nebo odesílání vypněte filtrem
pre_wp_mail. - Hosting blokuje port 587. Přepněte na
465aSMTPSecure = 'ssl'.
Shrnutí
Bez pluginu stačí jeden mu-plugin s phpmailer_init a čtyři konstanty ve wp-config.php; s pluginem pět polí v administraci. V obou případech dbejte na From adresu z ověřené domény a návštěvníka formuláře dávejte do Reply-To. E-maily pak mají DKIM podpis, stav doručení v dashboardu a prvních 1 000 měsíčně je zdarma. Co relay přesně umí a jak se liší od REST API, shrnuje přehled 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 →