Surel yang dikirim sebuah aplikasi biasanya gagal tanpa suara. Fungsinya mengembalikan true, pesannya diserahkan ke proses lokal, dan tak ada yang memberi tahu Anda bahwa ia ditolak sejam kemudian. Perbaikannya adalah mengirim lewat SMTP yang terotentikasi, tempat sebuah kegagalan menjadi galat yang bisa Anda lihat.

Jangan pakai mail()

  • Ia melaporkan apakah pesannya sudah diserahkan, bukan apakah pesannya sampai.
  • Ia mengirim atas nama pengguna server web, sehingga SPF dan DKIM biasanya gagal.
  • Ia tak punya otentikasi, tak punya percobaan ulang, dan tak punya catatan yang bisa Anda baca.

Pakai SMTP

use PHPMailer\PHPMailer\PHPMailer;

$m = new PHPMailer(true);
$m->isSMTP();
$m->Host       = 'mail.yourdomain.com';
$m->SMTPAuth   = true;
$m->Username   = 'noreply@yourdomain.com';
$m->Password   = getenv('SMTP_PASS');
$m->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$m->Port       = 465;

$m->setFrom('noreply@yourdomain.com', 'Your Shop');
$m->addReplyTo('support@yourdomain.com');
$m->addAddress($customerEmail);
$m->Subject = 'Your order';
$m->Body    = $text;
$m->send();
Jangan pernah menaruh kata sandinya di dalam kode. Baca dari lingkungan, dan jaga berkas lingkungannya tetap di luar akar dokumen dan di luar git.

From haruslah domain Anda sendiri

Menyetel From ke alamat pelanggan supaya balasannya bekerja adalah kesalahan klasik: Anda jadi mengirim atas nama gmail.com, dan itu gagal telak pada SPF dan DMARC mereka. Kirimlah atas nama domain Anda dan setel Reply-To ke alamat mereka.

Kirim ia di latar belakang

Mengirim selagi permintaannya berjalan membuat pengunjung menunggu server yang jauh, dan mengubah gangguan surel menjadi pembayaran yang rusak. Antrekan lalu kirim dari sebuah pekerja.

Dan catat hasilnya

$m->SMTPDebug = 2;   // development only
// production: record the message ID and the accept/reject per recipient
Untuk apa pun yang bersifat transaksional - kuitansi, penyetelan ulang kata sandi - pakailah layanan pengiriman khusus. Keterkiriman adalah seluruh urusan mereka, dan itu memisahkan kuitansi Anda dari buletin Anda: lihat surel transaksional versus buletin.