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.