Content

Mengapa Perlu Migrasi Email dari Office 365?

Microsoft Office 365 adalah layanan email yang banyak digunakan perusahaan. Namun, ada kalanya perusahaan ingin berpindah ke server IMAP lokal untuk penghematan biaya, privasi data, atau integrasi sistem internal.

Sejak Microsoft menonaktifkan Basic Authentication pada Oktober 2022, migrasi email membutuhkan dukungan OAuth2, bukan lagi username & password biasa.

Jika kamu mencoba menggunakan username dan password biasa tanpa OAuth2, kamu kemungkinan akan menemukan error seperti:
  • auth [LOGIN]: 2 NO LOGIN failed.
atau:
  • NO CAPABILITY for AUTHENTICATE LOGIN
Error ini muncul karena server Microsoft 365 tidak lagi mengizinkan metode autentikasi lama (Basic Auth). Oleh karena itu, penggunaan OAuth2 menjadi satu-satunya cara agar autentikasi IMAP berhasil dalam proses migrasi.

Apa Itu Imapsync?

Imapsync adalah tool open-source yang memungkinkan sinkronisasi email antar server IMAP, cocok untuk migrasi email dari dan ke Office 365, Gmail, Zimbra, cPanel, atau server lainnya.

Persyaratan Sistem

Sebelum memulai, persiapkan:

  1. Sistem Operasi Berbasis Linux (misalnya, Ubuntu 20.04 atau 22.04)

  2. Akun Microsoft 365: Pastikan izin IMAP aktif, dan kamu memiliki password untuk login.

  3. oauth2_imap – skrip Python dari imapsync.lamiral.info yang digunakan untuk mendapatkan access token OAuth2 dari Microsoft Graph (digunakan saat login ke Office 365 via IMAP).
    Bisa Download disini atau disini 

  4. Akun IMAP tujuan: Pastikan akun IMAP tujuan beserta password-nya tersedia (contohnya disini admin menggunakan Zimbra).

Langkah-langkah Migrasi Email Office 365 ke Server IMAP

1. Install Imapsync Versi Terbaru

    • Instalasi Dependensi:
      Untuk memulai, Anda perlu menginstal beberapa dependensi Perl yang diperlukan oleh imapsync. Gunakan perintah berikut untuk menginstal semua paket yang dibutuhkan:
      sudo apt-get update
      sudo apt-get install \
        libauthen-ntlm-perl \
        libclass-load-perl \
        libcrypt-openssl-rsa-perl \
        libcrypt-ssleay-perl \
        libdata-uniqid-perl \
        libdigest-hmac-perl \
        libdist-checkconflicts-perl \
        libencode-imaputf7-perl \
        libfile-copy-recursive-perl \
        libfile-tail-perl \
        libio-compress-perl \
        libio-socket-inet6-perl \
        libio-socket-ssl-perl \
        libio-tee-perl \
        libjson-webtoken-perl \
        libmail-imapclient-perl \
        libmodule-scandeps-perl \
        libnet-dbus-perl \
        libnet-ssleay-perl \
        libpar-packer-perl \
        libproc-processtable-perl \
        libreadonly-perl \
        libregexp-common-perl \
        libsys-meminfo-perl \
        libterm-readkey-perl \
        libtest-fatal-perl \
        libtest-mock-guard-perl \
        libtest-mockobject-perl \
        libtest-pod-perl \
        libtest-requires-perl \
        libtest-simple-perl \
        libunicode-string-perl \
        liburi-perl \
        libtest-nowarnings-perl \
        libtest-deep-perl \
        libtest-warn-perl \
        make \
        time \
        cpanminus
    • Instalasi Modul Perl Mail::IMAPClient:
      Setelah menginstal dependensi, Anda dapat menginstal modul Mail::IMAPClient menggunakan CPAN (sebagai modul utama untuk imapsync):
      promax@fbs:~$ sudo cpanm Mail::IMAPClient
    • Mengunduh dan Menyiapkan imapsync:
      Setelah semua dependensi terpasang, Anda dapat mengunduh imapsync dari GitHub atau situs utama imapsync.
       root@fbs:/opt# wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
      --2025-04-15 12:35:43--  https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
      Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...
      Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.
      HTTP request sent, awaiting response... 200 OK
      Length: 828737 (809K) [text/plain]
      Saving to: ‘imapsync’
      
      Last-modified header missing -- time-stamps turned off.
      2025-04-15 12:35:45 (462 KB/s) - ‘imapsync’ saved [828737/828737]
      
      root@fbs:/opt#  chmod +x imapsync
      root@fbs:/opt# ./imapsync 
      Name:
      
       imapsync - Email IMAP tool for syncing, copying, migrating and archiving
       email mailboxes between two imap servers, one way, and without duplicates.

2. Konfigurasi OAuth2 untuk Sinkronisasi IMAP dari Office365 ke Zimbra

    • Instalasi Dependensi:
      apt update && apt install -y libauthen-sasl-perl libio-socket-ssl-perl libnet-ssleay-perl libterm-readkey-perl libwww-perl unzip
    • Unduh dan Ekstrak oauth2_imap:
      cd /opt
      wget --no-check-certificate https://fajar.hanara.id/oauth2_imap.zip
      unzip oauth2_imap.zip
      cd oauth2_imap
    • Jalankan Proses Autentikasi OAuth2 untuk Office365:
      root@fbs:/opt/oauth2_imap# ./oauth2_imap --provider office365 selvy.kurniawati@mavix-investama.com
      The provider used comes from --provider office365
      Reading tokens from file tokens/oauth2_tokens_selvy.kurniawati@mavix-investama.com.txt, if any
      
      Now waiting for the code, 120 sec max, at https://localhost:49087
      Launched httpd ssl
      Go to the following link with your web browser:
      
      https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=9e5f94bc-e8a4-4e73-b8be-63364c29d753&tenant=common&scope=offline_access%20https%3A%2F%2Foutlook.office.com%2FIMAP.AccessAsUser.All&login_hint=selvy.kurniawati%40mavix-investama.com&response_type=code&redirect_uri=https%3A%2F%2Flocalhost%3A49087&code_challenge=XAhVugCussoQbTbgMywVP154lDVUKaNRBy_lhlp8FOE&code_challenge_method=S256&state=qzgclpisxcgcvfzqljebridajovsrkcd
      
      I help you to open the link with the following, hoping it works
      firefox 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=9e5f94bc-e8a4-4e73-b8be-63364c29d753&tenant=common&scope=offline_access%20https%3A%2F%2Foutlook.office.com%2FIMAP.AccessAsUser.All&login_hint=selvy.kurniawati%40mavix-investama.com&response_type=code&redirect_uri=https%3A%2F%2Flocalhost%3A49087&code_challenge=XAhVugCussoQbTbgMywVP154lDVUKaNRBy_lhlp8FOE&code_challenge_method=S256&state=qzgclpisxcgcvfzqljebridajovsrkcd'
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/local/share/doc /usr/local/share/doc none bind,ro 0 0): cannot open directory "/usr/local/share": permission denied
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/gimp/2.0/help /usr/share/gimp/2.0/help none bind,ro 0 0): cannot write to "/var/lib/snapd/hostfs/usr/share/gimp/2.0/help" because it would affect the host in "/var/lib/snapd"
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/gtk-doc /usr/share/gtk-doc none bind,ro 0 0): cannot write to "/var/lib/snapd/hostfs/usr/share/gtk-doc" because it would affect the host in "/var/lib/snapd"
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/libreoffice/help /usr/share/libreoffice/help none bind,ro 0 0): cannot write to "/var/lib/snapd/hostfs/usr/share/libreoffice/help" because it would affect the host in "/var/lib/snapd"
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/sphinx_rtd_theme /usr/share/sphinx_rtd_theme none bind,ro 0 0): cannot write to "/var/lib/snapd/hostfs/usr/share/sphinx_rtd_theme" because it would affect the host in "/var/lib/snapd"
      update.go:85: cannot change mount namespace according to change mount (/var/lib/snapd/hostfs/usr/share/xubuntu-docs /usr/share/xubuntu-docs none bind,ro 0 0): cannot write to "/var/lib/snapd/hostfs/usr/share/xubuntu-docs" because it would affect the host in "/var/lib/snapd"
      mkdir: cannot create directory ‘/run/user/0’: Permission denied
      Authorization required, but no authorization protocol specified
      Error: cannot open display: :1
      
      
      Now I try to collect the code. Will give up in 120 seconds (maybe 4x).
      Entering oauth2_collect_code_localhost
      Leaving  oauth2_collect_code_localhost
      Entering oauth2_collect_code_localhost
      Connection accepted
      Use of uninitialized value $code in pattern match (m//) at /usr/share/perl5/HTTP/Daemon.pm line 466.
      Leaving  oauth2_collect_code_localhost
      
      
      Success collecting the code the second time
      
      GOOD!
      Exchanging the code for an access token and a refresh token...
      token_response: {"token_type":"Bearer","scope":"https://outlook.office.com/IMAP.AccessAsUser.All","expires_in":4053,"ext_expires_in":4053,"access_token":"eyJ0eiOiJKV1QiLCJub25jZSI6ImRINUFZaDNaZlNOX0tpUmVnc3dXUzVkZDNCMkN1dXhqamxsZE9wcU1vSU0iLCJhbGciOiJSUzI1NiIsIng1dCI6IkNOdjBPSTNSd3FsSEZFVm5hb01Bc2hDSDJYRSIsImtpZCI6IkNOdjBPSTNSd3FsSEZFVm5hb01Bc2hDSDJYRSJ9.eyJhdWQiOiJodHRwczovL291dGxvb2sub2ZmaWNlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q3YzQ5ZjAzLTM5YzAtNDIyNy04M2I0LTlhZDIzOWY1N2RmYS8iLCJpYXQiOjE3NDQ2OTU0NDAsIm5iZiI6MTc0NDY5NTQ0MCwiZXhwIjoxNzQ0Njk5Nzk0LCJhY2N0IjowLCJhY3IiOiIxIiwiYWlvIjoiQVVRQXUvOFpBQUFBTVk0RnVEZEZKVUcvVkJsL1Q3eTNTWnlBTTRNWnZYdE16U010QXFPbkduWnpwTy9ITjU2L3FIYWpGblJQMklJdTlyTUlEWmRIdmZnQVY0czdlWkRwcFE9PSIsImFtciI6WyJwd2QiXSwiYXBwX2Rpc3BsYXluYW1lIjoiVGh1bmRlcmJpcmQiLCJhcHBpZCI6IjllNWY5NGJjLWU4YTQtNGU3My1iOGJlLTYzMzY0YzI5ZDc1MyIsImFwcGlkYWNyIjoiMCIsImVuZnBvbGlkcyI6W10sImZhbWlseV9uYW1lIjoiS3Vybmlhd2F0aSIsImdpdmVuX25hbWUiOiJTZWx2eSIsImlkdHlwIjoidXNlciIsImlwYWRkciI6IjEwMy4xOTYuMTQ2LjIwNyIsImxvZ2luX2hpbnQiOiJPLkNpUXlOMlJpTnpBMFpDMWpNekpsTFRReU16Y3RPREF6WmkwNFpUSmxNMlV4TnpBek1tVVNKR1EzWXpRNVpqQXpMVE01WXpBdE5ESXlOeTA0TTJJMExUbGhaREl6T1dZMU4yUm1ZUm9rYzJWc2Rua3VhM1Z5Ym1saGQyRjBhVUJ0WVhacGVDMXBiblpsYzNSaGJXRXVZMjl0SU1rQiIsIm5hbWUiOiJTZWx2eSBLdXJuaWF3YXRpIiwib2lkIjoiMjdkYjcwNGQtYzMyZS00MjM3LTgwM2YtOGUyZTNlMTcwMzJlIiwicHVpZCI6IjEwMDMyMDAyRTU5OTU5QTYiLCJyaCI6IjEuQVZZQUE1X0UxOEE1SjBLRHRKclNPZlY5LWdJQUFBQUFBUEVQemdBQUFBQUFBQUNmQUY5V0FBLiIsInNjcCI6IklNQVAuQWNjZXNzQXNVc2VyLkFsbCIsInNpZCI6IjAwM2YzM2M5LWMyYzQtZGRiNS05MWZjLWYwYjc5MWJkYWU2NCIsInN1YiI6IlIzVkdreS1jcjdMUlFseWhmWi1WclRvY0s3QXI5VXc0MEV3X2w5OUJWMzgiLCJ0aWQiOiJkN2M0OWYwMy0zOWMwLTQyMjctODNiNC05YWQyMzlmNTdkZmEiLCJ1bmlxdWVfbmFtZSI6InNlbHZ5Lmt1cm5pYXdhdGlAbWF2aXgtaW52ZXN0YW1hLmNvbSIsInVwbiI6InNlbHZ5Lmt1cm5pYXdhdGlAbWF2aXgtaW52ZXN0YW1hLmNvbSIsInV0aSI6ImFjNmwtTkVvdmtxeXNDZFltblVxQUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfYXVkX2d1aWQiOiIwMDAwMDAwMi0wMDAwLTBmZjEtY2UwMC0wMDAwMDAwMDAwMDAiLCJ4bXNfaWRyZWwiOiIxIDEwIn0.GDYrpzJR-9762kBMr-8o4FZolk-Qo-7uStnQxuMiDCjPtGKE4f-Jrib6i1kwoJp0bp2kn9B6CF-DcAFoX-lJ7iX8of9gA_BA1Jk60w-NME8NF3BtF3lDOqPngUvsjqaxv4ZsRXi8wnLJ3vPiPtJSvB8uQ8VIDqJ95IbIlwqrP8Tuf3TIqT0bxI-UfHYnlWAcNO_UYxwnasegzeMBuqUt-zp_1ETkb9hthjiFSJjo2Xow82tozSQ3socRQMtaS9ft1xLs4VI2KzmufrkK2TVoUpNNJZiR1lail26FK8rPsR878FBdbHQcL6MuZzR8Xbtwru48JV__Ph1M1z-XsxLP6w","refresh_token":"1.AVYAA5_E18A5J0KDtJrSOfV9-ryUX56k6HNOuL5jNkwp11OfAF9WAA.AgABAwEAAABVrSpeuWamRam2jAF1XRQEAwDs_wUA9P8EB2A7tZuRWHvoKMw5T4iKouh1i6PnjSeqMdRgWFqsawwuqCJagbxpsirToSZcUu_iS13FSm8k94_3-fW3UNFdgNrFsSVU7QzLZqZSmbs-BMT84tCBFws66nEZoEuw8kY98v0yuYK3ihks-5lUCSQQhHrED7_cv97jUCuxni8y9k5cf7nlcQ52Q2cXkjbwi4WjqQL7V7cSLsbLasm3fWPsjz5NTK_-BJPOfSsveIFb3uBq3GV75pKBAUp9lIuUdip3Ta6n27NkOVik-2QuSmpMjphzo-sSIvdNQHQH0WnD0YFN52Lvuaype1aQFDDZ4TlcVPePP7TlIbn681LpbOtwJ3glg4tLcB3N3hsQv0-UO47iwQQwJDwNdTJTeuGhpvM2YwBpreR5cZo_igETY2m1T1soO2dCAdeOzTRjqdhw_ESnhUxUoXPb8o-dhQnRUinPTEJafzT2YXPdPwh9BSPCzxQXx4rOJU74lPJSLAuUQ_KtehVC7dy1QAv_FOGmDtGTqdRDSJX-8w7UTV7a5RlSR2IMAEKkrsifeKqXtUEBtxYnlqC-t2G3SqlqVMntdLWjN5WytvJSXZ0DBaqPcvLYFT40MJEVyp3d96HqaEqHMVGqbiPttA44KRu7Oc5Ovhy07zPBx7IvSiaGbuEOoE4nm6c8VOnP39_eX3W5MvQmJJiviMZrEHcxvRuTwMJ_hrufWawowfIC9iGGiIqNuduopw4KAOyxvRn-7-HSaPhaN8luNu7lQhaZux7uzHFRX671GUzYcZoMxUiU5xvU"}
      
      access token:
      eyJ0eXAiOiJKV1QiLCJub25jZSI6ImRINUFZaDNaZlNOX0tpUmVnc3dXUzVkZDNCMkN1dXhqamxsZE9wcU1vSU0iLCJhbGciOiJSUzI1NiIsIng1dCI6IkNOdjBPSTNSd3FsSZFVm5hb01Bc2hDSJYRSIsImtpZCI6IkNOdjBPSTNSd3FsSEZFVm5hb01Bc2hDSDJYRSJ9.eyJhdWQiOiJodHRwczovL291dGxvb2sub2ZmaWNlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q3YzQ5ZjAzLTM5YzAtNDIyNy04M2I0LTlhZDIzOWY1N2RmYS8iLCJpYXQiOjE3NDQ2OTU0NDAsIm5iZiI6MTc0NDY5NTQ0MCwiZXhwIjoxNzQ0Njk5Nzk0LCJhY2N0IjowLCJhY3IiOiIxIiwiYWlvIjoiQVVRQXUvOFpBQUFBTVk0RnVEZEZKVUcvVkJsL1Q3eTNTWnlBTTRNWnZYdE16U010QXFPbkduWnpwTy9ITjU2L3FIYWpGblJQMklJdTlyTUlEWmRIdmZnQVY0czdlWkRwcFE9PSIsImFtciI6WyJwd2QiXSwiYXBwX2Rpc3BsYXluYW1lIjoiVGh1bmRlcmJpcmQiLCJhcHBpZCI6IjllNWY5NGJjLWU4YTQtNGU3My1iOGJlLTYzMzY0YzI5ZDc1MyIsImFwcGlkYWNyIjoiMCIsImVuZnBvbGlkcyI6W10sImZhbWlseV9uYW1lIjoiS3Vybmlhd2F0aSIsImdpdmVuX25hbWUiOiJTZWx2eSIsImlkdHlwIjoidXNlciIsImlwYWRkciI6IjEwMy4xOTYuMTQ2LjIwNyIsImxvZ2luX2hpbnQiOiJPLkNpUXlOMlJpTnpBMFpDMWpNekpsTFRReU16Y3RPREF6WmkwNFpUSmxNMlV4TnpBek1tVVNKR1EzWXpRNVpqQXpMVE01WXpBdE5ESXlOeTA0TTJJMExUbGhaREl6T1dZMU4yUm1ZUm9rYzJWc2Rua3VhM1Z5Ym1saGQyRjBhVUJ0WVhacGVDMXBiblpsYzNSaGJXRXVZMjl0SU1rQiIsIm5hbWUiOiJTZWx2eSBLdXJuaWF3YXRpIiwib2lkIjoiMjdkYjcwNGQtYzMyZS00MjM3LTgwM2YtOGUyZTNlMTcwMzJlIiwicHVpZCI6IjEwMDMyMDAyRTU5OTU5QTYiLCJyaCI6IjEuQVZZQUE1X0UxOEE1SjBLRHRKclNPZlY5LWdJQUFBQUFBUEVQemdBQUFBQUFBQUNmQUY5V0FBLiIsInNjcCI6IklNQVAuQWNjZXNzQXNVc2VyLkFsbCIsInNpZCI6IjAwM2YzM2M5LWMyYzQtZGRiNS05MWZjLWYwYjc5MWJkYWU2NCIsInN1YiI6IlIzVkdreS1jcjdMUlFseWhmWi1WclRvY0s3QXI5VXc0MEV3X2w5OUJWMzgiLCJ0aWQiOiJkN2M0OWYwMy0zOWMwLTQyMjctODNiNC05YWQyMzlmNTdkZmEiLCJ1bmlxdWVfbmFtZSI6InNlbHZ5Lmt1cm5pYXdhdGlAbWF2aXgtaW52ZXN0YW1hLmNvbSIsInVwbiI6InNlbHZ5Lmt1cm5pYXdhdGlAbWF2aXgtaW52ZXN0YW1hLmNvbSIsInV0aSI6ImFjNmwtTkVvdmtxeXNDZFltblVxQUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdLCJ4bXNfYXVkX2d1aWQiOiIwMDAwMDAwMi0wMDAwLTBmZjEtY2UwMC0wMDAwMDAwMDAwMDAiLCJ4bXNfaWRyZWwiOiIxIDEwIn0.GDYrpzJR-9762kBMr-8o4FZolk-Qo-7uStnQxuMiDCjPtGKE4f-Jrib6i1kwoJp0bp2kn9B6CF-DcAFoX-lJ7iX8of9gA_BA1Jk60w-NME8NF3BtF3lDOqPngUvsjqaxv4ZsRXi8wnLJ3vPiPtJSvB8uQ8VIDqJ95IbIlwqrP8Tuf3TIqT0bxI-UfHYnlWAcNO_UYxwnasegzeMBuqUt-zp_1ETkb9hthjiFSJjo2Xow82tozSQ3socRQMtaS9ft1xLs4VI2KzmufrkK2TVoUpNNJZiR1lail26FK8rPsR878FBdbHQcL6MuZzR8Xbtwru48JV__Ph1M1z-XsxLP6w
      
      refresh token:
      1.AVYAA5_E18A5J0KDtJrSOfV9-ryUX56k6HNOuL5jNkwp11OfAF9WAA.AgABAwEAAABVrSpeuWamRam2jAF1XRQEAwDs_wUA9P8EB2A7tZuRWHvoKMw5T4ouh1i6PnjSeqMdRgWFqsawwuqCJagbxpsirToSZcUu_iS13FSm8k94_3-fW3UNFdgNrFsSVU7QzLZqZSmbs-BMT84tCBFws66nEZoEuw8kY98v0yuYK3ihks-5lUCSQQhHrED7_cv97jUCuxni8y9k5cf7nlcQ52Q2cXkjbwi4WjqQL7V7cSLsbLasm3fWPsjz5NTK_-BJPOfSsveIFb3uBq3GV75pKBAUp9lIuUdip3Ta6n27NkOVik-2QuSmpMjphzo-sSIvdNQHQH0WnD0YFN52Lvuaype1aQFDDZ4TlcVPePP7TlIbn681LpbOtwJ3glg4tLcB3N3hsQv0-UO47iwQQwJDwNdTJTeuGhpvM2YwBpreR5cZo_igETY2m1T1soO2dCAdeOzTRjqdhw_ESnhUxUoXPb8o-dhQnRUinPTEJafzT2YXPdPwh9BSPCzxQXx4rOJU74lPJSLAuUQ_KtehVC7dy1QAv_FOGmDtGTqdRDSJX-8w7UTV7a5RlSR2IMAEKkrsifeKqXtUEBtxYnlqC-t2G3SqlqVMntdLWjN5WytvJSXZ0DBaqPcvLYFT40MJEVyp3d96HqaEqHMVGqbiPttA44KRu7Oc5Ovhy07zPBx7IvSiaGbuEOoE4nm6c8VOnP39_eX3W5MvQmJJiviMZrEHcxvRuTwMJ_hrufWawowfIC9iGGiIqNuduopw4KAOyxvRn-7-HSaPhaN8luNu7lQhaZux7uzHFRX671GUzYcZoMxUiU5xvU

Setelah perintah dijalankan, aplikasi akan membuka link otorisasi dan menunggu kode selama 120 detik. Buka link tersebut di browser untuk melakukan login dan otorisasi.Jika menggunakan server tanpa antarmuka grafis (headless), salin link yang muncul ke browser.

    • Setelah login berhasil dan mengizinkan akses, token akan otomatis disimpan di direktori tokens/ dengan nama file:

      root@fbs:/opt/oauth2_imap# ls
      build_oauth2_imap_exe.bat  localhost_CA_cert  localhost.key           oauth2_example_dev.bat    oauth2_example_gmail.sh  oauth2_example_loop.sh        oauth2_imap      RCS                sundry
      cert                       localhost.crt      oauth2_example_any.bat  oauth2_example_gmail.bat  oauth2_example_loop.bat  oauth2_example_office365.bat  oauth2_imap.exe  README_oauth2.txt  tokens
      root@fbs:/opt/oauth2_imap# ls tokens/
      oauth2_tokens_selvy.kurniawati@mavix-investama.com.txt
      root@fbs:/opt/oauth2_imap#

3. Jalankan imapsync dengan Token OAuth2

    • Gunakan token OAuth2 yang telah disimpan pada langkah sebelumnya untuk sinkronisasi IMAP dari Office365 ke Zimbra:
    • ./imapsync \
        --host1 outlook.office365.com \
        --user1 selvy.kurniawati@mavix-investama.com \
        --oauthaccesstoken1 /opt/oauth2_imap/tokens/oauth2_tokens_selvy.kurniawati@mavix-investama.com.txt \
        --host2 mail.mavix-investama.com \
        --user2 selvy.kurniawati@mavix-investama.com \
        --password2 "GantiPassword123!" \
        --automap

      Penjelasan opsi:

      • --host1 dan --user1: Email sumber dari Office365.

      • --oauthaccesstoken1: Token OAuth2 hasil dari proses autentikasi.

      • --host2, --user2, dan --password2: Email tujuan di Zimbra dan password barunya.

      • --automap: Memetakan folder secara otomatis antar server.

Kesimpulan

Migrasi dari Office 365 ke server IMAP menggunakan imapsync dengan autentikasi OAuth2 memberikan fleksibilitas tinggi, terutama untuk kebutuhan backup, migrasi ke server on-premise seperti Zimbra, atau hanya sekadar audit. Dengan metode ini, kita bisa melakukan migrasi email secara aman tanpa menyimpan password asli user.

Tips Tambahan:

  • Batch Migrasi: Untuk banyak akun, buat file CSV berisi data akun sumber dan tujuan, lalu jalankan imapsync dengan script looping.

  • Limitasi Rate: Perhatikan batas rate API Microsoft. Gunakan --maxbytespersecond atau jeda antar akun bila migrasi masal.

  • Sinkronisasi Berkala: Bisa dijadwalkan via cron untuk sinkronisasi berkala jika belum akan cut-off user dari Office 365.

Was this article helpful to you?

Fajar Budi Setiawan

Saya, Fajar Budi Setiawan, berpengalaman dalam jaringan, server, dan web server. Keahlian saya meliputi VPN, monitoring jaringan, manajemen bandwidth, dan firewall. Saya terampil dalam konfigurasi server (VPS, Proxmox, Zimbra) dan web server (Apache, Nginx, IIS), serta pengelolaan WordPress dan Docker.

4 Responses to “Cara Migrasi Email dari Office 365 ke Server IMAP Menggunakan Imapsync dan OAuth2 di Ubuntu”

  1. Rudi

    Tutorial ini work banget! Saya pakai Ubuntu Server 24.04 LTS dan tidak ada error. Tapi waktu generate OAuth2 token agak bingung.

    Reply
    • Fajar Budi Setiawan

      Terima kasih Rudi! Untuk bagian OAuth2 Office 365, yang penting adalah pendaftaran aplikasi di portal Azure dan memastikan permission IMAP sudah diaktifkan. Kami juga sarankan menggunakan tool seperti o365-imap-oauth2 atau imap-oauth2-client untuk mempermudah proses generate token.

      Reply
  2. Ahmad

    Terima kasih banyak, tutorialnya sangat membantu! Saya sudah coba migrasi dari Office 365 ke Zimbra lokal dan berhasil. Tapi apakah cara ini juga bisa diterapkan untuk server mail lain seperti Mailcow atau iRedMail?

    Reply
    • Fajar Budi Setiawan

      Sama-sama Mas, senang mendengar migrasinya berhasil! Ya, prinsip kerja Imapsync dengan OAuth2 ini cukup fleksibel dan bisa digunakan untuk migrasi ke server IMAP lain seperti Mailcow, iRedMail, bahkan Dovecot. Yang penting, server tujuan mendukung akses IMAP standar. Jangan ragu untuk kontak kami jika ada kendala konfigurasi.

      Reply

Leave a Reply