Integrasi Email
Integrasi Email
Saluran email OmniStream memperlakukan email masuk dan keluar seperti pesan percakapan biasa. Email keluar dikirim melalui SMTP menggunakan library lettre dengan rustls-tls; email masuk diterima melalui webhook dari relay email (misalnya SendGrid Inbound Parse) ke webhook-ingestor.
Peran: Hanya Admin yang dapat menambah atau mengubah integrasi email. Rute frontend:
/integrations
Prasyarat
- Server SMTP yang dapat dijangkau dari host OmniStream. Untuk development,
docker composemenyediakan Mailpit dimailpit:1025. - Alamat email pengirim (
SMTP_FROM_ADDRESS) yang sudah diverifikasi pada provider Anda. - (Opsional) Sebuah relay email masuk yang bisa memposting JSON ke URL webhook OmniStream (misalnya SendGrid Inbound Parse dalam mode JSON).
Variabel lingkungan
Semua variabel berikut berasal dari bagian Email (SMTP) pada .env.example:
| Variabel | Default | Kegunaan |
|---|---|---|
SMTP_HOST | mailpit | Host SMTP. Kosongkan untuk menonaktifkan saluran email. |
SMTP_PORT | 1025 | Port SMTP. 1025 untuk Mailpit, 587 untuk STARTTLS umum, 465 untuk TLS implisit. |
SMTP_USERNAME | (kosong) | Nama pengguna SMTP. Kosongkan jika server tidak menuntut autentikasi (Mailpit). |
SMTP_PASSWORD | (kosong) | Kata sandi SMTP. |
SMTP_FROM_ADDRESS | noreply@omnistream.local | Alamat From pada email keluar. |
SMTP_ENCRYPTION | none | Mode enkripsi: none (plain, untuk Mailpit), starttls (default produksi), tls (implicit TLS, port 465). |
EMAIL_WEBHOOK_SECRET | (kosong) | Shared secret untuk memverifikasi HMAC pada webhook email masuk (header X-Email-Webhook-Signature). Jika kosong, verifikasi dilewati. |
Mode enkripsi yang valid dikenali message-sender adalah none, starttls, dan tls. Nilai selain itu akan ditolak saat layanan start.
Langkah-langkah (development dengan Mailpit)
- Jalankan infrastruktur dengan
docker compose up -d— ini memunculkan Mailpit pada SMTP1025dan web UIhttp://localhost:8025. - Pastikan
.envberisi default dev:Code - Buka OmniStream sebagai admin → Integrations → tab Email.
- Isi field SMTP (UI akan memprapopulasi dari
.envpertama kali), klik Save. - Tunggu hingga 30 detik untuk hot-reload.
- Dari UI, pilih satu kontak dan kirim email uji. Buka
http://localhost:8025— email akan muncul di Mailpit.
Langkah-langkah (produksi dengan SMTP eksternal)
- Siapkan akun pada provider Anda (SendGrid, Amazon SES, Mailgun, dsb.). Verifikasi domain pengirim sesuai ketentuan masing-masing.
- Dapatkan kredensial SMTP — biasanya
host,port,username, danpassword. - Isi
.envpada server OmniStream:Code - Restart
message-sendersatu kali agar nilai baru dari.envtermuat. - Di UI Integrations, buka tab Email, verifikasi nilai yang ditampilkan (rahasia akan muncul sebagai placeholder bintang setelah disimpan), klik Save.
- Kirim email uji ke kontak dan verifikasi pengirimannya melalui dashboard provider.
Catatan TLS: Semua HTTP client OmniStream memakai rustls (bukan native-tls). Provider SMTP harus menyajikan sertifikat yang dapat divalidasi oleh trust store bawaan rustls. Sertifikat self-signed memerlukan konfigurasi tambahan dan tidak didukung out-of-the-box.
Webhook email masuk
OmniStream menerima email masuk sebagai JSON melalui:
Code
webhook-ingestor — satu binary yang mendengarkan di WEBHOOK_INGESTOR_PORT (default 3001 di local dev), port yang sama dipakai bersama oleh rute WhatsApp, Instagram, Messenger, dan Email — memanggil signature::verify_email_signature untuk memvalidasi tanda tangan. Validasi dilewati jika EMAIL_WEBHOOK_SECRET kosong — berguna untuk uji coba lokal, tetapi tidak disarankan untuk produksi.
Payload minimum harus memuat field from. Contoh payload gaya SendGrid Inbound Parse:
Code
Mengaktifkan EMAIL_WEBHOOK_SECRET
- Pilih shared secret acak (misal 32 karakter).
- Setel
EMAIL_WEBHOOK_SECRET=<nilai>di.envserver OmniStream atau isi kolomemail_webhook_secretpadaconfigintegrasi email lewat UI. Nilai dari DB akan menggantikan.envmelalui hot-reload 30 detik. - Konfigurasi relay email Anda untuk menandatangani body dengan HMAC-SHA256 hex memakai secret yang sama dan meletakkannya pada header
X-Email-Webhook-Signature. - Kirim email uji; periksa log
webhook-ingestor. Jika Anda melihatInvalidSignature, secret tidak cocok atau algoritma tanda tangan tidak sesuai.
Mengatur relay (SendGrid Inbound Parse)
- Di SendGrid, buka Settings → Inbound Parse → Add Host & URL.
- Tentukan subdomain MX (misalnya
parse.omnistream.example.com) dan arahkan rekam MX ke SendGrid. - Masukkan URL:
https://<host-omnistream>/webhook/email - Centang POST the raw, full MIME message dinonaktifkan (kami memakai mode JSON).
- Centang Check incoming emails for spam sesuai kebijakan Anda.
- Jika Anda memakai
EMAIL_WEBHOOK_SECRET, aktifkan fitur signing yang setara atau gunakan middleware reverse proxy untuk menambah header tanda tangan.
Troubleshooting
SMTP encryption mode must be 'none', 'starttls', or 'tls'— nilaiSMTP_ENCRYPTIONsalah. Gunakan salah satu dari tiga nilai itu, huruf kecil.Connection refusedpada Mailpit — pastikan layanan Mailpit jalan (docker compose ps mailpit).- Email keluar terkirim tetapi ditolak provider —
SMTP_FROM_ADDRESSbelum diverifikasi di provider. Selesaikan verifikasi domain SPF/DKIM sebelum mencoba lagi. - Webhook masuk mengembalikan
400 Missing required field 'from'— payload relay tidak memakai mode JSON atau struktur field-nya berbeda. Uji dengancurl+ payload contoh di atas untuk memastikan endpoint bekerja. - Webhook masuk
401 InvalidSignature—EMAIL_WEBHOOK_SECRETdi.envatau DB berbeda dari secret yang dipakai relay.
Hubungan dengan API Reference
Endpoint REST untuk mengelola integrasi email tersedia di bawah tag Integrations pada API Reference. Untuk detail webhook masuk email, lihat Developer → Webhook → Inbound Email.