Jawaban singkatnya
Email SMTP by Azure adalah jalur kirim email transaksional RuangMail yang memakai protokol SMTP, bukan HTTP. Aplikasi Anda menyambung ke relay kami dengan kredensial yang dibuat di dashboard, dan setiap pesan masuk ke pipeline yang sama dengan Email API: saring karantina, hitung ukuran, debit kredit, lalu kirim ke Azure.
Yang diurus RuangMail
- Autentikasi kredensial, dan pengecekan ulang tepat sebelum pesan diterima
- Validasi alamat pengirim, domain terverifikasi, dan ukuran pesan
- Debit kredit atomik, plus refund kalau pengiriman gagal
- Antrean kuota Azure dan percobaan ulang otomatis
- Karantina bounce dan pemblokiran penerima bermasalah
Yang tetap di tangan Anda
- Isi email dan daftar penerimanya
- Membuat dan merotasi kredensial SMTP
- Mendaftarkan domain pengirim dan memasang DNS-nya
- Berhenti mengirim ke alamat yang sudah pernah bounce
Ini bukan email hosting. Kalau yang Anda cari mailbox yang bisa dibuka di Outlook atau webmail, itu layanan yang berbeda — lihat panduan Email Hosting. Buka panduan Email Hosting
Apa yang terjadi setelah Anda menekan send
Relay ini bukan sekadar pipa. Ada enam tahap antara aplikasi Anda dan inbox penerima, dan tahap keempat yang paling sering bikin pesan gagal terkirim.
- 1
Sambung dan autentikasi
Aplikasi membuka koneksi ke smtp.ruangmail.com:2525, naik ke STARTTLS, lalu AUTH PLAIN memakai username rm_smtp_… Kredensial dicek ke database, dan diulang lagi tepat sebelum pesan diterima — jadi revoke langsung berlaku tanpa menunggu koneksi lama ditutup.
- 2
Baca envelope dan isi pesan
Relay membaca MAIL FROM, RCPT TO, lalu mem-parse body MIME dengan standard library. Penerima yang sama muncul di To, Cc, dan Bcc tetap dihitung satu kali.
- 3
Saring dan hitung
Alamat yang sedang dikarantina ditolak lebih dulu dan tidak memakan kredit. Sisa penerima dihitung: ukuran akhir pesan menentukan berapa kredit per penerima.
- 4
Debit kredit
Kredit dipotong dalam satu transaksi. Kalau saldo tidak cukup, pesan ditolak dengan kode 452 dan tidak ada satu pun bagian yang terkirim.
- 5
Kirim ke Azure
Seluruh batch dikirim lewat satu panggilan emails:send, ditandatangani HMAC dari sisi server. Kalau kuota Azure sedang penuh, pesan dijawab 202 dan masuk antrean — worker mengirim ulang sendiri.
- 6
Tunggu status akhir
RuangMail mem-poll operation Azure, dan webhook Event Grid melengkapi hasilnya: delivered, bounced, atau spam. Status yang sudah final tidak pernah turun kembali.
Bentuk sesinya di wire
Kalau Anda pernah menyetel SMTP, tidak ada yang baru di sini. Contoh di bawah memakai openssl s_client supaya perintahnya kelihatan; kode 220, 250, 235, 354, dan 221 adalah respons SMTP standar.
$ openssl s_client -starttls smtp -crlf -connect smtp.ruangmail.com:2525
220 smtp.ruangmail.com ESMTP ready
EHLO mail.brandanda.com
250-smtp.ruangmail.com
250-STARTTLS
250-AUTH PLAIN
250 SIZE 10485760
AUTH PLAIN AHJtX3NtdHBfMDEyMzQ1Njc4OWFiAAAA...
235 2.7.0 Authentication successful
MAIL FROM:<[email protected]>
250 2.1.0 Sender OK
RCPT TO:<[email protected]>
250 2.1.5 Recipient OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>
From: Brand Anda <[email protected]>
To: [email protected]
Subject: Invoice INV-202610-000482
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
<p>Terima kasih, pembayaran Anda sudah kami terima.</p>
.
250 2.0.0 Message accepted for delivery
QUIT
221 2.0.0 ByeContoh, bukan log asli. Teks banner dan pesan dapat berbeda.
Host, port, dan batas
Nilai ini berlaku untuk relay publik. Batas kirim per menit dan per jam mengikuti tier resource Azure yang dipakai akun, dengan fallback tier gratis kalau Azure tidak bisa dihubungi.
| Parameter | Nilai | Catatan |
|---|---|---|
| Host | smtp.ruangmail.com | Nama host publik relay. |
| Port | 2525 | STARTTLS. Nginx tidak mem-proxy port ini. |
| Keamanan | STARTTLS | Wajib di production. AUTH PLAIN hanya tersedia setelahnya. |
| Penerima per pesan | 50 | Penerima unik gabungan To, Cc, dan Bcc. |
| Batas wire | 10 MiB | Ruang untuk header dan boundary MIME. |
| Batas bisnis | 9,6 MB | Ukuran akhir setelah attachment di-encode. Di atas ini ditolak. |
| Koneksi bersamaan | 100 | Dibatasi sebelum sapaan EHLO, bukan sesudahnya. |
| Timeout baca / tulis | 2 menit / 30 detik | Per koneksi SMTP. |
| AUTH gagal | 10 / menit | Per alamat remote. Dihitung di Redis, dengan cadangan memori lokal. |
Kredit dihitung dari ukuran akhir
Kredit dihitung per penerima yang lolos karantina, berdasarkan ukuran MIME final setelah attachment di-encode. Sampai 0,3 MB satu kredit; di atas itu naik satu kredit setiap 1,5 MB.
| Ukuran akhir | Kredit per penerima |
|---|---|
| ≤ 0,3 MB | 1 |
| > 0,3 – 0,6 MB | 2 |
| > 0,6 – 2,1 MB | 3 |
| > 2,1 – 3,6 MB | 4 |
| > 3,6 – 5,1 MB | 5 |
| > 5,1 – 6,6 MB | 6 |
| > 6,6 – 8,1 MB | 7 |
| > 8,1 – 9,6 MB | 8 |
> 9,6 MBDitolak sebelum kredit disentuh.
Ukuran 9,6 MB adalah keputusan bisnis, sedangkan batas wire 10 MiB adalah batas teknis. Selisihnya sengaja disisakan untuk header dan boundary MIME.
Arti setiap status
Status ini muncul di halaman aktivitas dan di endpoint /smtp/activities. Di halaman log dashboard, filter failed mencakup failed, bounced, dan spam sekaligus.
| Status | Arti |
|---|---|
| queued | Masuk antrean, biasanya karena kuota Azure sedang penuh. |
| sending | Sedang diproses provider. |
| sent | Provider sudah menerima permintaan pengiriman. |
| delivered | Azure melaporkan email diterima server tujuan. |
| failed | Pengiriman gagal diproses. Kredit dikembalikan. |
| bounced | Server tujuan menolak. Alamat masuk karantina. |
| spam | Ditandai spam oleh provider atau tujuan. |
| cancelled | Dibatalkan sebelum selesai. |
Event tracking: apa saja yang dicatat
Status di atas tidak muncul sendiri. Ada tiga sumber event, dan masing-masing punya peran berbeda — satu menentukan hasil pengiriman, satu melaporkan apa yang terjadi setelahnya, satu memproses ulang yang sudah tersimpan.
Sumber event
| Sumber | Cara masuk | Yang ditentukan |
|---|---|---|
| Polling operation | Sinkron, langsung setelah pengiriman | sent atau failed |
| Webhook Event Grid | Push dari provider, asinkron | delivered, bounced, spam, suppressed, open, click |
| Refresh Status | Manual, atau saat tab Aktivitas dibuka | Memproses ulang event yang sudah tersimpan |
Jenis event dan efeknya
| Event | Status pesan | Efek samping |
|---|---|---|
| sent | sent | Tidak ada. |
| delivered | delivered | Mengisi delivered_at. |
| bounced | bounced | Penerima masuk karantina, dan penalti 30 kredit dikenakan sekali per event. |
| suppressed | failed | Penerima masuk karantina. |
| failed | failed | Menyimpan error code dan pesan dari provider. |
| spam | spam | Penerima masuk karantina. |
| view | Tidak berubah | open_count naik; opened_at diisi kejadian pertama. |
| click | Tidak berubah | click_count naik; clicked_at diisi kejadian pertama. |
Open dan click
Domain yang Anda daftarkan dibuat dengan engagement tracking aktif, jadi provider yang menyisipkan pelacakan open dan click — Anda tidak perlu menambahkan apa pun ke email. Hasilnya masuk sebagai event view dan click, lalu dijumlahkan ke open_count dan click_count pada tiap pesan.
Status tidak ikut berubah
Open dan click hanya menaikkan counter. Status pesan tetap delivered, dan tidak ada kredit yang dipotong untuk pixel atau klik.
Angka tidak dobel saat Refresh Status
Replay sengaja melewati event engagement, karena counter sudah dicatat saat event pertama masuk. Tombol itu aman ditekan berkali-kali.
Dihitung per pesan, bukan per batch
Batch ke 10 penerima menyimpan 10 baris pesan, masing-masing dengan angka open dan click sendiri. Untuk melihatnya, buka detail pesan di tab Aktivitas.
Status final tidak pernah turun
Event yang datang terlambat tidak bisa menurunkan status: sent yang tiba setelah delivered diabaikan, lalu batch dihitung ulang dari status pesan-pesannya. Untuk event terminal seperti bounce dan spam, recipient wajib ada di payload — tanpa itu event dilewati, supaya kegagalan satu alamat tidak menghukum seluruh batch.
Kenapa event bisa terasa telat
Webhook hanya menerima payload sampai 1 MB, dan setiap event di-dedupe berdasarkan pasangan provider dan event id — jadi pengiriman ulang tidak dihitung dua kali. Kalau pemrosesan gagal, endpoint menjawab 503 supaya provider mencoba lagi. Itulah kenapa delivered kadang muncul beberapa detik setelah sent, dan kenapa tombol Refresh Status ada.
SMTP atau Email API?
Dua-duanya masuk ke pipeline kredit yang sama, tapi titik masuknya berbeda. Pilih yang paling sedikit mengubah kode Anda.
| Aspek | SMTP relay | Email API |
|---|---|---|
| Cara mengirim | Perintah SMTP dari aplikasi Anda | POST /email-api/messages |
| Paling pas untuk | Aplikasi yang sudah punya SMTP client — WordPress, CRM, ERP, skrip lama | Backend baru yang mau kontrol per request |
| Attachment | Multipart MIME apa adanya | Base64 di dalam JSON |
| Provider | Azure Communication Services | Dikelola RuangMail |
| Lihat riwayat | /dashboard/smtp | /dashboard/email-api |
Catatan yang sering bikin bingung
Bukan daftar error, cuma hal-hal yang paling sering ditanyakan setelah kirim pertama.
- Reply-To kosong otomatis jadi From
- Kalau Anda tidak mengisi Reply-To, balasan pelanggan akan masuk ke alamat pengirim. Isi eksplisit kalau balasan harus diarahkan ke tempat lain.
- Baris baru di header ditolak
- CR atau LF di subject dan alamat membuat pesan ditolak. Ini disengaja: tanpa itu, siapa pun bisa menyisipkan header tambahan lewat input pengguna.
- Bounce bukan sekadar gagal
- Alamat yang bounce masuk karantina aktif, dan setiap event bounce memotong 30 kredit. Pengiriman berikutnya ke alamat itu ditolak sebelum kredit didebit.
- Kirim ulang dihitung pesan baru
- Client yang mengulang karena timeout akan diproses sebagai transaksi SMTP baru, sama seperti relay biasa. Pastikan aplikasi tidak mengulang tanpa jeda.
- Kuota penuh bukan error
- Kalau limit Azure sedang tercapai, pesan dijawab 202 dan masuk antrean durable. Worker mengirim ulang otomatis — Anda tidak perlu melakukan apa pun.
- Password SMTP hanya muncul sekali
- Simpan saat dibuat atau di-rotate. Yang tersimpan di server hanya hash scrypt, dan tidak ada jalur untuk menampilkannya kembali. Rotate juga menghidupkan kembali kredensial yang sudah di-revoke.
- STARTTLS wajib di production
- Relay menolak start tanpa sertifikat di production. Kalau gagal start karena sertifikat belum diisi, itu memang disengaja supaya password tidak pernah lewat jalur plaintext.
Lanjut baca
Halaman yang biasanya dibuka setelah yang ini.
Sudah punya akun?
Buat kredensial SMTP, daftarkan domain pengirim, lalu kirim tes pertama. Membuka dashboard SMTP untuk pertama kali sekaligus menyiapkan akun kredit dan sender default Anda.