Webhosting

Kontaktní formulář a e-maily přes SMTP

Jak z PHP webu spolehlivě odesílat e-maily přes SMTP knihovnou PHPMailer.

2 min čtení·Aktualizováno 28. října 2026

Funkce mail() potřebuje na serveru poštovní program a e-maily z ní často končí ve spamu nebo nedorazí. Spolehlivější je posílat poštu přes SMTP schránky, kterou už máš (u poskytovatele e-mailu ke své doméně, Gmail apod.), knihovnou PHPMailer.

1. Údaje k SMTP

U poskytovatele e-mailu zjisti server, port a šifrování – obvykle port 587 se STARTTLS nebo 465 se SSL. U Gmailu je server smtp.gmail.com a místo hesla k účtu použiješ heslo aplikace (vyžaduje zapnuté dvoufázové ověření).

2. PHPMailer

Z github.com/PHPMailer/PHPMailer stáhni poslední release, rozbal ho a složku src nahraj do www/phpmailer/.

3. Formulář

<form method="post" action="/odeslat.php">
  <input name="email" type="email" required>
  <textarea name="zprava" required maxlength="5000"></textarea>
  <input name="web" hidden>
  <button>Odeslat</button>
</form>

Skryté pole web člověk nevyplní, spamboti ano – podle toho je odfiltruješ.

4. Odeslání – www/odeslat.php

<?php
use PHPMailer\PHPMailer\PHPMailer;
require __DIR__ . '/phpmailer/src/Exception.php';
require __DIR__ . '/phpmailer/src/PHPMailer.php';
require __DIR__ . '/phpmailer/src/SMTP.php';

$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$zprava = trim($_POST['zprava'] ?? '');
if (!$email || $zprava === '' || !empty($_POST['web'])) {
    exit('Vyplň prosím e-mail a zprávu.');
}

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host = 'smtp.example.cz';
    $mail->SMTPAuth = true;
    $mail->Username = 'web@example.cz';
    $mail->Password = 'heslo';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;
    $mail->CharSet = 'UTF-8';
    $mail->setFrom('web@example.cz', 'Web');
    $mail->addAddress('ja@example.cz');
    $mail->addReplyTo($email);
    $mail->Subject = 'Zpráva z webu';
    $mail->Body = $zprava;
    $mail->send();
    echo 'Díky, zpráva odešla.';
} catch (Exception $e) {
    error_log('Mail: ' . $mail->ErrorInfo);
    echo 'Zprávu se nepodařilo odeslat.';
}

Na co si dát pozor

  • Odesílatel (setFrom) musí být adresa schránky, přes kterou posíláš. Adresa návštěvníka patří do addReplyTo – na zprávu pak rovnou odpovíš.
  • Pro port 465 nastav PHPMailer::ENCRYPTION_SMTPS.
  • Chyby odeslání najdeš v logu (Chyby PHP a error log).
Pro web si založ zvláštní schránku, ne svou hlavní. Heslo nech jen v souboru .php – jeho obsah se návštěvníkovi nezobrazí, na rozdíl od .txt nebo .json.

Webhosting od 30 Kč měsíčně

Statický web, WordPress nebo web s databází.

Zobrazit balíčky