Berbicara langsung dengan server SMTP

Hi MWN’ers

Simple Mail Transfer Protocol atau SMTP digunakan untuk berkomunikasi dengan server guna mengirimkan email dari lokal email ke server, sebelum akhirnya dikirimkan ke server email penerima. Proses ini dikontrol dengan Mail Transfer Agent (MTA) yang ada dalam server email Anda.
Port SMTP Default

Port 25 – Port tanpa dienkripsi
Port 426 – Port SSL/TLS, nama lainnya SMTPS

Protokol SMTP digunakan untuk mengirim email.

Untuk berbicara langsung dengan server SMTP, kita dapat menggunakan program telnet dan konek ke port SMTP (defaultnya 25, tapi dapat berbeda). Ada juga port 587 (submission) yang juga digunakan untuk mengirim email.

$ telnet HOSTNAME_ATAU_IP 25
 contoh seperti di bawah ini 

Catatan: jika ingin mengirim email untuk domain katakanlah google.com, terlebih dahulu kita harus mencari tahu MX record untuk google.com tersebut, misalnya:

host -t mx google.com
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.

Maka kita dapat mencoba menghubungi salah satu MX mis:
$ telnet d.mx.mail.google.com 25

Kita tidak menghubungi langsung google.com di port 25 karena belum tentu MX untuk domain yahoo.com itu ada di mesin yang sama dengan google.com.

Sekilas protokol SMTP

Setelah konek, server akan memberikan baris banner (welcome message).

Klien mengirimkan baris perintah. Server mengirimkan baris respon berupa kode hasil 3 digit diikuti keterangan. Kode 2xx artinya berhasil, kode 4xx artinya terjadi kesalahan temporer dan klien dipersilakan mencoba lagi beberapa saat mendatang, kode 5xx artinya terjadi kesalahan permanen.

Contoh

Yang dicetak tebal adalah yang kita ketikkan.

Contoh, kita ingin mengirim email ke steven@masterwebnet.com. Pertama kita mencari tahu MX untuk domain ini:

$ host -t mx masterwebnet.com
masterwebnet.com mail is handled by 10 mail.masterwebnet.com.
$ telnet mail.masterwebnet.com 25
Trying 203.130.198.32...
Connected to mail.masterwebnet.com.
Escape character is '^]'.
220 server23.masterwebnet.com ESMTP ready (MWN SMTPD 0.4.4-spanel1.2/ 2006-11-01)

Lalu kita sebutkan siapa pengirimnya:

MAIL FROM:<pengirim@domain.com>
250 OK(250)

Jika tidak ingin menyebutkan pengirimnya (Return-Path kosong), kita bisa menuliskan:

MAIL FROM:<>

Lalu kita sebutkan penerimanya:

RCPT TO:<steven@masterwebnet.com>
250 OK(250)

Baris RCPT ini dapat diulang untuk penerima-penerima yang lainnya jika ada, mis kita ingin mengirim email ini ke 3 orang lainnya di domain yang sama:

RCPT TO:<user2@masterwebnet.com>
RCPT TO:<user2@masterwebnet.com>
...

Catatan: jika domainnay berbeda, misalnya budi@yahoo.com, maka tentu kita harus menghubungi MX yahoo.com dan bukan di masterwebnet.com 🙂

Lalu kirimkanlah bodi emailnya. Akhiri dengan sebuah baris berisi titik:

DATA
354 GO_AHEAD(354)
Subject: test

Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - e5326248c623f66e8105345a3e3135dd

Untuk keluar:

QUIT
221 BYE(221)
Connection closed by foreign host.

Contoh lengkap sebuah sesi SMTP, mengirim email dan sukses:

$ telnet mail.masterwebnet.com 25
Trying 203.130.198.32...
Connected to mail.masterwebnet.com.
Escape character is '^]'.
220 server23.masterwebnet.com ESMTP ready (MWN SMTPD 0.4.4-spanel1.2/2006-11-01)
MAIL FROM:<pengirim@domain.com>
250 OK(250)
RCPT TO:<steven@masterwebnet.com>
250 OK(250)
DATA
354 GO_AHEAD(354)
Subject: test

Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - fd641de480641ec3c3fb0eae5d2deedd
QUIT
221 BYE(221)
Connection closed by foreign host.

Contoh mengirim email yang ditolak karena user tidak dikenali:

RCPT TO:<xxx@masterwebnet.com>
550 ERR_UNKNOWN_USER(550) - I couldn't find that mail user here

SMTP authentication dengan metode AUTH LOGIN dan AUTH PLAIN

Kadang untuk mengirim secara relay (mengirim ke domain lain), sebuah server membutuhkan authentication. Protokol otentikasi adalah sbb:

AUTH LOGIN
server akan merespon minta username
ketikkan-username-yang-diencode-menggunakan-base64
server akan merespon minta password
ketikkan-password-yang-diencode-menggunakan-base64
server akan memberitahu auth kita benar atau salah

Untuk mengencode base64, dapat digunakan skrip berikut:

$ perl -MMIME::Base64 -e'print encode_base64(q[1234])'
MTIzNA==

Artinya ‘1234’ jika diencode akan menjadi ‘MTIzNA==’.

Atau menggunakan perintah uuencode

$ echo -n "1234" | uuencode -m -
begin-base64 644 -
MTIzNA==
====

Perhatikan baris keluaran dari perintah tersebut yang berada di antara “begin-base64 644 -” dan “====”.

Contoh SMTP authentication: (misalnya usernamenya adalah ‘steven@masterwebnet.com’ dan passwordnya adalah ‘1234’, yang jika diencode akan menjadi ‘c3RldmVuQG1hc3RlcndlYm5ldC5jb20=’ dan ‘MTIzNA==’.

$ telnet mail.masterwebnet.com 25
Trying 203.130.198.32...
Connected to mail.masterwebnet.com.
Escape character is '^]'.
220 server23.masterwebnet.com ESMTP ready (MWN SMTPD 0.4.4-spanel1.2/2006-11-01)
AUTH LOGIN
334 VXNlcm5hbWU6
c3RldmVuQG1hc3RlcndlYm5ldC5jb20=
334 UGFzc3dvcmQ6
MTIzNA==

Metode AUTH PLAIN

AUTH PLAIN
server akan merespon minta username dan password dalam satu baris
input-username dan password-yang-diencode-menggunakan-base64
server akan memberitahu auth kita benar atau salah

Untuk mengencode base64, dapat digunakan skrip berikut:

$ perl -MMIME::Base64 -e 'print encode_base64("\000xx\@carauntuk.com\000xxx")'
xx  adalah username
xxx adalah password

Contoh SMTP authentication: (misalnya usernamenya adalah ‘arie@carauntuk.com’ dan passwordnya adalah ‘1234’, yang jika diencode akan menjadi ‘AGFyaWVAY2FyYXVudHVrLmNvbQAxMjM0=’.

$ telnet carauntuk.com 25
Trying 103.11.74.130...
Connected to carauntuk.com.
Escape character is '^]'.
220 server45301.masterweb.com ESMTP ready (Spanel SMTPD 1.3.16.006)
ehlo carauntuk.com
AUTH PLAIN AGFyaWVAY2FyYXVudHVrLmNvbQAxMjM0=
235 Authentication successful

Resita has written 702 articles