Skip to main content

Mengirim Email dengan PHPMailer di Linux

image.png

Apa itu PHPMailer?

PHPMailer adalah pustaka PHP yang digunakan untuk mengirim email melalui protokol SMTP. PHPMailer sangat populer karena mendukung berbagai fitur seperti SMTP authentication, HTML email, attachment, dan lain-lain.

Pada tutorial kali ini, kita akan mempelajari cara install, konfigurasi, dan menjalankan script PHPMailer di Linux menggunakan SMTP server yang aman, serta mengatasi kendala umum seperti error sertifikat SSL.

Persiapan Awal

  • Install PHP dan Composer
    • Buka terminal Linux, lalu jalankan:
      • sudo apt update
        sudo apt install php php-cli php-mbstring unzip curl git -y
        curl -sS https://getcomposer.org/installer | php
        sudo mv composer.phar /usr/local/bin/composer
  • Buat Folder Project
    • mkdir ~/phpmailer-test && cd ~/phpmailer-test
  • Install PHPMailer via Composer
    • composer require phpmailer/phpmailer
  • Membuat Script PHP untuk Mengirim Email
    • Buat file sendmail.php:
      • vim sendmail.php
      • Lalu isi dengan:
        • <?php
          use PHPMailer\PHPMailer\PHPMailer;
          use PHPMailer\PHPMailer\Exception;
          
          require 'vendor/autoload.php';
          
          $mail = new PHPMailer(true);
          
          try {
              // Konfigurasi SMTP
              $mail->isSMTP();
              $mail->Host       = 'smtp.datacomm.co.id'; // GANTI sesuai SMTP kamu
              $mail->SMTPAuth   = true;
              $mail->Username   = 'user@domain.com';     // GANTI email kamu
              $mail->Password   = 'app-password-atau-password-biasa'; // GANTI password
              $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
              $mail->Port       = 587;
          
              // Optional: untuk bypass SSL error (tidak disarankan di production)
              $mail->SMTPOptions = [
                  'ssl' => [
                      'verify_peer' => false,
                      'verify_peer_name' => false,
                      'allow_self_signed' => true,
                  ],
              ];
          
              // Email header
              $mail->setFrom('user@domain.com', 'Nama Pengirim');
              $mail->addAddress('penerima@contoh.com', 'Nama Penerima');
              $mail->addReplyTo('user@domain.com', 'Balasan');
          
              // Konten email
              $mail->isHTML(true);
              $mail->Subject = 'Tes Kirim Email dari Linux';
              $mail->Body    = '<h1>Halo!</h1><p>Email ini dikirim dari PHPMailer di server Linux.</p>';
              $mail->AltBody = 'Halo! Email ini dikirim dari PHPMailer di server Linux.';
          
              $mail->send();
              echo "✅ Email berhasil dikirim!\n";
          } catch (Exception $e) {
              echo "❌ Gagal kirim email. Error: {$mail->ErrorInfo}\n";
          }
          
  • Jalankan Script
    • php sendmail.php
    • Jika berhasil, akan muncul:
      • ✅ Email berhasil dikirim!

Problem Umum Saat Menggunakan PHPMailer & Solusinya

Menggunakan PHPMailer tidak selalu berjalan mulus. Berikut ini adalah beberapa masalah umum yang sering muncul, beserta solusi praktisnya:


1. SMTP Error: Could not connect to SMTP host

Penyebab:

  • Nama host salah

  • Port ditutup firewall

  • TLS/SSL tidak cocok

  • Server SMTP down

Solusi:

  • Pastikan $mail->Host benar (contoh: smtp.domain.com)

  • Coba ganti port 587 ↔ 465 ↔ 25

  • Uji koneksi:

    telnet smtp.domain.com 587

    atau

    openssl s_client -connect smtp.domain.com:587 -starttls smtp

2. stream_socket_enable_crypto(): Peer certificate CN mismatch

Penyebab:

  • Nama host tidak cocok dengan sertifikat SSL

  • Contoh: kamu pakai mail.domain.com tapi sertifikatnya untuk smtp.domain.com

Solusi:

  • Sesuaikan $mail->Host agar sama dengan CN di sertifikat (misalnya: smtp.domain.com)

  • Atau jika untuk testing:

    $mail->SMTPOptions = [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true, ], ];

3. Invalid address / SMTP Error: Recipient address rejected

Penyebab:

  • Alamat email salah atau tidak valid

  • SMTP server menolak penerima dari domain tertentu

Solusi:

  • Periksa penulisan email penerima

  • Uji dengan alamat email lain

  • Cek apakah domain tujuan menerima email dari IP/server kamu (SPF, DNS blacklist, dll)


4. Email masuk ke spam

Penyebab:

  • Tidak ada AltBody

  • Tidak ada DKIM/SPF/DMARC

  • Konten HTML mengandung kata spam

  • Link mengandung IP address, bukan domain

Solusi:

  • Tambahkan $mail->AltBody

  • Gunakan domain pengirim yang punya SPF, DKIM, dan DMARC valid

  • Gunakan link berbasis domain, bukan IP:

    <a href="https://yourdomain.com/login">Login</a>
  • Tes reputasi pengiriman dengan mail-tester.com


5. Error: SMTP connect() failed

Penyebab:

  • Auth gagal karena salah username/password

  • TLS/SSL setting tidak cocok

  • SMTP server menolak koneksi

Solusi:

  • Cek username & password

  • Jika pakai Gmail, gunakan App Password

  • Pastikan $mail->SMTPSecure cocok: PHPMailer::ENCRYPTION_STARTTLS (587) atau PHPMailer::ENCRYPTION_SMTPS (465)


6. Login gagal di Gmail

Penyebab:

  • Kamu menggunakan password biasa, bukan App Password

  • Belum aktifkan 2FA

Solusi:


7. Error: Message body empty

Penyebab:

  • Kamu hanya mengisi $mail->Body tapi tidak $mail->AltBody, dan HTML tidak aktif

Solusi:

  • Tambahkan:

    $mail->isHTML(true); $mail->AltBody = 'Ini versi teks biasa dari email kamu.';

8. Attachment tidak terkirim

Penyebab:

  • Path file salah atau file tidak bisa diakses

Solusi:

  • Pastikan file ada dan bisa dibaca:

    $mail->addAttachment('/path/to/file.pdf', 'NamaFile.pdf');

9. SMTP Error: Data not accepted

Penyebab:

  • Server SMTP menolak isi email karena dianggap spam

Solusi:

  • Perbaiki konten email

  • Cek header email: subject jangan berlebihan, jangan pakai caps lock semua

  • Gunakan https://mail-tester.com


10. Mail terlalu lambat dikirim

Penyebab:

  • Terjadi timeout karena server lambat merespons

Solusi:

  • Tambahkan timeout:

    $mail->Timeout = 30; $mail->SMTPDebug = 2; // untuk debug lebih rinci

Tips

  • Gunakan $mail->SMTPDebug = 2; saat troubleshooting

  • Cek log email server jika punya akses

  • Selalu tes dengan email eksternal (Gmail, Yahoo, ProtonMail) sebelum produksi

  • Simpan log pengiriman ke file jika perlu: bisa dibuat log email sukses/gagal