Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Burung

30 Agu 2019

Email

1 min read

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Burung

30 Agu 2019

Email

1 min read

Menempatkan Sinyal untuk On-Premises: Integrasi PowerMTA

Mari kita menjelajahi rincian pengaturan PowerMTA untuk SparkPost Signals.

Mari kita menyelami rincian penyiapan PowerMTA untuk SparkPost Signals. Anda akan membutuhkan:

  • Sebuah host untuk menjalankan versi terbaru dari PowerMTA — baik mesin baru, atau mesin yang sudah ada

  • Akun SparkPost dengan izin API kunci untuk “Incoming Events: Write” seperti yang dijelaskan di sini

Kita akan menyiapkan PowerMTA untuk mengalirkan acara ke akun SparkPost Anda, kemudian Anda bisa menggunakan yang berikut:

Pertama, instal (atau tingkatkan) ke PowerMTA 5.0 r4 atau yang lebih baru, mengikuti instruksi instalasi v5.0 yang biasa yang cukup sederhana. Kemudian kita akan menjalani langkah-langkah berikut:

  • Konfigurasikan konektor PowerMTA ke SparkPost Signals

  • Siapkan Engagement Tracking dengan domain pelacakan kustom

  • Pilih aliran lalu lintas PowerMTA mana yang akan dilaporkan ke Signals

  • Menguji bahwa acara Anda mencapai Signals

  • Tinjau cara menggunakan nama yang bermakna yang terlihat baik dalam pelaporan.

Kita juga akan membahas aspek penyiapan PowerPMTA khusus lainnya yang digunakan dalam demo Signals kita:

  • Acara FBL (Keluhan Spam) dan bounce remote (di luar jalur)

  • Konfigurasi injeksi, termasuk DKIM

  • Konfigurasi FBL dan OOB

  • Pengaturan dan penamaan VirtualMTA (dan bagaimana hal ini muncul dalam laporan SparkPost Signals Anda)

Akhirnya, ada “fitur bonus” dengan kode untuk memastikan nama kampanye Anda kompatibel dengan konvensi nama PowerMTA X-Job saat ini.

Konfigurasikan PowerMTA connector

Konfigurasi Signals dijelaskan dalam Bagian 10.1 Panduan Pengguna 5.0. Di sini kita akan memulai dengan “Use Case #2”, yang memungkinkan Signals untuk semua lalu lintas dari host PowerMTA ini, dan mengaktifkan pelacakan keterlibatan SparkPost.

# # SparkPost Signals # <signals> api-key ##kunci API penerimaan saya di sini## upload-url https://api.sparkpost.com/api/v1/ingest/events log-verbose true min-free-space 1G engagement-tracking sparkpost # ini menghidupkan pelacakan buka dan klik di PowerMTA customer-id 123 # Nomor akun SparkPost Anda di sini </signals> enable-signals true

Berikut adalah apa yang dilakukan setiap atribut:

api-key

Ini unik untuk akun SparkPost Anda, ini adalah nilai yang Anda dapatkan dari SparkPost sebelumnya.

upload-url

Ini harus sesuai dengan alamat layanan API SparkPost Anda, baik di AS atau EU. Untuk info lebih lanjut lihat di sini. Nilai-nilai biasanya adalah:

SparkPost (AS): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events

log-verbose

Direktif ini bersifat opsional dan ketika diaktifkan, memberikan sedikit lebih banyak info dalam file pmta.log, yang bisa berguna selama pengaturan untuk mengonfirmasi bahwa semuanya berfungsi dengan benar. Setiap menit, bahkan ketika tidak ada lalu lintas, Anda akan melihat:

2019-07-26 11:47:57 Signals: Menemukan 0 file

Dengan lalu lintas, Anda akan melihat sesuatu seperti:

2019-07-26 11:50:57 Signals: Menemukan sp1-0000000000003FBD.json 2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json berhasil. 2019-07-26 11:50:57 Signals: Menemukan 1 file, mentransfer 1 file berhasil

min-free-space

Ini memberi tahu PowerMTA batas ruang disk di mana ia harus mulai menghapus file acara JSON SparkPost tertua untuk memberi ruang bagi file baru ketika ruang disk mulai habis.

enable-signals

Ini memberi tahu PowerMTA untuk mengunggah ke Signals, dalam hal ini secara global untuk semua lalu lintas (info lebih lanjut di sini, untuk v5.0). Anda dapat lebih selektif tentang aliran lalu lintas mana yang akan diunggah jika Anda mau.

Anda juga dapat menandai lalu lintas PowerMTA tertentu untuk dilaporkan sebagai milik subakun SparkPost – ini adalah cara lain untuk membedakan satu aliran lalu lintas dari yang lain.

engagement-tracking, customer-id
Solusi Pelacakan Keterlibatan PowerMTA default ke domain pelacakan untuk layanan yang di-host SparkPost AS. Anda menentukan ID pelanggan numerik SparkPost Anda; berikut adalah instruksi untuk menemukannya.

tracking-domain

Untuk akun SparkPost EU, tambahkan baris berikut:

tracking-domain pmta.eu.spgo.io # ini adalah endpoint untuk SparkPost EU

Domain Pelacakan Kustom

Jika Anda lebih suka menggunakan domain pelacakan Anda sendiri (ini lebih baik dari sudut pandang pengiriman), lakukan hal berikut:

  • Buat domain pelacakan dengan penyedia DNS Anda dengan membuat rekaman CNAME. Ini biasanya akan menjadi subdomain dari domain teratas Anda, misalnya track.mycompany.com .

track.mycompany.com CNAME pmta.spgo.io # jika Anda memiliki akun SparkPost AS track.mycompany.com CNAME pmta.eu.spgo.io # jika Anda memiliki akun SparkPost EU

Anda juga dapat menggunakan domain pelacakan HTTPS, meskipun ini lebih terlibat (lihat langkah-langkah konfigurasi SparkPost di sini).

  • Daftarkan domain pelacakan di akun SparkPost Anda, dan verifikasi itu. Tunggu beberapa menit sebelum mencoba ini, untuk memungkinkan perubahan DNS Anda menyebar melalui Internet, tergantung pada penyedia DNS Anda.

  • Konfigurasikan PowerMTA untuk menggunakan domain tersebut alih-alih default, dengan

tracking-domain yourdomain.com # Letakkan domain Anda sendiri di sini

Anda dapat memeriksa apakah email yang dikirimkan memiliki "piksel terbuka" yang ditambahkan dan tautan dibungkus, dengan melihat internal email (di Gmail, gunakan menu di kanan atas dan pilih “Tampilkan Asli”).


Anda akan melihat piksel terbuka di awal dan akhir HTML dalam email. Setiap tautan HTML juga diubah agar memiliki REF  yang mengarah ke domain pelacakan.




Itulah semua yang Anda perlukan untuk membuat SparkPost Signals berfungsi dengan Pelacakan Keterlibatan bawaan PowerMTA.

Mencegah tautan tertentu dalam email HTML Anda agar tidak dilacak

Anda dapat mencegah PowerMTA melacak tautan tertentu, dengan menetapkan atribut khusus data-msys-clicktrack ke “0”  :

<a href="#" data-msys-clicktrack="0">Example</a>

PowerMTA tidak akan membungkus tautan tersebut. Itu juga akan menghapus atribut tersebut sebelum mengirim pesan kepada penerima Anda.

Pilih aliran lalu lintas PowerMTA mana yang akan dilaporkan ke Signals

Anda dapat memilih Sinyal untuk diaktifkan:

  • Secara global (ini adalah apa yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTA dan tidak yang lain

  • Untuk beberapa kumpulan Virtual MTA dan tidak yang lain

  • Untuk alamat 'Pengirim' atau 'Dari' tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pemilihan Virtual MTA / kumpulan Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh kasus penggunaan (v5.0) dalam Panduan Pengguna.

Anda dapat memilih Sinyal untuk diaktifkan:

  • Secara global (ini adalah apa yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTA dan tidak yang lain

  • Untuk beberapa kumpulan Virtual MTA dan tidak yang lain

  • Untuk alamat 'Pengirim' atau 'Dari' tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pemilihan Virtual MTA / kumpulan Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh kasus penggunaan (v5.0) dalam Panduan Pengguna.

Anda dapat memilih Sinyal untuk diaktifkan:

  • Secara global (ini adalah apa yang kami gunakan dalam contoh di atas)

  • Untuk beberapa Virtual MTA dan tidak yang lain

  • Untuk beberapa kumpulan Virtual MTA dan tidak yang lain

  • Untuk alamat 'Pengirim' atau 'Dari' tertentu yang diteruskan oleh PowerMTA, dalam kombinasi dengan pemilihan Virtual MTA / kumpulan Virtual MTA

Konfigurasi ini sangat kuat dan diilustrasikan melalui serangkaian contoh kasus penggunaan (v5.0) dalam Panduan Pengguna.

Menguji bahwa acara Anda mencapai Signals

Ini adalah tampilan SparkPost Signals, terhubung ke PowerMTA. Anda dapat melihat bahwa skor kesehatan bervariasi.




Nama Kampanye tersedia sebagai aspek pelaporan, bersama dengan Subaccount, IP Pool, Penyedia Kotak Surat, dan Domain Pengirim.

Selain melihat log PowerMTA, Anda dapat memeriksa bahwa data peristiwa mencapai SparkPost dengan melihat layar Integrasi Signals.




Di layar Pencarian Peristiwa SparkPost Anda, Anda harus melihat peristiwa muncul dalam beberapa menit. Ini akan mencakup peristiwa Penyuntikan dan Pengiriman, serta Pantulan, dan mungkin Pantulan di Luar Pita dan Keluhan Spam, jika Anda telah mengonfigurasi PowerMTA untuk menangani hal tersebut untuk Anda.
Jika Anda mengaktifkan Pelacakan Keterlibatan, Anda juga akan melihat acara open , initial_open , dan click .

Menggunakan nama yang berarti agar terlihat baik dalam pelaporan

Menyetel nama Kolam VirtualMTA PowerMTA dan nama Pekerjaan agar bermakna dan mudah dibaca oleh manusia sangat berharga untuk dilakukan. Ini langsung muncul dalam SparkPost Signals dan laporan Ringkasan Anda.

Seperti yang disebutkan sebelumnya, Anda tidak perlu membuat kolam ini di akun SparkPost Anda. SparkPost menangkapnya dari konfigurasi PowerMTA Anda.

Berikut adalah bagaimana istilah konfigurasi PowerMTA diterjemahkan ke istilah SparkPost.

Istilah PowerMTAIstilah Laporan / Sinyal SparkPostDomain Penerima
(bagian domain dari field “rcpt” dalam file Akuntansi).Domain PenerimaBagian domain dari header “Sender” atau “From” dalam pesan yang diteruskan oleh PowerMTA.
(bagian domain dari “orig” dalam file Akuntansi).Domain PengirimVirtualMTA (nama)—Kolam VirtualMTA (nama)
(“vmtaPool” dalam file akuntansi)Kolam IP (nama)smtp-source-host a.b.c.d
(“dlvSourceIp” dalam file akuntansi)Pengiriman IP a.b.c.dPekerjaan (nama)
(“jobId” dalam file akuntansi)ID Kampanye (nama)—Template (nama)“Subaccount” bukanlah konsep asli PowerMTA.




Namun, PowerMTA dapat menandai virtualMTAs, kolam MTA virtual, atau domain Pengirim-atau-From dengan ID subaccount untuk tujuan pelaporan SparkPost.

ID Subaccount (nomor)FBL (peristiwa)Keluhan Spam (peristiwa)Bounce Jarak Jauh (peristiwa)Bounce Out-of-Band (peristiwa)

 

Menyetel setidaknya satu alamat smtp-source-host juga memungkinkan SparkPost untuk secara tepat mengidentifikasi alamat IP pengirim sehingga muncul pada acara Injeksi dan Pengiriman, serta dalam tampilan laporan Ringkasan.

Nama pekerjaan diatur dalam PowerMTA melalui header dalam pesan yang diinjeksikan. Selain memungkinkan kontrol pekerjaan individu (pause/resume dll) yang berguna dalam dirinya sendiri, PowerMTA mengirimkan nama-nama tersebut ke pelaporan SparkPost Signals sebagai “ID kampanye”. Lihat Panduan Pengguna v5.0 bagian 12.8 “Tracking a campaign in PowerMTA with a JobID”.

Ada beberapa hal yang perlu diperhatikan terkait penamaan pekerjaan. Meskipun SparkPost (dengan format JSON, dan pelolosan JSON) memungkinkan karakter seperti <SPACE>  dalam nama kampanye, header surat lebih terbatas. Karakter yang valid yang diizinkan dalam header X-Job  adalah:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

Dengan kata lain, karakter yang tidak diizinkan termasuk <SPACE>, tanda kutip ganda “  dan backtick `. Jika Anda terbiasa bekerja dengan nama X-Job, ini tidak mengherankan, dan nama ID kampanye Anda akan “langsung bekerja” pada pelaporan SparkPost. Jika Anda seperti saya, pertama kali belajar SparkPost, Anda mungkin ingin alat untuk memastikan nilai X-Job Anda aman; lihat fitur bonus di akhir artikel ini.

Acara FBL (Spam Complaints) dan remote (out-of-band) bounces

PowerMTA dapat menerima dan memproses acara FBL (dikenal di SparkPost sebagai acara Keluhan Spam) dan pantulan jarak jauh (dikenal di SparkPost sebagai pantulan di luar jalur, karena balasan datang beberapa waktu kemudian, bukan selama percakapan SMTP).

Ada artikel di Forum Dukungan Port25 tentang cara mengatur Bounce Processor dan FBL Processor. Jika Anda adalah pengguna PowerMTA yang sudah ada, Anda mungkin sudah memiliki ini.

Berikut adalah konfigurasi yang saya buat untuk demo, berdasarkan artikel-artikel ini dan berorientasi untuk hosting PowerMTA di Amazon EC2.

Jika Anda sudah terbiasa dengan konfigurasi PowerMTA di area ini, Anda bisa melewati bagian ini, hingga ke garis horizontal berikutnya.

Konfigurasi Injection

Kami akan menggunakan port 587 untuk pesan yang disuntikkan, yang akan datang melalui Internet publik dari host lain. Kami perlu menghentikan aktor jahat menemukan dan menyalahgunakan layanan ini, jadi kami menerapkan otentikasi nama pengguna/sandi dan opsi TLS, mirip dengan endpoint injeksi SMTP SparkPost.

Kami ingin dapat mengirim pesan dari sumber yang terautentikasi dengan benar ke tujuan mana pun. Kami juga ingin pendengar terpisah pada port 25 untuk FBL dan respons bounce jarak jauh yang tidak memerlukan otentikasi.

# # Alamat IP dan port yang digunakan untuk mendengarkan koneksi SMTP masuk # smtp-listener 0.0.0.0:587 smtp-listener 0.0.0.0:25

Dalam deklarasi <source> berikut, kami menggunakan otentikasi nama pengguna/sandi dan TLS opsional untuk mempertahankan dari injeksi pesan jahat. Kami juga menetapkan batas laju pada koneksi yang melakukan upaya sandi yang gagal.

Pengaturan Anda mungkin berbeda; misalnya, jika Anda memiliki jaringan pribadi antara injector dan PowerMTA, Anda tidak perlu otentikasi sandi.

# Satu aturan sumber untuk semua injeksi, internal atau eksternal. Terapkan otentikasi, kecuali untuk bounce dan FBL # <source 0/0> log-connections false log-commands false # PERINGATAN: sangat detail! hanya untuk dev log-data false # PERINGATAN: bahkan lebih detail! smtp-service true # izinkan layanan SMTP smtp-max-auth-failure-rate 1/menit allow-unencrypted-plain-auth false allow-starttls true rewrite-list mfrom </source> <source {auth}> always-allow-relaying yes # hanya jika otentikasi berhasil default-virtual-mta default process-x-job true </source>

Deklarasi <source {auth}> (lihat di sini. v5.0) berlaku setelah otentikasi berhasil. Di sini, ini memungkinkan penerusan lebih lanjut, mengatur kelompok virtual MTA default yang akan digunakan, dan menambahkan header X-Job (yang akan dilaporkan oleh SparkPost Signals sebagai campaign_id).

Daftar reskrip memetakan pesan yang disuntikkan untuk menggunakan domain MAIL FROM tertentu (dikenal juga sebagai domain bounce atau Return-Path:).

# # Ubah alamat MAIL FROM agar sesuai dengan domain bounce # <rewrite-list mfrom> mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net </rewrite-list>

Kemudian kami menyiapkan konfigurasi TLS dan nama pengguna / sandi SMTP kami, sesuai dengan rekomendasi saat ini.

# # Amankan layanan masuk dengan nama pengguna, sandi, dan TLS. SMT 2020-06-15 # smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem smtp-server-tls-allow-tlsv1 false smtp-server-tls-allow-tlsv1.1 false smtp-server-tls-allow-tlsv1.2 true smtp-server-tls-allow-tlsv1.3 true # # Pengguna SMTP (terotentikasi melalui SMTP AUTH) # <smtp-user SMTP_Injection> password ##MASUKKAN SANDI ANDA DI SINI## authentication-method password </smtp-user>

Kami dapat memeriksa bahwa (tidak aman, deprecated) TLS v1.0 tidak diterima menggunakan alat uji SMTP favorit saya, swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 --to test@trymsys.net --from any@sparkpost.com --tls --tls-protocol tlsv1

Kami melihat:

*** Startup TLS gagal (connect(): error:00000000:lib(0):func(0):reason(0)) *** STARTTLS dicoba tetapi gagal

Demikian juga untuk –tls-protocol tlsv1_1.

Mari kita juga terapkan penandatanganan DKIM pada pesan keluar kita, karena ini adalah praktik yang baik (saya mengikuti instruksi ini untuk menyiapkan kunci).

# # DKIM # domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem

FBL dan OOB configuration

Sekarang .. akhirnya .. kami menentukan domain spesifik mana yang terbuka untuk bounce remote dan respons FBL. Kami tidak ingin menyampaikan itu ke mana pun (untuk mencegah serangan backscatter), hanya memproses respons tersebut secara internal.

# # Aktifkan pemrosesan Bounce dan FBL pada domain spesifik # relay-domain pmta.signalsdemo.trymsys.net relay-domain bounces.pmta.signalsdemo.trymsys.net relay-domain fbl.pmta.signalsdemo.trymsys.net <bounce-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain pmta.signalsdemo.trymsys.net domain bounces.pmta.signalsdemo.trymsys.net </address-list> </bounce-processor> <feedback-loop-processor> deliver-unmatched-email no deliver-matched-email no <address-list> domain fbl.pmta.signalsdemo.trymsys.net </address-list> </feedback-loop-processor>

Anda bisa melihat saya mengatur dua domain bounce, karena saya sedang mencoba menggunakan/tidak menggunakan aturan penulisan ulang mfrom.

Domain FBL biasanya kemudian didaftarkan dengan layanan eksternal seperti Microsoft SNDS; lihat artikel ini untuk informasi lebih lanjut. Untuk demo ini, FBL akan datang dari Bouncy Sink, jadi tidak perlu mendaftar.

Menguji pendengar SMTP

Hal ini penting untuk menguji bahwa listener SMTP Anda memerlukan otorisasi untuk tujuan umum apa pun, menolak pesan apa pun yang tidak secara khusus ditujukan ke domain FBL dan remote-bounce.

swaks --server pmta.signalsdemo.trymsys.net --port 25 --to test@strange.pmta.signalsdemo.trymsys.net --from any@sparkpost.com

Tanggapan, seperti yang diharapkan, menunjukkan bahwa penyampaian ditolak:

550 5.7.1 penyampaian ditolak untuk penerima dalam "RCPT TO:<test@strange.pmta.signalsdemo.trymsys.net>

(Akhir dari deskripsi pengaturan demo).

Pengaturan dan penamaan VirtualMTA

PowerMTA VirtualMTAs (dan kolam VirtualMTA) adalah fitur yang kuat untuk mengelola aliran pesan, dan fitur pelaporan PowerMTA / SparkPost Signals bekerja paling baik ketika fitur ini aktif.

# # Jalankan semua lalu lintas keluar melalui virtual mta / kolam ini. # Deklarasikan alamat IP pengiriman di sini, sehingga sinyal SparkPost mengumpulkan peristiwa injeksi (alias "reception") # akan membawa atribut sending_IP yang benar # <virtual-mta mta1>     smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net </virtual-mta> <virtual-mta-pool default>     virtual-mta mta1     <domain *>         max-smtp-out    20       # max. koneksi *per domain*         bounce-after    4d12h    # 4 hari, 12 jam         retry-after     10m      # 10 menit         dkim-sign       yes     </domain> </virtual-mta-pool>

Pengaturan virtual-mta-pool dilaporkan di SparkPost sebagai “IP Pool”, dan tersedia sebagai aspek pelaporan SparkPost Signals (menu tarik-turun di bawah grafik).




Laporan Ringkas juga menunjukkan IP Pool sebagai aspek pelaporan “Group By”.




Seperti yang telah disebutkan sebelumnya dalam artikel ini, menetapkan setidaknya satu alamat smtp-source-host juga memungkinkan SparkPost untuk mengidentifikasi alamat IP pengiriman dengan benar, sehingga muncul pada Peristiwa Injeksi dan Pengiriman, serta pada Laporan Ringkas:




Itu saja yang Anda butuhkan untuk mendapatkan integrasi dasar antara PowerMTA dan SparkPost Signals. Anda akan menemukan contoh file konfigurasi lengkap di sini.

Sebelum Anda pergi, inilah fitur bonus yang saya sebutkan.

Fitur bonus: pengecekan/penyaringan nama X-Job

Untuk memastikan string karakter aman digunakan sebagai nama PowerMTA X-Job, berikut adalah fungsi Python sederhana untuk memetakan karakter yang tidak aman ke garis bawah "_"

import re def pmtaSafeJobID(s):    """    :param s: str    :return: str    Memetakan string ID kampanye sembarang ke karakter yang diizinkan untuk header PMTA X-Job.    Lihat https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid    Khususnya tidak mengizinkan <sp> " ` tetapi mengizinkan sebagian besar karakter lainnya.    """    # Catatan harus melarikan diri ' - [ ] dan double-melarikan diri \ - lihat https://docs.python.org/3/library/re.html    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@\[\\\\\]^_{|}~]'    kembalikan re.sub(disallowedChars, '_', s)

Ini menggunakan ekspresi reguler Python dengan cara tertentu. Ini mendeklarasikan serangkaian karakter yang tidak diizinkan menggunakan operator “set complement” ^ daripada mencantumkan semua karakter yang diizinkan. Itu berarti kita menangkap (dan membuat aman) karakter di luar set 7-bit biasa. Kita bisa menunjukkannya menggunakan fragmen uji ini:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Menghasilkan

_!_#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__abcdefghijkl mnopqrstuvwxyz{|}~___________________________________________________________ ______________________________________________________________________

Anda dapat melihat bahwa <SPACE>, tanda kutip ganda “, dan backtick `, serta semua karakter di luar ~ dipetakan ke garis bawah.

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

R

Reach

G

Grow

M

Manage

A

Automate

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.