Thursday, January 17, 2013

Migrasi (Sync) antar IMAP Server menggunakan offlineimap

Apabila Anda berencana berganti Email Server/platform, dimana keduanya mendukung protocol IMAP untuk retrieve email, maka Anda bisa memanfaatkan offlineimap.
Sebenarnya ada banyak tool serupa, ada yang berbayar, ada pula yang open source. Yang berbayar diantaranya: imap-sync, imap_tools, Cyrus utils, dll.
Baiklah kita mulai take action! 
Kali ini saya menggunakan Linux Ubuntu karena kebetulan offlineimap sudah tersedia di Ubuntu Package:
  1. Install offlineimap di Ubuntu, jalankan command berikut ini:
    $sudo apt-get install offlineimap
  2. Siapkan konfigurasi kedua IMAP server. Konfigurasikan IMAP server sumber sebagai remoteconfiguration, dan IMAP server tujuan sebagai localconfiguration.
    file: migrasi-imap.conf
    [general]
    accounts = yahoo2gmail
    
    [Account yahoo2gmail]
    remoterepository = Yahoo
    localrepository = Gmail
    
    [Repository Yahoo]
    type = IMAP
    remotehost = imap.mail.yahoo.com
    remoteuser = john.doe@yahoo.com
    remotepass = secret
    ssl = yes
    
    [Repository Gmail]
    type = IMAP
    remotehost = imap.gmail.com
    remoteuser = john.doe@gmail.com
    remotepass = secret
    ssl = yes
    
  3. Jalankan offlineimap dengan command berikut:
    $offlineimap -c migrasi-imap.conf
Ada beberapa hal yang perlu jadi catatan, terutama dalam proses coba-mencoba:
  • offlineimap ini melakukan sinkronisasi 2 arah, artinya email yang ada di IMAP server sumber akan di-transfer ke IMAP server tujuan, begitu juga sebaliknya. 
  • Proses delete email juga akan dimigrasikan, hal ini cukup merepotkan jika Anda melakukan beberapa kali percobaan migrasi, karena jika tidak hati-hati maka email yang ada di IMAP server sumber juga akan ikut terhapus.
  • Perhatikan konversi IMAP folder dari satu platform ke platform yang lain. Beberapa platform memiliki format yang sedikit berbeda, seperti GMail misalnya. Folder Drafts, Sent items dan Trash adalah:
    • [Gmail].Drafts
    • [GMail].Sent Items
    • [Gmail].Trash
Semoga bermanfaat! dan Selamat mencoba!

Friday, December 7, 2012

Google Apps: Setup Send-as alias (GMail setting) berdasarkan Nickname (CPanel)


By-default, Nickname atau alias yang di-set pada Google Apps Control Panel hanya berfungsi untuk menerima email. Seperti pada contoh gambar berikut:
user eddy[at]sadaweb[dot]com, selain bisa menerima dari  eddy[at]sadaweb[dot]com, juga bisa menerima email dari eddy.mulyono[at]sadaweb[dot]com dan masuk pada Mailbox yang sama.

Sedangkan apabila user juga ingin mengirim email menggunakan Nickname/Alias yang dia miliki, maka dia harus melakukan langkah-langkah tambahan yang harus dilakukan dari halaman Setting GMail sebagai mana yang dijelaskan pada tutorial berikut.

Apabila Anda adalah seorang Administrator Google Apps yang tidak mau membebani end-user untuk melakukan langkah-langkah tambahan tersebut, Anda bisa memanfaatkan Provisioning API dan Email Settings API untuk mengotomatisasi proses ini.

Authorize API dengan OAuth 2.0

#Generate Client ID dan Client Secret dari https://code.google.com/apis/console/
CLIENT_ID = 'xxxxxxxxxxxx.apps.googleusercontent.com' 
CLIENT_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
#Scope untuk Provisioning API (User dan Alias) dan Email Setting API
SCOPE = 'https://apps-apis.google.com/a/feeds/user/ https://apps-apis.google.com/a/feeds/alias/ https://apps-apis.google.com/a/feeds/emailsettings/2.0/'
USER_AGENT = 'GApps-Alias2SendAs/0.1'
#Diawal kosong, namun apabila sudah generate bisa langsung di hard-code disini suapaya tidak melakukan Authorize berulang-ulang
REFRESH_TOKEN = ''

def genenrate_oauth_token():
  global REFRESH_TOKEN
  token = gdata.gauth.OAuth2Token(
          client_id=CLIENT_ID, client_secret=CLIENT_SECRET,
          scope=SCOPE, user_agent=USER_AGENT,
          refresh_token=REFRESH_TOKEN)
  if (REFRESH_TOKEN == ''):
    uri = token.generate_authorize_url()
    print 'Please visit this URL to authorize the application:'
    print uri
    code = raw_input('What is the verification code? ').strip()
    code
    token.get_access_token(code)
    #cache to config
    print 'Refresh token: ' + token.refresh_token
    REFRESH_TOKEN = token.refresh_token
  
  return token

Retrieve Nickname menggunakan Provisioning API

import gdata.apps.multidomain.client;
...
def retrieve_alias(email):
  username = email[:email.find('@')]
  domain = email[email.find('@')+1:]
  multiDomainClient = gdata.apps.multidomain.client.MultiDomainProvisioningClient(domain=domain)
  token = genenrate_oauth_token()  
  token.authorize(multiDomainClient)
  multiDomainClient.ssl = True
  response = multiDomainClient.RetrieveAllUserAliases(email)
  for entry in response.entry:    
    print 'Email: %s, Alias: %s' % (entry.GetUserEmail(), entry.GetAliasEmail())

Setup Send-As menggunakan Email Settings API

import gdata.apps.emailsettings.client
...
def create_sendas(email, alias):
  username = email[:email.find('@')]
  domain = email[email.find('@')+1:]
  client = gdata.apps.emailsettings.client.EmailSettingsClient(domain=domain)
  token = genenrate_oauth_token()  
  token.authorize(client)
  client.ssl = True
  response = client.CreateSendAs(username=username, name=alias, address=alias, make_default=False)
Download full source code: http://goo.gl/wCVOd


Sample code ini akan sangat bermanfaat bagi Anda yang memaksimalkan fungsi Alias/Nickname untuk semua user Google Apps do Organisasi Anda. Contoh yang pernah saya temui, ada suatu institusi yang mengharuskan user-user mereka Login ke Google Apps menggunakan Nomor Induk atau ID, yang sulit diingat sebagai alamat email. Sehingga mereka juga setup Nickname yang menggunakan nama user, yang tentu saja lebih mudah diingat.

Semoga bermanfaat!

Tuesday, October 16, 2012

Menggunakan OAuth 2.0 Service Account untuk mengakses Google APIs

Berawal dari dokumentasi Google mengenai OAuth 2.0 yang ditujukan untuk aplikasi yang berupa Service account. Perbedaan utama dari OAuth model lainnya adalah, tidak dibutuhkannya masing-masing User untuk melakukan process Authorize. Proses Authorize itu sendiri digantikan dengan suatu Permission yang di configure disisi Control Panel.
Model OAuth 2.0 Service Account ini sangat pas apabila digunakan untuk Program yang berjalan terus-menerus (service) atau aplikasi yang berjalan di background, yang mebutuhkan akses ke semua User dalam satu domain Google Apps.

Membuat OAuth 2.0 Client ID

  1. Kita buat OAuth project dari console API. Apabila belum pernah membuat project sebelumnya, akan disodorkan menu untuk membuat Project. Klik menu Create OAuth Project. Apabila sudah pernah membuat Project sebelumnya, pilih pada drop-down list Porject, pilih Create...
  2. Klik menu API Access, kemudian klik Create an OAuth 2.0 client ID. Isi informasi umum seputar Project ini (terserah), yang harus diperhatikan adalah pada Application Type, pilih Service account.
  3. Setelah itu akan muncul dialog untuk Download Private Key. Nanti kita akan gunakan Private Key ini.
  4. Hasilnya sebagai berikut. Catat Client ID dan Email Address juga.

Mulai Beraksi!


Dalam contoh ini saya menggunakan bahasa Python yang memang favorit saya, meskipun bukan expertise saya (setidaknya ketika saya menulis ini). Selain itu juga saya ambil contoh kasus dalam mengakses Google Drive API dari user-user lain termasuk dalam domain Google App kita.
  1. Proses Authorization
    #function untuk ambil content file Private Key 
    def datafile(filename):
      f = open(os.path.join(os.path.dirname(__file__), 'data', filename), 'rb')
      data = f.read()
      f.close()
      return data
    
    
    class OAuth2Service():
    #generate credential
      def _generate_credential(self):
        private_key = datafile(CLIENT_PRIV_KEY)
        self.cred = SignedJwtAssertionCredentials(
            'xxxxxxxxxxxx@developer.gserviceaccount.com', #email address dari API Console
            private_key,
            scope=OAUTH_SCOPE,
            prn='otheruser@yourdomain.com')
    
    #main function
    if __name__ == '__main__':
      app = Server2DriveSync()
      app._generate_credential()
      #do the action (next section)
    
  2. Mulai mengakses Google Drive API
    class OAuth2Service():
    #...
      def test_create_file(self):
        # Create an httplib2.Http object and authorize it with our credentials
        http = httplib2.Http()
        http = self.cred.authorize(http)
    
        drive_service = build('drive', 'v2', http=http)
    
        # Insert a file
        media_body = MediaFileUpload('test_file.txt', mimetype='text/plain', resumable=True)
        body = {
          'title': 'test_file.txt',
          'description': 'A test document',
          'mimeType': 'text/plain'
        }
    
        file = drive_service.files().insert(body=body, media_body=media_body).execute()
        pprint.pprint(file)
    
    
Download full source code: http://goo.gl/6I20I

Beri Permission untuk Project Ini


  1. Untuk menberi akses, silahkan Login ke Control Panel Google Apps, kemudian akses menu Advanced Tools > Manage OAuth domain key
  2. Akses menu  Manage client API access, kemudian masukkan Client ID yang sudah kita buat pada API Console diatas. Pada One or More API scope(s) isi dengan Google Drive Scope: https://www.googleapis.com/auth/drive
  3. Klik Authorize
Untuk informasi selengkapnya bisa refer ke referensi Google.

Dengan model OAuth ini, setidaknya kita bisa membuat Program seperti berikut:

  • Sinkronisasi Google Drive dengan File Server local
  • Tool migrasi file-file dari File Server yang terpusat ke Google Drive
Semoga bermanfaat!

Friday, December 3, 2010

e-Tech Starts Here!

Bismillah saya mulai blog saya ini.
Semoga dapat menjadi sarana berbagi ilmu, khususnya ilmu IT dan Software technology.

Semoga bermanfaat!