Szervereinken biztonsági okból a PHP mail() függvénye le van tiltva, ezért a weboldalakról csak SMTP-hitelesítéssel, egy létező e-mail fiók nevében lehet levelet küldeni. Ez véd a feltört oldalakról induló kéretlen levelek ellen, és a leveleid is ritkábban kerülnek a címzett spam mappájába.
WordPress, Joomla és más CMS-ek
- WordPress: telepíts egy SMTP-bővítményt (pl. WP Mail SMTP vagy FluentSMTP), és add meg az alábbi táblázat adatait. Mailer típusnak az „Egyéb SMTP / Other SMTP” lehetőséget válaszd. A Feladó e-mail címe legyen ugyanaz, mint az SMTP-felhasználónév, és kapcsold be a „Feladó e-mail kényszerítése / Force From Email” opciót, hogy más bővítmény (pl. űrlapkészítő) se küldhessen eltérő feladóval.
- Joomla: Rendszer → Globális beállítások → Szerver → Levelezés: Levelező = SMTP, SMTP-hitelesítés = Igen, biztonság = SSL/TLS, port = 465, majd a táblázat szerinti kiszolgáló, felhasználónév, jelszó. A Feladó e-mail címe itt is egyezzen az SMTP-felhasználónévvel.
- Más rendszer (Drupal, PrestaShop, OpenCart, Laravel stb.): a levelezési / SMTP beállításoknál ugyanezek az adatok kellenek.
SMTP-adatok
| Beállítás | Érték |
|---|---|
| SMTP-kiszolgáló | a tárhelyed szerverének hosztneve (pl. szerver.whiszerver1.hu) – hol találod: Levelezési beállítások. PHP-kódban a gethostname() ugyanezt adja vissza. |
| Port és titkosítás | 465 – SSL/TLS (ajánlott), vagy 587 – STARTTLS |
| Hitelesítés | igen |
| Felhasználónév | a küldő e-mail fiók teljes címe (pl. info@sajat-domain.hu) |
| Jelszó | az e-mail fiók jelszava |
| Feladó (From) | pontosan ugyanez az e-mail cím – a feladónak meg kell egyeznie azzal a fiókkal, amellyel bejelentkezel |
Fontos: a feladó címe (From) mindig egyezzen meg a bejelentkezéshez használt e-mail fiókkal. Ha a Username info@sajat-domain.hu, akkor a feladó is info@sajat-domain.hu legyen – ne egy másik cím, akkor sem, ha az is a saját domainedhez tartozik. Ez a feladóhamisítás (e-mail sender spoofing) elleni védelem része: eltérő feladóval a levelet a szerverünk vagy a címzett levelezőrendszere elutasíthatja, illetve spamnek minősítheti. Ha más címről szeretnél küldeni (pl. noreply@), hozz létre hozzá saját postafiókot a DirectAdmin panelen, és annak a nevével és jelszavával jelentkezz be.
A 25-ös portot ne használd – azon titkosítás nélkül nem lehet bejelentkezni, és a küldés „503 AUTH command used when not advertised” hibával leáll. Régi programoknál (pl. PHPMailer 5.x) ez az alapértelmezés, ezért náluk a portot kézzel kell 465-re állítani.
Egyedi PHP-kód: PHPMailer
Saját fejlesztésű oldalnál a PHPMailer könyvtárat javasoljuk. Ehhez némi PHP-tudás szükséges.
1. A PHPMailer feltöltése
- A saját gépeden töltsd le a legfrissebb kiadást: GitHub → PHPMailer → Releases → Source code (zip).
- Csomagold ki, és a kicsomagolt mappát (pl.
PHPMailer-6.x.x) nevezd átPHPMailer-re. - Töltsd fel a tárhelyedre a weboldalad mappájába (pl.
domains/sajat-domain.hu/public_html/PHPMailer) FTP-vel (pl. FileZilla) vagy a DirectAdmin Fájlkezelőjével. A Fájlkezelőben a ZIP-et egyben is feltöltheted, és ott helyben kicsomagolhatod (Kicsomagolás / Extract).
Ebből a mappából három fájlra lesz szükséged, mind a PHPMailer/src/ alatt van: PHPMailer.php, SMTP.php, Exception.php.
2. A jelszót tedd a webes mappán kívülre
A jelszó ne olyan fájlban legyen, amely a public_html mappán belül van, mert az a böngészőből elérhető. Hozz létre egy fájlt eggyel fölötte, a domains/sajat-domain.hu/ mappában, mail-config.php néven – FTP-vel vagy a DirectAdmin Fájlkezelőben (Új fájl létrehozása, majd Szerkesztés):
<?php
return [
'host' => gethostname(), // a tárhely szerverének hosztneve
'port' => 465,
'username' => 'info@sajat-domain.hu', // a küldő fiók teljes e-mail címe = a feladó is
'password' => 'AZ-EMAIL-FIOK-JELSZAVA',
'fromName' => 'Saját Cég Kft.',
];
3. A levélküldő kód
Például egy public_html/mailer.php fájlba:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/PHPMailer/src/Exception.php';
require __DIR__ . '/PHPMailer/src/PHPMailer.php';
require __DIR__ . '/PHPMailer/src/SMTP.php';
$cfg = require __DIR__ . '/../mail-config.php'; // a public_html fölötti fájl
$mail = new PHPMailer(true); // true = hiba esetén kivételt dob
try {
// Kapcsolat
$mail->isSMTP();
$mail->Host = $cfg['host'];
$mail->Port = $cfg['port'];
$mail->SMTPAuth = true;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 465 = SSL/TLS
// 587-es porthoz helyette: PHPMailer::ENCRYPTION_STARTTLS
$mail->Username = $cfg['username'];
$mail->Password = $cfg['password'];
$mail->CharSet = PHPMailer::CHARSET_UTF8; // ékezetek helyes megjelenítése
// $mail->SMTPDebug = SMTP::DEBUG_SERVER; // hibakereséshez ideiglenesen
// Feladó és címzett
$mail->setFrom($cfg['username'], $cfg['fromName']); // feladó = a bejelentkező fiók!
$mail->addAddress('cimzett@domain.hu', 'Címzett Neve');
$mail->addReplyTo('valasz@sajat-domain.hu', 'Ügyfélszolgálat');
// Tartalom
$mail->isHTML(true);
$mail->Subject = 'Árvíztűrő tükörfúrógép';
$mail->Body = '<p>Szövegtörzs <b>HTML-lel formázva</b>.</p>';
$mail->AltBody = 'Szövegtörzs egyszerű szövegként (HTML-t nem mutató levelezőknek).';
$mail->send();
echo 'A levelet elküldtük.';
} catch (Exception $e) {
error_log('PHPMailer hiba: ' . $mail->ErrorInfo); // a részletek a naplóba
echo 'A levelet nem sikerült elküldeni, kérjük, próbáld újra később.';
}
A mailer.php meghívásakor a kód elküldi a levelet. A technikai hibaüzenet nem jelenik meg a látogatónak, hanem a PHP hibanaplójába kerül.
Kapcsolatűrlapnál különösen figyelj
- A feladó (
setFrom) mindig a bejelentkező e-mail fiók legyen, soha ne a látogató által beírt cím. Idegen feladóval a levelet a szerver vagy a címzett elutasíthatja, illetve spamnek minősítheti (feladóhamisítás elleni védelem, SPF / DMARC). - A látogató címét Reply-To-ként add meg, így a „Válasz” gomb neki válaszol:
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $mail->addReplyTo($_POST['email'], $_POST['nev']); } - A tárgyba és a nevekbe kerülő látogatói adatból szűrd ki a sortöréseket (fejléc-injekció ellen), a levél törzsébe kerülő szöveget pedig
htmlspecialchars()-szal alakítsd át. - Tegyél az űrlapra captchát (pl. reCAPTCHA, hCaptcha, Cloudflare Turnstile). Captcha nélkül a robotok percek alatt spamküldésre használják az űrlapot – a fiók napi küldési keretét is gyorsan kimeríthetik, és ilyenkor a valódi leveleid sem mennek ki.
Hibaelhárítás
| Hibaüzenet | Ok és megoldás |
|---|---|
| SMTP connect() failed / Connection timed out | Rossz kiszolgálónév vagy port. Kiszolgáló: a szerver hosztneve (vagy gethostname()), port: 465. |
| 503 AUTH command used when not advertised | A 25-ös porton próbálkozol. Állítsd 465-re, ENCRYPTION_SMTPS-szel. |
| SMTP Error: Could not authenticate / 535 | Rossz felhasználónév vagy jelszó. A felhasználónév a teljes e-mail cím. A jelszót próbáld ki a webmailben. |
| certificate verify failed / peer certificate CN … did not match | Kiszolgálónak a mail.sajat-domain.hu van megadva. Cseréld a szerver hosztnevére. A tanúsítvány-ellenőrzést (SMTPOptions / verify_peer) ne kapcsold ki. |
| Call to undefined function mail() | A kód nem SMTP-n küld (hiányzik az isSMTP()), vagy egy bővítmény a PHP mail()-t használja. Állítsd át SMTP-re. |
| A levelet elutasítják, vagy spambe kerül | Ellenőrizd, hogy a feladó (setFrom) pontosan megegyezik-e a bejelentkező fiókkal (Username), és hogy a domainedhez be van-e állítva SPF és DKIM. Ha nem vagy biztos benne, írj az ügyfélszolgálatnak. |
Ha egyik sem segít, nyiss hibajegyet az ügyfélkapuban, és küldd el a hibaüzenetet (a SMTPDebug kimenetet a jelszó nélkül), a domaint és a küldő e-mail címet.
