# Mengirim Email dengan PHPMailer di Linux

[![image.png](https://www.32inside.com/uploads/images/gallery/2026-04/scaled-1680-/NSFimage.png)](https://www.32inside.com/uploads/images/gallery/2026-04/NSFimage.png)

#### **Apa itu PHPMailer?**

[PHPMailer](https://github.com/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: 
        - ```bash
            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**
    - ```bash
        mkdir ~/phpmailer-test && cd ~/phpmailer-test
        ```
- **Install PHPMailer via Composer**
    - ```bash
        composer require phpmailer/phpmailer
        ```
- **Membuat Script PHP untuk Mengirim Email**
    - Buat file `sendmail.php`: 
        - ```
            vim sendmail.php
            ```
        - Lalu isi dengan: 
            - ```php
                <?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**
    - ```bash
        php sendmail.php
        ```
    - Jika berhasil, akan muncul: 
        - ```
            ✅ Email berhasil dikirim!
            ```

---

#### **Problem Umum Saat Menggunakan PHPMailer &amp; 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:<button class="flex items-center gap-1 py-1 select-none"></button>
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="overflow-y-auto p-4" dir="ltr">`telnet smtp.domain.com 587`</div></div>atau
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`openssl s_client -connect smtp.domain.com:587 -starttls smtp`</div></div>

---

##### **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:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-variable">$mail</span>->SMTPOptions = [  <span class="hljs-string">'ssl'</span> => [    <span class="hljs-string">'verify_peer'</span> => <span class="hljs-literal">false</span>,    <span class="hljs-string">'verify_peer_name'</span> => <span class="hljs-literal">false</span>,    <span class="hljs-string">'allow_self_signed'</span> => <span class="hljs-literal">true</span>,  ],];`</div></div>

---

##### **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:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-tag"><<span class="hljs-name">a</span></span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://yourdomain.com/login"</span>>Login<span class="hljs-tag"></<span class="hljs-name">a</span></span>>`</div></div>
- Tes reputasi pengiriman dengan <a class="cursor-pointer" data-end="2181" data-start="2139" rel="noopener" target="_new">mail-tester.com</a>

---

##### **5. Error: SMTP connect() failed**

**Penyebab:**

- Auth gagal karena salah username/password
- TLS/SSL setting tidak cocok
- SMTP server menolak koneksi

**Solusi:**

- Cek username &amp; 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:**

- Aktifkan 2FA di akun Google
- Buat App Password:  
    <a class="cursor-pointer" data-end="2790" data-start="2749" rel="noopener" target="_new">https://myaccount.google.com/apppasswords</a>

---

##### **7. Error: Message body empty**

**Penyebab:**

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

**Solusi:**

- Tambahkan:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-variable">$mail</span>-><span class="hljs-title function_ invoke__">isHTML</span>(<span class="hljs-literal">true</span>);<span class="hljs-variable">$mail</span>->AltBody = <span class="hljs-string">'Ini versi teks biasa dari email kamu.'</span>;`</div></div>

---

##### **8. Attachment tidak terkirim**

**Penyebab:**

- Path file salah atau file tidak bisa diakses

**Solusi:**

- Pastikan file ada dan bisa dibaca:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-variable">$mail</span>-><span class="hljs-title function_ invoke__">addAttachment</span>(<span class="hljs-string">'/path/to/file.pdf'</span>, <span class="hljs-string">'NamaFile.pdf'</span>);`</div></div>

---

##### **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 <a class="cursor-pointer" data-end="3583" data-start="3533" rel="noopener" target="_new">https://mail-tester.com</a>

---

##### **10. Mail terlalu lambat dikirim**

**Penyebab:**

- Terjadi timeout karena server lambat merespons

**Solusi:**

- Tambahkan timeout:
    
    <div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary"><div class="sticky top-9">  
    </div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-variable">$mail</span>->Timeout = <span class="hljs-number">30</span>;<span class="hljs-variable">$mail</span>->SMTPDebug = <span class="hljs-number">2</span>; <span class="hljs-comment">// untuk debug lebih rinci</span>`</div></div>

---

#### **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