Pro odesílání zpráv na email (např. pro kontaktní formuláře) existuje mnoho způsobů. V PHP můžeme využít např. funkci mail nebo mb_send_mail. Rozdíl mezi funkcemi mail a mb_send_mail:
- mail je pro jednobajtové znakové sady (např. iso nebo ascii)
- mb_send_mail je pro vícebajtové znakové sady, jako je utf-8
Tzn. že se nejčastěji používá funkce mb_send_mail. Tato funkce vyžaduje, aby byla na webhostingu povolena. Např. na Endoře.cz u free tarifu je zakázána. Pak je potřeba použít variantu s použitím SMTP protokolu.
Příklad použití funkce mb_send_mail, zpracování dat v jednom stejném souboru:
Pozn.: v kódu si musíte upravit cílovou adresu. Kód předpokládá název souboru formular.php
<?php
// Nastavení kódování pro správnou českou diakritiku v e-mailech
mb_internal_encoding("UTF-8");
// Příprava proměnných pro následný script
$hlaska = '';
$uspech_zprava = '';
// 1. Kontrola úspěšného odeslání po přesměrování (Metoda GET)
if (isset($_GET['uspech']) && $_GET['uspech'] === 'ano') {
$uspech_zprava = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
}
// 2. Zpracování dat z formuláře (Metoda POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Načtení dat a odstranění nechtěných mezer na začátku a konci textu
$jmeno = isset($_POST['jmeno']) ? trim($_POST['jmeno']) : '';
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
$zprava = isset($_POST['zprava']) ? trim($_POST['zprava']) : '';
$rok = isset($_POST['rok']) ? trim($_POST['rok']) : '';
// 3. Validace vyplnění a jednoduchý antispam (aktuální rok)
if ($jmeno !== '' && $email !== '' && $zprava !== '' && $rok == date('Y')) {
// Validace správného formátu e-mailu
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
// DŮLEŽITÉ: Zde doplňte skutečný e-mail vaší domény
$adresa = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript. ';
$predmet = 'Nová zpráva z mailformu';
// Bezpečnostní očištění hlaviček proti útoku Email Injection
$email_bezpecny = str_replace(array("\r", "\n"), '', $email);
$jmeno_bezpecne = str_replace(array("\r", "\n"), '', $jmeno);
// Nastavení hlaviček e-mailu (Odesílatel z naší domény, odpověď klientovi)
$hlavicky = [
'From' => $adresa,
'Reply-To' => $email_bezpecny,
'MIME-Version' => '1.0',
'Content-Type' => 'text/html; charset=utf-8'
];
// Tělo e-mailu ošetřené proti HTML injection
$obsah_mailu = 'Od: ' . htmlspecialchars($jmeno_bezpecne) . '<br>';
$obsah_mailu .= 'E-mail: ' . htmlspecialchars($email_bezpecny) . '<br><br>';
$obsah_mailu .= 'Text zprávy:<br>' . nl2br(htmlspecialchars($zprava));
// 4. Odeslání e-mailu a přesměrování (PRG vzor)
if (mb_send_mail($adresa, $predmet, $obsah_mailu, $hlavicky)) {
header('Location: formular.php?uspech=ano');
exit; // Okamžité ukončení skriptu
} else {
$hlaska = 'Email se nepodařilo odeslat. Chyba na straně serveru.';
}
} else {
$hlaska = 'Zadali jste neplatný e-mail!';
}
} else {
$hlaska = 'Formulář není správně vyplněný nebo nesouhlasí aktuální rok!';
}
} else {
// Výchozí prázdné hodnoty pro první načtení stránky
$jmeno = '';
$email = '';
$zprava = '';
}
?>
<!doctype html>
<html lang="cs">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Kontaktní formulář</title>
<!-- CDN odkazy pro verzi Bootstrap 5.3.8 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
</head>
<body class="bg-light">
<!-- Centrování formuláře na střed pomocí Bootstrap flexbox gridu -->
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-md-6 col-lg-5">
<div class="card shadow-sm">
<div class="card-body p-4">
<h2 class="card-title text-center h4 mb-4">Napište nám</h2>
<!-- Výpis úspěchu pomocí Bootstrap Alert -->
<?php if ($uspech_zprava): ?>
<div class="alert alert-success" role="alert">
<?= htmlspecialchars($uspech_zprava) ?>
</div>
<?php endif; ?>
<!-- Výpis chyby pomocí Bootstrap Alert -->
<?php if ($hlaska): ?>
<div class="alert alert-danger" role="alert">
<?= htmlspecialchars($hlaska) ?>
</div>
<?php endif; ?>
<form method="POST">
<!-- Pole pro Jméno -->
<div class="mb-3">
<label for="jmeno" class="form-label">Vaše jméno</label>
<input id="jmeno" name="jmeno" type="text" class="form-control" value="<?= htmlspecialchars($jmeno) ?>" required>
</div>
<!-- Pole pro E-mail -->
<div class="mb-3">
<label for="email" class="form-label">Váš e-mail</label>
<input id="email" name="email" type="email" class="form-control" value="<?= htmlspecialchars($email) ?>" required>
</div>
<!-- Pole pro Antispam kontrolu roku -->
<div class="mb-3">
<label for="rok" class="form-label">Aktuální rok (antispam)</label>
<input id="rok" name="rok" type="number" class="form-control" placeholder="<?= date('Y') ?>" required>
</div>
<!-- Pole pro Zprávu -->
<div class="mb-4">
<label for="zprava" class="form-label">Zpráva</label>
<textarea id="zprava" name="zprava" rows="4" class="form-control" required><?= htmlspecialchars($zprava) ?></textarea>
</div>
<!-- Odesílací tlačítko na celou šířku -->
<button type="submit" class="btn btn-primary w-100 py-2">Odeslat zprávu</button>
</form>
</div>
</div> <!-- /card -->
</div>
</div>
</div> <!-- /container -->
<!-- JS script pro Bootstrap verzi 5.3.8 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
</body>
</html>
Další příklad je podobný, ale je rozdělen na dva soubory. Jeden je pouze HTML + JavaScript pro zpracování a odeslání dat do druhého souboru PHP, kde se pouze data zpracují a odešlou na zadaný email. První stránka po zdárném zpracování vypíše hlášku.
První soubor (např. formular.html):
<!doctype html>
<html lang="cs">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AJAX Kontaktní formulář</title>
<!-- OPRAVENO: Kompletní a správný odkaz pro CSS Bootstrap 5.3.8 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
</head>
<body class="bg-light">
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-md-6 col-lg-5">
<div class="card shadow-sm">
<div class="card-body p-4">
<h2 class="card-title text-center h4 mb-4">Napište nám (AJAX)</h2>
<!-- Skrytý alert box pro JavaScriptové zprávy -->
<div id="odpoved-serveru" class="alert d-none" role="alert"></div>
<form id="kontaktni-formular">
<div class="mb-3">
<label for="jmeno" class="form-label">Vaše jméno</label>
<input id="jmeno" name="jmeno" type="text" class="form-control" required>
</div>
<div class="mb-3">
<label for="email" class="form-label">Váš e-mail</label>
<input id="email" name="email" type="email" class="form-control" required>
</div>
<div class="mb-3">
<label for="rok" class="form-label">Aktuální rok (antispam)</label>
<input id="rok" name="rok" type="number" class="form-control" placeholder="2026" required>
</div>
<div class="mb-4">
<label for="zprava" class="form-label">Zpráva</label>
<textarea id="zprava" name="zprava" rows="4" class="form-control" required></textarea>
</div>
<button type="submit" id="tlacitko-odeslat" class="btn btn-primary w-100 py-2">
Odeslat zprávu
</button>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
document.getElementById('kontaktni-formular').addEventListener('submit', function(udalost) {
udalost.preventDefault();
const alertBox = document.getElementById('odpoved-serveru');
const tlacitko = document.getElementById('tlacitko-odeslat');
const formular = udalost.target;
tlacitko.disabled = true;
tlacitko.innerText = 'Odesílám...';
const dataFormulare = new FormData(formular);
fetch('zpracuj.php', {
method: 'POST',
body: dataFormulare
})
.then(odpoved => odpoved.json())
.then(data => {
alertBox.classList.remove('d-none', 'alert-success', 'alert-danger');
if (data.uspech === true) {
alertBox.classList.add('alert-success');
alertBox.innerText = data.zprava;
formular.reset();
} else {
alertBox.classList.add('alert-danger');
alertBox.innerText = data.zprava;
}
})
.catch(chyba => {
alertBox.classList.remove('d-none', 'alert-success');
alertBox.classList.add('alert-danger');
alertBox.innerText = 'Došlo k chybě při spojení se serverem.';
})
.finally(() => {
tlacitko.disabled = false;
tlacitko.innerText = 'Odeslat zprávu';
});
});
</script>
<!-- OPRAVENO: Kompletní a správný odkaz pro JS Bootstrap 5.3.8 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
</body>
</html>
Druhý soubor (např. zpracuj.php):
<?php
header('Content-Type: application/json; charset=utf-8');
mb_internal_encoding("UTF-8");
$odpoved = [
'uspech' => false,
'zprava' => 'Neplatný požadavek.'
];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$jmeno = isset($_POST['jmeno']) ? trim($_POST['jmeno']) : '';
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
$zprava = isset($_POST['zprava']) ? trim($_POST['zprava']) : '';
$rok = isset($_POST['rok']) ? trim($_POST['rok']) : '';
if ($jmeno !== '' && $email !== '' && $zprava !== '' && $rok == date('Y')) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$adresa = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript. ';
$predmet = 'Nová zpráva z mailformu (AJAX)';
$email_bezpecny = str_replace(array("\r", "\n"), '', $email);
$jmeno_bezpecne = str_replace(array("\r", "\n"), '', $jmeno);
$hlavicky = [
'From' => $adresa,
'Reply-To' => $email_bezpecny,
'MIME-Version' => '1.0',
'Content-Type' => 'text/html; charset=utf-8'
];
$obsah_mailu = 'Od: ' . htmlspecialchars($jmeno_bezpecne) . '<br>';
$obsah_mailu .= 'E-mail: ' . htmlspecialchars($email_bezpecny) . '<br><br>';
$obsah_mailu .= 'Text zprávy:<br>' . nl2br(htmlspecialchars($zprava));
if (mb_send_mail($adresa, $predmet, $obsah_mailu, $hlavicky)) {
$odpoved['uspech'] = true;
$odpoved['zprava'] = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
} else {
$odpoved['zprava'] = 'Email se nepodařilo odeslat. Chyba konfigurace serveru.';
}
} else {
$odpoved['zprava'] = 'Zadali jste neplatný formát e-mailu!';
}
} else {
$odpoved['zprava'] = 'Formulář není správně vyplněný nebo nesouhlasí aktuální rok!';
}
}
echo json_encode($odpoved);
exit;