Levélküldés SMTP-n keresztül PHPMailer használattal

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

  1. A saját gépeden töltsd le a legfrissebb kiadást: GitHub → PHPMailer → Releases → Source code (zip).
  2. Csomagold ki, és a kicsomagolt mappát (pl. PHPMailer-6.x.x) nevezd át PHPMailer-re.
  3. 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.

  • SMTP, e-mail, PHP, PHPMailer
  • 303 Корисниците го најдоа ова како корисно
Дали Ви помогна овој одговор?

Понудени резултати

Weboldal tesztelése, mielőtt a domain hozzánk mutatna (hosts fájl)

Előfordul, hogy egy weboldalt már a tárhelyünkön szeretnél fejleszteni vagy kipróbálni, de a...