Setup SMTP Haraka di Ubuntu 18.04

Akhir tahun ini, saya mendapatkan tantangan baru untuk mempelajari salah satu lightweight SMTP engine, yaitu Haraka. Belum pernah dengar? Sama, saya juga belum pernah ๐Ÿ˜€ (Baca : About Haraka).

Engine SMTP Haraka, biasanya digunakan sebagai antispam incoming email bukan sebagai SMTP outgoing, tetapi tidak menutup kemungkinan SMTP Haraka digunakan untuk outgoing email.

SMTP Haraka merupakan engine yang berjalan diatas Node JS. Node JS sendiri bisa berjalan diatas sistem operasi Windows, Linux maupun MacOS. Jadi pada dasarnya SMTP Haraka bisa diinstall diatas Windows, Linux ataupun MacOS dengan Node JS yang sudah terinstal.

Sayangnya, instalasi Haraka ini tidak semudah yang saya bayangkan. Error selalu menjumpai saya saat melakukan instalasi ๐Ÿ˜€ . Walaupun gagal terus saya tidak menyerah, hanya saja “hampir” menyerah ๐Ÿ˜€ .

Saya sempat mencari di Google search dengan kata kunci “How to install Haraka in Ubuntu 18.04”, “Cara Install Haraka in Ubuntu 18.04” (Kebetulan saya diminta untuk install Haraka diatas sistem operasi Ubuntu 18.04), tapi sayangnya semua tutorial yang saya ikuti tetap menuntun saya menuju kegagalan ๐Ÿ˜€ .

Setelah saya cari-cari kembali, ternyata Haraka memiliki halaman Github yang berisi orang-orang yang menggunakan Haraka dan mengalami kendala dalam penggunaannya (Github Haraka). Betapa beruntungnya saya, saat menemukan Dockerfile Haraka (Dockerfile = File untuk build Docker image), dengan Dockerfile ini teman-teman bisa langsung deploy container Haraka diatas Docker tanpa harus instalasi dari awal.

Dari Dockerfile yang saya dapatkan di github, saya coba bandingkan Dockerfile tersebut dengan instalasi yang sudah berkali-kali saya lakukan dan selalu gagal. Dan jika dilihat dari hasil perbandingan Dockerfile dengan instalasi yang saya lakukan, ternyata yang membuat saya gagal adalah dependencies yang belum di install. Selain itu, Dockerfile tersebut juga bukan menggunakan sistem operasi Ubuntu 18.04, melainkan sistem operasiย  Linux Phusion, yang mungkin bisa berpotensi masalah ataupun tidak bisa diinstal sama sekali jika saya coba instal Haraka diatas Ubuntu 18.04, tapi apa salahnya mencoba. Setelah saya coba instal Haraka diatas Ubuntu 18.04 dengan mengacu pada Dockerfile tersebut, alhamdulillah bisa ๐Ÿ˜€ .

Berikut langkah-langkah untuk instalasi Haraka diatas sistem operasi Ubuntu 18.04.

Persiapan Instalasi

  • Siapkan Linux Ubuntu versi 18.04
  • Koneksi Internet
  • Outgoing Port 25 (Opsional untuk Uji Coba Kirim Email). Pastikan server ubuntu yang teman-teman gunakan port 25 outgoingnya open, karena akan digunakan untuk uji coba kirim email ke gmail.com. Untuk memastikan outgoing port 25 open, teman-teman bisa menjalankan perintah berikut pada server Ubuntu
    # telnet gmail-smtp-in.l.google.com 25
    Trying 74.125.200.26...
    Connected to gmail-smtp-in.l.google.com.
    Escape character is '^]'.
    220 mx.google.com ESMTP i190si49481196pgc.338 - gsmtp

    Pastikan teman-teman mendapatkan jawaban dari MX record gmail.com, 220 mx.google.com ESMTP i190si49481196pgc.338 – gsmtp. Jika teman-teman stuck di bagian Trying xx.xx.xx.xx… berarti outgoing port 25 server Ubuntu tidak open dan tidak bisa digunakan untuk terima kirim email secara langsung. Hal ini biasa terjadi apabila teman-teman menggunakan provider internet rumahan, karena defaultnya provider internet rumahan memberikan blocking terhadap port 25. Salah satu solusi atas masalah tersebut adalah menggunakan server Ubuntu pada VPS yang umumnya tidak terdapat blocking port 25.

  • Domain asli yang sudah dikenali oleh internet

Instalasi Dependencies & Node JS

  • Instalasi dependencies dengan perintah berikut
    #apt-get update -y
    #apt-get install g++ make git curl sudo screen -y
  • Instalasi Node JS dengan perintah berikut
    #curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
    #apt-get install nodejs -y
  • Cek versi Node JS dengan perintah berikut
    #nodejs -v
    v12.14.0

Instalasi Haraka

  • Salin file instalasi Haraka yang ada di Github Haraka ke server Ubuntu dengan perintah berikut. Disini saya memilih direktori /opt/ sebagai lokasi file-file instalasi Haraka, pemilihan direktori ini tidak native di /opt/ tetapi bisa di direktori manapun.
    #cd /opt/
    #git clone https://github.com/haraka/Haraka.git
  • Cek file instalasi Haraka dengan perintah berikut
    #ls Haraka/
    CONTRIBUTING.md  Plugins.md    attachment_stream.js  config.js      docs          http            mailheader.js     plugins     server.js       tls_socket.js
    Changes.md       README.md     bin                   connection.js  haraka.js     line_socket.js  messagestream.js  plugins.js  smtp_client.js  transaction.js
    Dockerfile       TODO          chunkemitter.js       contrib        haraka.sh     logger.js       outbound          rfc1869.js  spf.js
    LICENSE          appveyor.yml  config                dkim.js        host_pool.js  mailbody.js     package.json      run_tests   tests
  • Mulai proses instalasi Haraka dengan perintah berikut dan pastikan tidak ada error
    #cd /opt/Haraka/
    #npm install -g Haraka --unsafe
    #haraka -i /usr/local/haraka
    create: /usr/local/haraka
    create: /usr/local/haraka/plugins
    create: /usr/local/haraka/docs
    create: /usr/local/haraka/config
    create: /usr/local/haraka/config/smtp.ini
    create: /usr/local/haraka/config/log.ini
    create: /usr/local/haraka/config/plugins
    create: /usr/local/haraka/config/dkim
    create: /usr/local/haraka/config/dkim/dkim_key_gen.sh
  • Salin file penunjang yaitu host_list dan plugins Haraka ke direktori /usr/local/haraka/config dengan perintah berikut
    #cp /opt/Haraka/config/host_list /usr/local/haraka/config/host_list
    #cp /opt/Haraka/config/plugins /usr/local/haraka/config/plugins
  • Edit file plugins pada direktori /usr/local/haraka/config/ dan tambahkan teks ini dibagian paling bawah
    relay
  • Edit file plugins pada direktori /usr/local/haraka/config/ dan berikan tanda pagar (#) dibelakang tulisan queue/smtp_forward
    #queue/smtp_forward
  • Buat file baru dengan nama relay.ini pada direktori /usr/local/haraka/config/ dan isi file tersebut dengan teks berikut

    [relay]
    all=true
  • Buat file baru dengan nama me pada direktori /usr/local/haraka/config/ dengan isi hostname server haraka, dalam hal ini haraka.colamen.id
    haraka.colamen.id
  • Cek Haraka dengan perintah berikut
    #cd /usr/local/haraka/
    #npm install
    npm notice created a lockfile as package-lock.json. You should commit this file.
    npm WARN haraka_local@0.0.1 No repository field.
    
    up to date in 0.691s
    found 0 vulnerabilitie
  • Menyalin file service Haraka ke direktori /etc/service/haraka yang akan digunakan untuk menjalankan service Haraka dengan perintah berikut
    #mkdir /etc/service
    #mkdir /etc/service/haraka
    #cp /opt/Haraka/haraka.sh /etc/service/haraka/run
  • Salin script untuk menjalankan Haraka

    #cp /opt/Haraka/contrib/haraka.service /etc/systemd/system/
    #sed "s~ExecStart=/usr/bin/haraka -c /path/to/your/config~ExecStart=/usr/bin/haraka -c /usr/local/haraka~g" -i  /etc/systemd/system/haraka.service
  • Start service haraka dengan perintah berikut
    #systemctl start haraka
    #systemctl status haraka
    haraka.service - Haraka MTA
    Loaded: loaded (/etc/systemd/system/haraka.service; disabled; vendor preset: enabled)
    Active: active (running) since Fri 2020-01-17 15:28:59 WIB; 5s ago
    Main PID: 2393 (node)
    Tasks: 18 (limit: 2318)
    CGroup: /system.slice/haraka.service
    โ”œโ”€2393 node /usr/bin/haraka -c /usr/local/haraka/
    โ””โ”€2404 /usr/bin/node /usr/lib/node_modules/Haraka/haraka.js -c /usr/local/haraka/
    

Uji Coba Kirim Email

  • Testing koneksi via localhost untuk memastikan SMTP Haraka bekerja sebagaimana mestinya dengan perintah berikut
    #telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 haraka ESMTP Haraka/2.8.25 ready
    ^]quit
    
    telnet> quit
    Connection closed.
  • Testing kirim email ke gmail.com menggunakan swaks dengan perintah berikut
    #apt-get install swaks -y
    #swaks -s localhost -t muhammadraihan519@gmail.com -f raihan@colamen.id
    === Trying localhost:25...
    === Connected to localhost.
    <-  220 6dda887e7bea ESMTP Haraka/2.8.25 ready
     -> EHLO haraka.colamen.id
    <-  250-6dda887e7bea Hello [172.17.0.1]Haraka is at your service.
    <-  250-PIPELINING
    <-  250-8BITMIME
    <-  250-SMTPUTF8
    <-  250 SIZE 26214400
     -> MAIL FROM:<raihan@colamen.id>
    <-  250 sender <raihan@colamen.id> OK
     -> RCPT TO:<muhammadraihan519@gmail.com>
    <-  250 recipient <muhammadraihan519@gmail.com> OK
     -> DATA
    <-  354 go ahead, make my day
     -> Date: Fri, 03 Jan 2020 15:28:08 +0700
     -> To: muhammadraihan519@gmail.com
     -> From: raihan@colamen.id
     -> Subject: test Fri, 03 Jan 2020 15:28:08 +0700
     -> Message-Id: <20200103152808.006659@vpn.colamen.id>
     -> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
     -> 
     -> This is a test mailing
     -> 
     -> .
    <-  250 2.0.0 Ok: queued as B901D187DA06 (A4118BA3-EF18-4F68-888B-7327962EB760.1)
     -> QUIT
    <-  221 6dda887e7bea closing connection. Have a jolly good day.
    === Connection closed with remote host.
  • Cek inbox gmail.com

12 comments

  1. Hi Colamen,
    This tutorial is great. I have followed and get this result:

    [INFO] [2833FB01-3C88-4CFA-9132-2754FCF3F5D4.1.1] [outbound] Looking up A records for: gmail-smtp-in.l.google.com
    [INFO] [2833FB01-3C88-4CFA-9132-2754FCF3F5D4.1.1] [outbound] Attempting to deliver to: 74.125.203.26:25 (0) (0)
    [INFO] [-] [core] [outbound] [outbound::25:74.125.203.26:undefined:50] dispense() clients=1 available=0
    [INFO] [-] [core] [outbound] acquired socket A16CC3DD-D1BC-4731-A87F-B68B53C30BB1 for outbound::25:74.125.203.26:undefined:50
    [INFO] [2833FB01-3C88-4CFA-9132-2754FCF3F5D4.1.1] [outbound] secured verified=true cipher=TLS_AES_256_GCM_SHA384 version=TLSv1.3 cn=mx.google.com organization=”Google LLC” issuer=”Google Trust Services” expires=”May 26 09:44:15 2020 GMT” fingerprint=57:57:7E:80:A4:73:2C:66:FF:13:20:BC:4F:EC:19:57:9C:E7:80:09
    [INFO] [2833FB01-3C88-4CFA-9132-2754FCF3F5D4.1.1] [outbound] bouncing mail: 550 5.7.1 [113.176.61.135] The IP you’re using to send mail is not authorized to send email directly to our servers. Please use the SMTP relay at your service provider instead. Learn more at https://support.google.com/mail/?p=NotAuthorizedError p6si16032953plk.111 – gsmtp
    [INFO] [-] [core] [outbound] Sending email via params
    [INFO] [-] [core] [outbound] Created transaction: 479454A2-97EE-4E67-A4C9-494F9F9E719F
    [INFO] [-] [core] [outbound] Processing delivery for domain: voolatech.com
    [INFO] [479454A2-97EE-4E67-A4C9-494F9F9E719F.1] [outbound] Looking up A records for: aspmx.l.google.com
    [INFO] [479454A2-97EE-4E67-A4C9-494F9F9E719F.1] [outbound] Attempting to deliver to: 108.177.125.26:25 (0) (0)
    [INFO] [-] [core] [outbound] [outbound::25:108.177.125.26:undefined:50] dispense() clients=1 available=0
    [INFO] [-] [core] [outbound] acquired socket F1A4DA18-1E8B-4239-BD6D-853A3EA88768 for outbound::25:108.177.125.26:undefined:50
    [INFO] [479454A2-97EE-4E67-A4C9-494F9F9E719F.1] [outbound] secured verified=true cipher=TLS_AES_256_GCM_SHA384 version=TLSv1.3 cn=mx.google.com organization=”Google LLC” issuer=”Google Trust Services” expires=”May 26 09:44:15 2020 GMT” fingerprint=57:57:7E:80:A4:73:2C:66:FF:13:20:BC:4F:EC:19:57:9C:E7:80:09
    [INFO] [479454A2-97EE-4E67-A4C9-494F9F9E719F.1] [outbound] bouncing mail: 550 5.7.1 [113.176.61.135] The IP you’re using to send mail is not authorized to send email directly to our servers. Please use the SMTP relay at your service provider instead. Learn more at https://support.google.com/mail/?p=NotAuthorizedError y12si2855183pjp.81 – gsmtp

    Any comment from you please?

    Thank you so much.
    Clark

    1. Hi Clark,

      This are the error message you need to pay attention at :

      [INFO] [2833FB01-3C88-4CFA-9132-2754FCF3F5D4.1.1] [outbound] bouncing mail: 550 5.7.1 [113.176.61.135] The IP youโ€™re using to send mail is not authorized to send email directly to our servers. Please use the SMTP relay at your service provider instead

      You need to add IP public that use by your Haraka server to your domain SPF record, so that gmail can trust the email you send from your Haraka server

      Best Regards,
      Raihan

        1. Hi Clark,

          Sure, it’s happy to help fellow IT Administrator.

          Just let me know when you have anymore question.

          Best Regards,
          Raihan

  2. Hi Colamen,
    How can you send email to gmail? You have registered your ip server address to authorize with google?

    Thank
    Clark

    1. Hi Clark,

      It’s easy though. You just need two things, so your email can be recieve by gmail and not recognize as spam. Here are the thing :

      1. Make sure domain you using for sending email is valid domain and recognize in internet. In this case i use my own domain “colamen.id” and that domain is valid domain
      2. Add the IP public that you are using to sending your email to the SPF record your domain. So, in this case i already add my IP public Haraka server to “colamen.id” SPF Record

      Best Regards,
      Raihan

  3. Hello,
    Thanks for your tutorial, its really helpful and i ran the server , however i’m testing haraka as outbound server , and seems fine but , there is no authentication and even i tried some settings i cannot achieve it and should be for sending server … if you can help out with this and custom headers.
    Best regards

  4. Mas mau tanya, ini saya kok ga bisa kirim email kenapa ya?
    Kira2 untuk output sweaks nya kaya gini

    asaromi@openSUSElp153:~> swaks -s localhost -t asami.mayuri1@gmail.com -f maromi@gorrywell.com
    === Trying localhost:25…
    === Connected to localhost.
    EHLO openSUSElp153
    <- 250-localhost Hello Unknown [127.0.0.1]Haraka is at your service.
    <- 250-PIPELINING
    <- 250-8BITMIME
    <- 250-SMTPUTF8
    MAIL FROM:
    <- 250 sender OK
    -> RCPT TO:
    <- 250 recipient OK
    -> DATA
    Date: Tue, 24 May 2022 17:11:46 +0700
    -> To: asami.mayuri1@gmail.com
    -> From: maromi@gorrywell.com
    -> Subject: test Tue, 24 May 2022 17:11:46 +0700
    -> Message-Id:
    -> X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/
    ->
    -> This is a test mailing
    ->
    ->
    -> .
    QUIT
    <- 221 localhost closing connection. Have a jolly good day.
    === Connection closed with remote host.

    1. Hi Pak Romi,

      Apakah sudah dipastikan bahwa port 25 outgoing server yang digunakan open?

      Bisa coba testing menggunakan telnet ke server gmail mas.

      Raihan

  5. Hi Raihan,
    Saya masih newbie untuk mail server, ketika mengirim testmail saya mendapatkan message

    250 Message Queued (0EAE7806-5DDE-4628-BE6D-9FDB3ADDA37F.1)

    tetapi tidak terkirim ke email tujuan, apa yang terjadi ?

    1. Hi Mas Ilham,

      Apakah sudah dipastikan bahwa port 25 outgoing yang digunakan open?

      Bisa coba testing menggunakan telnet ke server gmail mas.

      Raihan

Leave a Reply

Your email address will not be published.