Izgubili smo cijelo jedno poslijepodne debugirajući zašto email notifikacije za narudžbe ne stižu. PHP kod je bio ispravan, mail() vraćao true, logovi čisti — a emailovi nigdje. Evo šta smo naučili.
Najčešći uzroci
1. Pogrešan From: header
Shared hosting serveri odbijaju slanje emaila s From: adresom koja ne pripada domeni na tom serveru. Ako je server harbas.ba a u headeru stoji noreply@nekodrugo.ba — email tiho nestaje.
// Pogrešno — domena ne pripada ovom serveru
$headers = "From: noreply@drugidomain.ba
";
// Ispravno — koristite domenu servera
$headers = "From: noreply@harbas.ba
";
2. @ operator guta greške
Programeri često pišu @mail() da sakriju upozorenja. Problem: greška se desi, ali nikad ne saznate za nju.
// Nikad ovako:
@mail($to, $subject, $body, $headers);
// Uvijek ovako — logujte greške:
$sent = mail($to, $subject, $body, $headers);
if (!$sent) error_log("Mail failed to: $to");
3. Content-Type i charset
HTML email bez ispravnih headera izgleda kao niz HTML tagova u plain textu.
$headers = "MIME-Version: 1.0
";
$headers .= "Content-Type: text/html; charset=UTF-8
";
$headers .= "From: Moje Ime <noreply@mojadomena.ba>
";
Kada mail() nije dovoljno
Za produkcijske sisteme s većim volumenom emailova, jedino pouzdano rješenje je SMTP putem PHPMailer ili Symfony Mailer biblioteke — direktna konekcija na mail server s autentikacijom. mail() je predobro za jednostavne notifikacije, ali nema retry mehanizam, nema bounce handling, nema queue.
Zaključak
PHP mail() radi — ali samo ako: From: domena odgovara serveru, nema @ operatora koji guta greške, headeri su ispravno postavljeni. Za sve ostalo: SMTP.