SMTP Submission — smtp.hubina.net
Untuk aplikasi yang memang bicara SMTP (CMS, framework web, library email), Hubina menyediakan submission server dengan STARTTLS di port 587. Semua aturan tetap sama: domain terverifikasi, saldo, log, dan webhook.
Kredensial koneksi
| Setelan | Nilai |
|---|---|
| Host | smtp.hubina.net |
| Port | 587 (submission) |
| Enkripsi | STARTTLS wajib; sertifikat diverifikasi normal (tanpa perlu menonaktifkan verifikasi TLS) |
| Autentikasi | AUTH PLAIN / AUTH LOGIN, hanya setelah TLS aktif |
| Username | api |
| Password | API key akun Anda (hb_live_…) |
Kredensial tidak pernah diterima sebelum TLS
Upaya AUTH di koneksi tanpa TLS ditolak dengan 538 5.7.0. Pastikan klien Anda
benar-benar menaikkan koneksi ke TLS (STARTTLS), bukan mengirim kredensial dalam bentuk polos.
Ketentuan sender
- Envelope sender (
MAIL FROM) dan headerFrom:keduanya harus memakai domain yang dimiliki akun Anda dan berstatus terverifikasi. - Mengirim dari domain pihak lain ditolak pada tahap
MAIL FROM(550 5.7.1), dan headerFrom:yang berbeda domain juga ditolak. - Header
Bcc:dihapus dari pesan sebelum diteruskan ke penyedia; penerima Bcc tetap menerima email. - Header
From:danSubject:wajib ada di pesan.
Contoh konfigurasi
Nodemailer (Node.js)
import nodemailer from 'nodemailer';
const transport = nodemailer.createTransport({
host: 'smtp.hubina.net',
port: 587,
secure: false,
requireTLS: true,
auth: { user: 'api', pass: process.env.HUBINA_API_KEY },
});
await transport.sendMail({
from: '"Aplikasi Anda" <[email protected]>',
to: '[email protected]',
subject: 'Halo dari Hubina',
text: 'Email lewat SMTP submission.',
});Laravel
MAIL_MAILER=smtp
MAIL_HOST=smtp.hubina.net
MAIL_PORT=587
MAIL_USERNAME=api
MAIL_PASSWORD=hb_live_YOUR_API_KEY
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="Aplikasi Anda"Django
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.hubina.net"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "api"
EMAIL_HOST_PASSWORD = "hb_live_YOUR_API_KEY"
DEFAULT_FROM_EMAIL = "[email protected]"Uji dari terminal
openssl s_client -starttls smtp -connect smtp.hubina.net:587 -quiet
# lalu ketik (baris demi baris):
# EHLO domain-anda.com
# AUTH LOGIN
# … masukkan username "api" dan API key dalam base64 …Retry dan deduplication
Hubina memakai header Message-ID sebagai kunci deduplication per akun. SertakanMessage-ID yang tetap saat aplikasi Anda mengulang pengiriman yang sama:
| Kondisi pengiriman ulang | Respons SMTP | Tagihan |
|---|---|---|
Message-ID sama dan percobaan sebelumnya sudah diterima | 250 Ok (ditandai duplikat) | Tidak ada tagihan kedua |
| Percobaan sebelumnya masih diproses | 451 4.3.0 | Belum ada; tunggu lalu ulangi |
| Percobaan sebelumnya belum pasti hasilnya | 451 4.3.0 | Dana masih ditahan sampai direkonsiliasi |
| Percobaan sebelumnya gagal dan dana sudah dikembalikan | Percobaan baru diproses | Rate akan dicadangkan lagi |
Lebih dari 10 percobaan untuk Message-ID yang sama | 451 4.3.0 | Tidak ada tagihan baru |
Pesan tanpa header Message-ID tidak dapat dideduplikasi — buat Message-ID unik per pesan logis bila aplikasi Anda mengulang pengiriman.
Kode respons dan artinya
| Kode | Arti | Seharusnya |
|---|---|---|
538 5.7.0 | Autentikasi dicoba sebelum TLS | Kirim STARTTLS dulu (klien normal sudah melakukannya otomatis dengan setelan TLS). |
535 5.7.8 | Kredensial tidak valid / API key dicabut | Periksa username api dan API key; percobaan berulang dipersilakan tapi akan tetap gagal. |
530 5.7.0 | Perintah dikirim sebelum AUTH | Autentikasi dulu. |
550 5.7.1 | Domain sender tidak terverifikasi untuk akun ini | Selesaikan verifikasi domain, atau ganti sender. |
550 5.6.0 | Pesan tidak punya From: atau Subject: yang valid | Lengkapi header wajib. |
452 4.5.3 | Penerima melebihi 50 dalam satu pesan | Pecah menjadi beberapa pesan. |
552 5.3.4 | Pesan (maks 10 MB) atau header (maks 256 KB) terlalu besar | Kecilkan lampiran; untuk pesan sangat besar gunakan tautan unduhan. |
452 4.2.2 | Saldo Hubina tidak cukup | Top up saldo; pesan belum diterima. |
452 4.7.0 | Rate limit pengiriman (300 pesan/jam per key) tercapai | Kurangi laju, coba lagi nanti. |
421 4.7.0 | Terlalu banyak koneksi / percobaan koneksi (maks 5 koneksi bersamaan per IP, 25 total, 30 percobaan/menit per IP) | Kurangi konkurensi; hormati jeda. |
451 4.3.0 | Kegagalan sementara (cek domain, duplikat masih diproses, hasil belum pasti) | Ulangi pesan yang sama nanti — aman dari duplikasi. |
554 5.7.0 | Penyedia menolak pesan secara permanen pada saat submit (tidak ada tagihan) | Jangan ulangi tanpa perubahan; periksa isi/alamat. |
550 5.7.0 | Message-ID yang sama dipakai dengan isi berbeda | Pakai Message-ID baru untuk pesan yang isinya berubah. |
Batas dan perlindungan
- Maksimum 50 penerima per pesan, 10 MB per pesan, 256 KB per blok header.
- Maksimum 300 pesan per jam per API key, 5 koneksi bersamaan per alamat IP, 25 koneksi bersamaan total.
- Sesi idle ditutup setelah 5 menit tanpa aktivitas.
- Hanya AUTH
PLAINdanLOGINyang didukung; mekanisme lain dibalas504 5.5.4. - Server ini bukan relay terbuka: tanpa autentikasi tidak ada pesan yang diterima.
Isi pesan tidak disimpan Hubina hanya menyimpan metadata perutean (pengirim, penerima, subjek, status) untuk log dan penagihan. Body email tidak pernah dipersist maupun ditulis ke log, sama seperti jalur REST API.