Mozilla Thunderbird Menghadirkan Dukungan Native untuk Exchange
(blog.thunderbird.net)- Thunderbird akan mendukung Microsoft Exchange, yang banyak digunakan di perusahaan dan institusi pendidikan, secara native mulai ESR Juli 2024; cakupan awalnya terbatas pada email
- Pekerjaan ini bukan sekadar menambahkan dukungan Exchange Web Services (EWS), tetapi juga menjadi momentum untuk secara bertahap merapikan keterbatasan arsitektur protokol email yang sudah berusia lebih dari 20 tahun serta kode C++ lama
- Rust dipilih sebagai bahasa implementasi, dengan alasan utama keamanan memori, performa native, modularitas, serta CI yang dibagi dengan Firefox dan interoperabilitas XPCOM
- Dalam proses integrasi EWS, dibuat crate seperti
xpcom_async,moz_http,xml_struct, danews, yang membungkus pemanggilan HTTP berbasis XPCOM dan serialisasi XML agar lebih ramah bagi Rust - EWS tidak akan tersedia di Exchange Online setelah Oktober 2026, tetapi karena masih banyak pengguna Exchange Server on-premises, dukungan ini tetap diperlukan di Thunderbird
Cakupan dukungan Exchange pada ESR Juli 2024
- Thunderbird berencana menyediakan dukungan Exchange secara native pada rilis ESR (Extended Support) berikutnya, yaitu Juli 2024
- Cakupan awalnya terbatas pada email
- Dukungan kalender dan buku alamat akan ditambahkan setelahnya
- Hingga baru-baru ini, fitur Exchange hanya dapat digunakan melalui add-on
- Target implementasinya adalah API Exchange Web Services (EWS) dari Microsoft
- EWS berjalan di atas HTTP
- Isi request dan response menggunakan XML
Beban arsitektur email yang berusia lebih dari 20 tahun
- Arsitektur protokol email Thunderbird saat ini didasarkan pada kode yang lebih tua daripada Thunderbird sendiri
- Dikembangkan lebih dari 20 tahun lalu sebagai bagian dari Netscape Communicator
- Setelah Mozilla menyerahkan kepemilikan Thunderbird kepada komunitas pada 2012, tidak ada pemeliharaan berbayar hingga proyek ini bergabung kembali dengan Mozilla Foundation pada 2017
- Karena perubahan sementara menumpuk tanpa arah arsitektur besar, masih banyak kode C++ yang tidak menggunakan standar modern
- Selama 20 tahun proyek Thunderbird berjalan, belum pernah ada dukungan protokol email baru yang ditambahkan
- Ketika protokol email berubah mengikuti pola penggunaan modern, struktur terkait tidak ikut diperbarui
- Banyak pengetahuan institusional juga telah hilang
- Dukungan Exchange adalah pekerjaan yang dipimpin organisasi pertama untuk memahami keterbatasan arsitektur Thunderbird dan mengatasinya secara bertahap
Alasan memilih Rust
- Rust dipilih sebagai bahasa implementasi untuk dukungan protokol baru Thunderbird
- Latar belakang pemilihannya mencakup keunggulan umum Rust dan kondisi khusus Thunderbird
- Keamanan memori: Thunderbird menerima input dari siapa pun yang mengirim email, sehingga mengurangi bug keamanan menjadi hal penting
- Performa: Rust berjalan sebagai kode native
- Modularitas dan ekosistem: Struktur modul Rust dan ekosistem terkait email dapat dimanfaatkan
- Karena Thunderbird dibangun di atas kode Firefox, prasyarat untuk mengadopsi Rust sudah tersedia
- Infrastruktur CI yang dibagi dengan Firefox mendukung Rust
- Lapisan interoperabilitas XPCOM (Cross-Platform Component Object Model) milik Firefox memungkinkan pemanggilan antar-Rust, C++, dan JavaScript
- Tipe dan tooling Rust membantu membuat API yang sulit disalahgunakan
- Misalnya menghindari referensi siklik, atau membuat fungsi yang tidak bisa dipanggil dengan nilai yang tidak bermakna
- Tool dokumentasi sudah menjadi bagian bawaan bahasa, sehingga berguna bagi tim kecil
- Jika dibuat sebagai crate modular, komponen ini dapat digunakan kembali oleh proyek lain seperti Thunderbird for Android/K-9 Mail
Batasan build system dan XPCOM
- Saat menjalankan komponen Rust pertama di dalam Thunderbird, build system menjadi hambatan pertama
- Thunderbird bukanlah struktur yang melekat seperti dependensi umum pada kode Firefox
- Saat build, kode Firefox diambil
- Kode Thunderbird diambil sebagai subtree Firefox
- File konfigurasi build menunjuk ke subtree tersebut
- Firefox menggabungkan masing-masing crate ke dalam satu workspace Cargo untuk membuat grafik dependensi Cargo seluruh tree
- Thunderbird juga membutuhkan workspace Cargo sendiri, tetapi Cargo tidak mengizinkan workspace bertumpuk
- Sebagai solusi, workspace Thunderbird sendiri didefinisikan, lalu tool build tingkat atas
machdikonfigurasi untuk membuild workspace ini alih-alih workspace Firefox - Subcommand
machbaru menyinkronkan dependensi dan lockfile dengan tingkat atas, lalu mem-vendor superset hasilnya
- XPCOM dirancang dengan fokus pada C++, sehingga pengalaman pengembangan Rust tidak mulus
- Implementasi dan penggunaan interface XPCOM membutuhkan banyak boilerplate
- Tool seperti
rust-analyzersulit dimanfaatkan secara memadai - Firefox telah banyak mengurangi ketergantungan pada XPCOM, tetapi Thunderbird tidak sempat melakukan pembersihan serupa selama masa kosong pemeliharaan
- Dukungan protokol email baru memerlukan implementasi ratusan fungsi yang didefinisikan di XPCOM
- Implementasi protokol yang ada mengurangi beban dengan mewarisi class C++ yang menyediakan perilaku bersama
- Di Rust, hal ini tidak bisa dilakukan secara langsung, sehingga logika per protokol diimplementasikan di Rust
- Class bridge C++ menghubungkan crate internal
ews_xpcomdengan kode perilaku bersama yang sudah ada
- Cara membuat komponen Rust di Thunderbird didokumentasikan di dokumentasi
Menangani request HTTP dengan gaya Rust
- Firefox sudah memiliki stack HTTP melalui komponen networking
necko neckoditulis dalam C++ dan diekspos melalui XPCOM, sehingga jika digunakan langsung dari Rust membutuhkan banyak boilerplate- Bahkan request GET sederhana pun memerlukan pembuatan banyak objek XPCOM
- XPCOM mengelola masa hidup pointer, tetapi compiler Rust tidak mengetahuinya, sehingga diperlukan blok
unsafe - Interface yang diperlukan berbasis callback
- Crate internal Thunderbird
xpcom_asyncmengubah pekerjaan asinkron XPCOM menjadi sintaks async/await Rust- Data yang masuk melalui callback dibuffer
- Mengimplementasikan trait
Futuremilik Rust agar pemanggil dapat melakukanawait Futuredi Rust mirip denganPromisedi JavaScript atau coroutine di Python
- Crate internal
moz_httpmenyediakan klien HTTP yang terinspirasi olehreqwest- Menangani pembuatan objek XPCOM yang diperlukan
- Menyediakan penanganan error yang lebih Rust-like daripada penanganan error XPCOM standar
Serialisasi XML EWS dan crate baru
- Pekerjaan paling sulit dalam EWS adalah mengonversi antara struktur data internal Thunderbird dan XML yang dibutuhkan atau diberikan oleh EWS
- Crate serialisasi/deserialisasi XML yang ada tidak memenuhi kebutuhan
- Model data
serdetidak cocok dengan XML, sehingga sulit membedakan atribut dan elemen - EWS sensitif terhadap namespace XML, tetapi ini bukan konsep yang familier bagi
serde - Crate keluarga
serdeuntuk XML mengharuskan cara serialisasi setiap field dianotasi secara eksplisit - EWS mendefinisikan ratusan tipe dan puluhan field per tipe, sehingga boilerplate menjadi tidak tertangani
- Model data
- Implementasi berbasis
serdeyang ada sudah cukup untuk mendeserialisasi XML menjadi Rust, tetapi tidak ditemukan tool serialisasi yang memuaskan - Crate baru
xml_structmenyediakan trait yang mendefinisikan perilaku serialisasi XML dan macro derive prosedural- Menghasilkan implementasi trait secara otomatis untuk struktur data Rust
- Dibangun di atas crate
quick_xmlyang sudah ada - Bertujuan memetakan XML dan Rust dengan boilerplate yang minim
- Tidak bergantung pada internal Thunderbird/Firefox dan masih dalam tahap pengembangan awal
- Crate baru
ewsmendefinisikan tipe untuk pekerjaan EWS serta API serialisasi/deserialisasi XML- Berbasis
xml_structdanserde - Masih dalam tahap pengembangan awal dan tersedia secara publik di GitHub
- Berbasis
Rencana pengujian, penanganan error, dan koneksi UI
- Sebelum memasukkan fitur utama berikutnya, pengujian otomatis sedang diperkuat
- Selain unit test, mock EWS server untuk integration test juga ditambahkan
- Dalam proses memperkuat pengujian, beberapa crash dan masalah double-sync terungkap dan diperbaiki
- Fitur baru menjadi lebih mudah diuji dan diverifikasi
- Penanganan error EWS sedang diperbaiki
- Perilaku error EWS sering kali kurang terdokumentasi
- Seluruh request dapat gagal karena throttling atau struktur yang salah
- Sebagian request dapat berhasil sementara sebagian lainnya gagal karena ID yang salah
- Beberapa error dapat ditangani di level protokol, tetapi sebagian memerlukan intervensi pengguna atau mungkin sulit diselesaikan
- Dukungan protokol EWS diperluas melalui crate
ewsdan crate internalews_xpcom, serta sedang dihubungkan dengan UI Thunderbird- Patch terbaru memungkinkan akun EWS ditambahkan ke Thunderbird
- Hierarki folder akun dapat disinkronkan dari server remote
- Folder yang telah disinkronkan dapat ditampilkan di UI
- Saat ini fitur berstatus alfa ini disembunyikan di balik build flag dan nilai konfigurasi
- Pekerjaan berikutnya adalah fitur mengambil daftar pesan dari server remote dan generalisasi dukungan email keluar Thunderbird
- Untuk pemeliharaan, dokumentasi sedang dibuat tentang bagaimana tiap komponen dirangkai, arsitektur protokol email Thunderbird yang ada, dan arah perbaikan ke depan
Hubungan EWS dan Microsoft Graph
- EWS tidak dapat digunakan di Exchange Online setelah Oktober 2026
- Riset awal proyek menunjukkan masih ada cukup banyak pengguna yang terus memakai Exchange Server on-premises
- Banyak perusahaan dan institusi pendidikan menjalankan Exchange Server di hardware mereka sendiri
- Instalasi on-premises seperti ini umumnya mendukung EWS
- Graph API berbasis Azure tidak dapat didukung
- Dukungan EWS menjadi sarana untuk mendukung pengguna seperti ini dalam waktu dekat
- Graph API masih memiliki beberapa masalah yang belum terselesaikan
- Graph API dibuat dengan mempertimbangkan layanan berbasis web, bukan aplikasi desktop
- Dengan menambahkan dukungan EWS lebih dahulu, ada waktu untuk mencari solusi atas masalah tersebut sebelum membuat dukungan Graph API
- Pekerjaan Rust dan EWS adalah bagian dari upaya yang lebih besar untuk mengurangi turnaround Thunderbird dan meningkatkan ketahanan inti perangkat lunaknya
1 komentar
Opini Hacker News
Saya tidak mengerti kenapa ini diimplementasikan, padahal EWS sudah dijadwalkan untuk dihentikan dan akan dihapus dua tahun lagi: https://techcommunity.microsoft.com/t5/exchange-team-blog/re...
Kalau EWS hilang, cukup banyak pelanggan juga akan pergi, dan pada awalnya mungkin belum sampai memukul kinerja Microsoft
Namun pada akhirnya akan terlihat bahwa semua email itu setara, dan Exchange Online bisa menjadi catatan kaki dalam sejarah. Dari luar, ini agak memalukan karena Microsoft seperti gagal besar dalam urusan email, tetapi kenyataannya tidak selalu begitu
Mengoperasikan sistem email itu menyakitkan, dan yang benar-benar diinginkan Microsoft hanyalah data dan metadata yang bisa mereka tambang lalu jual ke para penggila data lain. Email pada dasarnya statis dan besar dari sisi penyimpanan, tetapi dalam pertukaran antarindividu bisa ada tambang emas
Idealnya, biarkan pihak seperti AWS dan Google menanggung rasa sakitnya, lalu buat pelanggan memakai Outlook. Setelah itu ubah agar kredensial disimpan di cloud Microsoft, seperti Outlook versi Electron baru, lalu gunakan kredensial itu untuk menambang data email di cloud orang lain sementara biaya penyimpanannya ditanggung pihak sana. Luar biasa
Graph API juga sudah dipertimbangkan dan bisa dipertimbangkan lagi ke depannya, tetapi saat ini cakupan dukungannya lebih sempit daripada EWS dan kurang beberapa fitur yang dibutuhkan aplikasi desktop
Meski sudah ada pengumuman bahwa dukungan EWS akan dihapus dari Exchange Online, dalam jangka pendek EWS masih bernilai untuk memungkinkan akses bagi basis pengguna yang luas, dan dalam jangka panjang untuk mendukung pengguna instalasi on-premise
Kalau tujuannya sekadar menambah jumlah pengguna Thunderbird, secara strategis ini masuk akal, tetapi secara ideologis dukungan JMAP tampak jauh lebih baik
Baru-baru ini saya mencoba Thunderbird sebagai pengganti Outlook, dan masalahnya mirip Firefox sebelum pembaruan Quantum. Terlalu lambat
Saat berpindah antar folder yang berisi ratusan hingga ribuan email, ada jeda yang terasa jelas, sedangkan di Outlook perpindahannya praktis instan
Untuk kalender justru sebaliknya, jadi sekarang saya menjalankan keduanya berdampingan. Salah satu masalahnya sepertinya adalah bridge iCal ke server Outlook yang wajib saya pakai di perusahaan
Sayangnya pengumuman ini tidak mengubah bagian itu. Dulu saya sempat memakai add-on EWS yang dipelihara Ericsson: https://github.com/Ericsson/exchangecalendar
Namun tampaknya Mozilla mematahkan antarmuka dengan cepat sehingga membuat banyak pengembang plugin pergi. Sekarang mereka memasukkan kembali sebagian fungsi ke core, tetapi saya tidak yakin itu strategi yang baik. Menurut saya mereka sebaiknya berfokus pada antarmuka yang stabil
Saya tidak suka Exchange, tetapi pekerjaan ini menyenangkan untuk dilihat. Sekarang, bahkan saat terjebak di Windows, mungkin saya akhirnya bisa berhasil mengirim email teks biasa dari Exchange
Setelah melihat betapa seringnya email teks biasa dirender dengan font monospace, bukan dengan cara yang lebih masuk akal, saya merasa sulit membenarkan teks biasa hanya dengan alasan “email HTML itu menjijikkan”
Pernyataan bahwa “selama 20 tahun sejarah proyek Thunderbird, belum pernah ada orang yang menambahkan dukungan protokol email baru” secara teknis benar, tetapi tiap perusahaan besar membutuhkan pengaturan khusus per klien email, alias workaround, untuk implementasi autentikasi OAuth2 out-of-band, dan Thunderbird juga sudah mengumpulkan cukup banyak hal semacam itu
Itu bukan protokol email umum. Bukan IMAP, POP3, atau SMTP, melainkan berjalan di atas HTTPS
“Belum pernah menambahkan protokol email baru” adalah hal yang baik, dan perubahan kali ini bukan hal yang baik. Mendukung konfigurasi proprietary itu praktis dan bisa dimengerti, tetapi bukan hal baik
Ini hanya meredakan sementara masalah email yang terpecah menjadi puluhan varian per perusahaan, dan dalam jangka panjang justru mendorong orang menerima varian-varian seperti itu
Sebaliknya, bisa memakai Thunderbird sebagai klien adalah keuntungan bersih dan pilihan yang praktis
Saya tidak tahu kenapa judulnya diubah. Tulisan ini adalah tentang pemrograman Rust
“Bringing Exchange Support to Thunderbird” terlihat seperti tulisan tentang dukungan Thunderbird dan Exchange, tetapi isinya bukan sesuatu yang bisa diketahui dari tulisan ini
Dukungan untuk spesifikasi proprietary memang berguna, tetapi saya berharap Mozilla memprioritaskan implementasi standar seperti autodiscovery server submission email (SMTP). Misalnya, rfc6186 sudah ada sejak 2011
Saat ini pengguna harus memasukkan sendiri hostname dan port server SMTP; mungkin itu tidak masalah bagi orang-orang di situs ini, tetapi sama sekali tidak ramah bagi 99,9% umat manusia lainnya
Upaya yang diperlukan untuk mengimplementasikan Exchange sepenuhnya kemungkinan beberapa orde besaran lebih besar daripada discovery server submission lewat DNS/SRV. Saya benar-benar tidak memahami prioritas Mozilla
Apakah ini ditangani sebagai kasus khusus?
Wah, ini mengingatkan saya pada masa bekerja di TI sekitar 20 tahun lalu. Lingkungannya hampir sepenuhnya Microsoft, hanya beberapa orang yang memakai Linux
Exchange selalu menjadi salah satu hal yang sulit dicari klien yang layak, dan kalau ini sudah ada waktu itu, saya pasti akan senang bukan main
Menggunakan produk Microsoft di Linux benar-benar menyakitkan, dan khususnya kalau tidak memakai Edge, sepertinya mereka sedang dalam proses menghentikan versi web Teams :(
Bahwa “sekitar 2012 Mozilla melepas Thunderbird dan menyerahkan kepemilikannya kepada komunitas, lalu tidak ada pemeliharaan berbayar sampai Thunderbird bergabung kembali dengan Mozilla Foundation pada 2017” benar-benar sebuah skandal
Itu contoh utama prioritas Mozilla yang terbalik
Anda mungkin tidak menyukainya, dan saya juga tidak terlalu senang. Namun itu fakta, dan tidak layak didanai Mozilla
Saya berharap impor file PST disertakan secara bawaan agar orang-orang yang ingin lepas dari instalasi Outlook bisa beralih dengan mulus tanpa harus mengutak-atik Outlook itu sendiri
Sudah ada proyek gratis untuk membaca file PST, jadi tinggal diintegrasikan ke rangkaian produknya
Edit: Ah, bukan. Ternyata hanya untuk on-premises. Ini benar-benar bodoh