Relay SMTP

Apa itu Email SMTP by Azure?

Singkatnya: aplikasi Anda mengirim email lewat perintah SMTP biasa, RuangMail yang meneruskan ke Azure Communication Services. Validasi, kredit, antrean kuota, dan status pengiriman ditangani di tengah, jadi kode Anda tidak perlu tahu Azure itu ada.

Terakhir diperbarui · 3 Oktober 2026

Provider
Azure Communication Services Email
Host
smtp.ruangmail.com
Port
2525 · STARTTLS
Autentikasi
AUTH PLAIN
01

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

02

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. 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. 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. 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. 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. 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. 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.

03

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.

smtp.ruangmail.com:2525
$ 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 Bye

Contoh, bukan log asli. Teks banner dan pesan dapat berbeda.

04

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.

ParameterNilaiCatatan
Hostsmtp.ruangmail.comNama host publik relay.
Port2525STARTTLS. Nginx tidak mem-proxy port ini.
KeamananSTARTTLSWajib di production. AUTH PLAIN hanya tersedia setelahnya.
Penerima per pesan50Penerima unik gabungan To, Cc, dan Bcc.
Batas wire10 MiBRuang untuk header dan boundary MIME.
Batas bisnis9,6 MBUkuran akhir setelah attachment di-encode. Di atas ini ditolak.
Koneksi bersamaan100Dibatasi sebelum sapaan EHLO, bukan sesudahnya.
Timeout baca / tulis2 menit / 30 detikPer koneksi SMTP.
AUTH gagal10 / menitPer alamat remote. Dihitung di Redis, dengan cadangan memori lokal.
05

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 akhirKredit per penerima
≤ 0,3 MB1
> 0,3 – 0,6 MB2
> 0,6 – 2,1 MB3
> 2,1 – 3,6 MB4
> 3,6 – 5,1 MB5
> 5,1 – 6,6 MB6
> 6,6 – 8,1 MB7
> 8,1 – 9,6 MB8

> 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.

06

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.

StatusArti
queuedMasuk antrean, biasanya karena kuota Azure sedang penuh.
sendingSedang diproses provider.
sentProvider sudah menerima permintaan pengiriman.
deliveredAzure melaporkan email diterima server tujuan.
failedPengiriman gagal diproses. Kredit dikembalikan.
bouncedServer tujuan menolak. Alamat masuk karantina.
spamDitandai spam oleh provider atau tujuan.
cancelledDibatalkan sebelum selesai.
07

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

SumberCara masukYang ditentukan
Polling operationSinkron, langsung setelah pengirimansent atau failed
Webhook Event GridPush dari provider, asinkrondelivered, bounced, spam, suppressed, open, click
Refresh StatusManual, atau saat tab Aktivitas dibukaMemproses ulang event yang sudah tersimpan

Jenis event dan efeknya

EventStatus pesanEfek samping
sentsentTidak ada.
delivereddeliveredMengisi delivered_at.
bouncedbouncedPenerima masuk karantina, dan penalti 30 kredit dikenakan sekali per event.
suppressedfailedPenerima masuk karantina.
failedfailedMenyimpan error code dan pesan dari provider.
spamspamPenerima masuk karantina.
viewTidak berubahopen_count naik; opened_at diisi kejadian pertama.
clickTidak berubahclick_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.

08

SMTP atau Email API?

Dua-duanya masuk ke pipeline kredit yang sama, tapi titik masuknya berbeda. Pilih yang paling sedikit mengubah kode Anda.

AspekSMTP relayEmail API
Cara mengirimPerintah SMTP dari aplikasi AndaPOST /email-api/messages
Paling pas untukAplikasi yang sudah punya SMTP client — WordPress, CRM, ERP, skrip lamaBackend baru yang mau kontrol per request
AttachmentMultipart MIME apa adanyaBase64 di dalam JSON
ProviderAzure Communication ServicesDikelola RuangMail
Lihat riwayat/dashboard/smtp/dashboard/email-api
09

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.