Setting Multiple Domain Mail Server Menggunakan POSTFIX + DOVECOT + CYRUS-SASL + MYSQL

Saya percaya, akan ada saat dimana setting mail server di linux semudah instalasi MS Exchange Server di windows. Tapi saat itu bukan hari ini …

Instalasi aplikasi di server linux memang memiliki kesulitan tersendiri. Kalau pun kita sudah “pernah”, pas dicoba 1x lagi pada distro yang berbeda atau walau cuma beda versi, belum tentu hasilnya sama.

Pertama kali saya melakukan instalasi mail server adalah 2 tahun lalu saya melakukan instalasi mail server diatas OS Linux Fedora 9, cara mudahnya adalah dengan cara copas dari berbagai tutorial yang saya termukan di internet. Alhasil, setelah 1 minggu usah, punya juga mail server. Sekarang, saya coba lagi melakukan yang sama pada Fedora 14. Cara praktisnya adalah copas konfigurasi server lama ke server baru. Tapi ternyata … memang tidak semudah yang dikira. Beberapa perbedaan versi pada aplikasi yang dipakai menjadikannya perlu ada adaptasi agar konfigurasi lama yang saya pakai bisa digunakan kembali.

Berikut adalah beberapa catatan yang saya buat pada saat melakukan konfigurasi Mail Server dengan Multiple Domain (Virtual Domain) di Linux.

Jika Anda pernah melakukan instalasi email server menggunakan MS Exchange Server, semuanya mudah. 1 program untuk seluruh keperluan. Berbeda dengan Linux, Mail Server terdiri dari program yang terpisah. Dengan demikian, untuk bisa memahaminya tentunya harus mengetahui fungsi masing-masing program yang digunakan.

Berikut adalah spesifikasi Mail Server yang saya buat:
Dibuat diatas OS Linux Fedora 14.
Mail server terdiri dari POSTFIX, Dovecot, Cyrus-SASL, MySQL.
Virtual domail: example.com & example2.com
Mengirim email menggunakan authentikasi PLAIN (artinya password tidak di enkripsi)
authentikasi POP & IMAP menggunakan LOGIN PLAIN (artinya password tidak di enkripsi)

POSTFIX
POSTFIX adalah program yang berfungsi menerima dan mengirim email.
instalasi modul yang diperlukan untuk POSTFIX adalah:
yum install postfix

berikut adalah initial setting untuk POSTFIX yang saya gunakan (file: /etc/postfix/main.cf)

# uncomment for debugging if needed
soft_bounce=yes
debug_peer_level = 99
debug_peer_list = 127.0.0.1

# postfix main
mail_owner = postfix
setgid_group = postdrop
delay_warning_time = 4

# postfix paths
html_directory = no
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
queue_directory = /var/spool/postfix
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man

# network settings
inet_interfaces = all
mydomain = example.com
myhostname = host.example.com
mydestination = $myhostname localhost.$mydomain
mynetworks = 127.0.0.0/8, 119.235.30.174/32
mynetworks_style = subnet
myorigin = example.com
relay_domains = example2.com #virtual domain

# mail delivery
recipient_delimiter = +

# mappings
alias_maps = mysql:/etc/postfix/mysql-aliases.cf

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf
virtual_gid_maps = static:89
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89 #UID user postfix. lihat di file /etc/group
virtual_transport = virtual
virtual_uid_maps = static:89 #UID user postfix. lihat di file /etc/group

# debugging
debug_peer_level = 5
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination,
reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain,
reject_unverified_sender, reject_unverified_recipient

smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining
message_size_limit = 12582912

Seperti yang saya ungkapkan sebelumnya, ini adalah initial setup. Artinya konfigurasi “asal jalan”. Untuk keamanan, tentunya konfigurasi tersebut harus di tweak lagi.

informasi yang menghubungkan antara POSTFIX dengan mysql diletakan pada file *.cnf. Isi dari file-file tersebut adalah sebagai berikut:
/etc/postfix/mysql-aliases.cf
user = postfix
password = mypassword
dbname = postfix
table = postfix_alias
select_field = destination
where_field = alias
hosts = localhost

/etc/postfix/mysql-virtual_alias_maps.cf
hosts = localhost
user = postfix
password = mypassword
dbname = postfix
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql-virtual_domains_maps.cf
hosts = localhost
user = postfix
password = buburayam
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

/etc/postfix/mysql-virtual_mailbox_maps.cf
hosts = localhost
user = postfix
password = buburayam
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

MySQL
Ada banyak cara bagaimana Anda menyimpan data username & password. Namun untuk kali ini, saya memilih menggunakan MySQL.
instalasi modul yang diperlukan untuk MySQL adalah:
yum install mysql mysql-server

Buat database yang akan digunakan menggunakan SQL berikut:

CREATE TABLE IF NOT EXISTS `admin` (
`username` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`username`)
);

CREATE TABLE IF NOT EXISTS `alias` (
`address` varchar(255) NOT NULL DEFAULT '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`address`)
);

CREATE TABLE IF NOT EXISTS `alias_domain` (
`alias_domain` varchar(255) NOT NULL DEFAULT '',
`target_domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`alias_domain`),
KEY `active` (`active`),
KEY `target_domain` (`target_domain`)
) ;

CREATE TABLE IF NOT EXISTS `config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '',
`value` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `domain` (
`domain` varchar(255) NOT NULL DEFAULT '',
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`aliases` int(10) NOT NULL DEFAULT '0',
`mailboxes` int(10) NOT NULL DEFAULT '0',
`maxquota` bigint(20) NOT NULL DEFAULT '0',
`quota` bigint(20) NOT NULL DEFAULT '0',
`transport` varchar(255) DEFAULT NULL,
`backupmx` tinyint(1) NOT NULL DEFAULT '0',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`domain`)
);

CREATE TABLE IF NOT EXISTS `domain_admins` (
`username` varchar(255) NOT NULL DEFAULT '',
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
KEY `username` (`username`)
);

CREATE TABLE IF NOT EXISTS `fetchmail` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`mailbox` varchar(255) NOT NULL DEFAULT '',
`src_server` varchar(255) NOT NULL DEFAULT '',
`src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL,
`src_user` varchar(255) NOT NULL DEFAULT '',
`src_password` varchar(255) NOT NULL DEFAULT '',
`src_folder` varchar(255) NOT NULL DEFAULT '',
`poll_time` int(11) unsigned NOT NULL DEFAULT '10',
`fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',
`keep` tinyint(1) unsigned NOT NULL DEFAULT '0',
`protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL,
`ssl` tinyint(1) unsigned NOT NULL DEFAULT '0',
`extra_options` text,
`returned_text` text,
`mda` varchar(255) NOT NULL DEFAULT '',
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `log` (
`timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`username` varchar(255) NOT NULL DEFAULT '',
`domain` varchar(255) NOT NULL DEFAULT '',
`action` varchar(255) NOT NULL DEFAULT '',
`data` varchar(255) NOT NULL DEFAULT '',
KEY `timestamp` (`timestamp`)
);

CREATE TABLE IF NOT EXISTS `mailbox` (
`username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`maildir` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`quota` bigint(20) NOT NULL DEFAULT '0',
`domain` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`passwd_expire` char(1) COLLATE utf8_unicode_ci NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`username`)
);

CREATE TABLE IF NOT EXISTS `postfix_alias` (
`destination` varchar(50) DEFAULT NULL,
`alias` varchar(50) DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS `vacation` (
`email` varchar(255) NOT NULL DEFAULT '',
`subject` varchar(255) NOT NULL DEFAULT '',
`body` text NOT NULL,
`cache` text NOT NULL,
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`email`),
KEY `email` (`email`)
);

Dovecot
POSTFIX hanya bertugas menerima dan mengirim. Sedangkan program yang melayani aplikasi email client lewat protokol IMAP & POP (seperti MS Outlook, Mozilla Thunderbird atau SquirellMail) ditangani oleh Dovecot.
instalasi modul yang diperlukan untuk Dovecot adalah:
yum install dovecot dovecot-mysql

konfigurasi untuk dovecot (saya menggunakan versi 2) terletak di dalam file /etc/dovecot/dovecot.conf, dan dari file tersebut load file lain yang ada di /etc/dovecot/conf.d. Namun untuk penyerderhanaan, saya membuatnya menjadi 1 file di /etc/dovecot/dovecot.conf dengan isi sebagai berikut:

# 2.0.9: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.35.6-45.fc14.x86_64 x86_64 Fedora release 14 (Laughlin) ext3
first_valid_uid = 89
log_path = /var/log/dovecot

disable_plaintext_auth = no

#debug option
#mail_debug = yes
#auth_debug_passwords=yes
#auth_debug=yes
#auth_verbose = yes
#auth_verbose_passwords=plain
#verbose_ssl = yes

mail_location = maildir:/home/vmail/%d/%n
protocols = pop3 imap
ssl_cert =

Dovecot pun perlu sambungan untuk membaca informasi user yang tersimpan di MySQL. Konfigurasi untuk koneksi ke MySQL bisa dilihat di /etc/dovecot/dovecot-mysql.conf

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=mypassword
default_pass_scheme = PLAIN

password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'

Cyrus-SASL
Khusus untuk keperluan autentikasi (memeriksa apakah user yang login via Dovecot atau POSTFIX adalah user yang valid) digunakan program Cyrus-SASL.
instalasi modul yang diperlukan untuk Cyrus-SASL adalah:
yum install cyrus-sasl cyrus-sasl-mysql cyrus-sasl-plain pam_mysql

pastikan /etc/sasl2/smtpd.conf seperti berikut:
pwcheck_method: saslauthd
mech_list: plain login

set konfigurasi /etc/pam.d/smtp
auth required pam_mysql.so user=postfix passwd=mypassword host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password
account sufficient pam_mysql.so user=postfix passwd=mypassword host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password

untuk keperluan Virtual Domain, pastikan Cyrus memeriksa realm pada saat memeriksa user. Hal ini ditentukan oleh 2 file konfigurasi:
/etc/init.d/saslauthd pastikan memiliki baris:
PARAMS="${PARAMS} -a ${MECHANISMS} -r"

/etc/sysconfig/saslauthd pastikan menambahkan “-r” pada FLAG
SOCKETDIR=/var/run/saslauthd
MECH=pam
FLAGS=-r

Coba restart MySQL, POSTFIX, Dovecot, dan Cyrus-SASL. … And see what happen! :)

Saya belum bisa menuliskan step by step yang lengkap untuk proses setting ini. Tapi, mungkin Anda coba merujuk ke beberapa link berikut ini.
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (page-2)
Authentifikasi SMTP, POSTFIX & SASL
POSTFIX SMTP Authentication Dovecot SASL
SETTING UP EMAIL: A POSTFIX/DOVECOT HOWTO
SMTP Authentication Email Client
POSTFIX Configuration Paramaters
Postfix SASL Howto

Semoga bisa membantu.
Sorry for the incomplete installation notes. :)
Cuma sebagai pengingat pribadi saja.

Debug Query di MySQL

Berhari-hari memiliki masalah dalam instalasi Postfix untuk Multiple Domain, menggunakan MySQL untuk penyimpanan data. Entah mengapa, proses authentikasi smptd-nya selalu gagal. Karena data user & password tersimpan di MySQL, salah satu caranya adalah dengan trace setiap query yang di eksekusi oleh MySQL.

Debuggid di MySQL diaktifkan lewat file /etc/my.cnf

[mysqld]
log-output=FILE
general-log=1
general-log-file=/var/log/mysqlquery.log #pastikan file writetable

/var/log/mysqlquery.log harus dibuat manual.

# cd /var/log
# echo > mysqlquery.log
# chown mysql:mysql mysqlquery.log
# chmod 644 mysqlquery.log

Setelah itu, restart MySQL Anda.

Kini Anda bisa memeriksa setiap query yang di eksekusi oleh MySQL.
File log ini bisa berukuran sangat besar. Jadi, jangan lupa untuk menonaktifkannya (dengan cara memberi # atau menghapus konfigurasi tadi dibuat di my.cnf) jika Anda sudah tidak memerlukannya lagi.

Daftar Profile Setting Operator

Berikut adalah daftar APN, Username, Password untuk profile setting yang digunakan untuk konektivitas modem/HP menggunakan jaringan GPRS 3G.
Semoga bisa membantu.

OPERATOR APN USERNAME PASSWORD
Telkomsel Prabayar flash (kosong) (kosong)
Telkomsel Unlimited internet (kosong) (kosong)
IM3/Mentari (time based) indosatgprs indosat@durasi indosat@durasi
IM3/Mentari (volume based) indosatgprs indosat indosat
Matrix Broadband indosat3g indosat indosat
IM2 indosatm2 (sesuai yang terdaftar) (sesuai dengan yang terdaftar)
XL http://www.xlgprs.net xlgprs proxl
Axis axis axis 123456
Three (3) 3gprs 3gprs 3gprs

WordPress 404 Server Error – Blank Comment (SOLVED)

Untuk blog di pujangga.net, saya menggunakan program wordpress.

Para pengguna wordpress selalu mendapatkan notifikasi email saat seseorang meninggalkan komentar di blog Anda. Beberapa waktu belakangan, saya selalu menerima notifikasi komentar masuk, tapi ia berupa komentar kosong. Selama ini saya menganggap itu spam, tapi setelah diperhatikan, “kok jarang ada lagi yang komen ya di blog”.

Selidik punya selidik, ternyata memang para pengguna yang menggunakan browser Internet Exporer (IE) selalu menemui pesan 404 Server Error saat mereka hendak meninggalkan komentar.

Beberapa hari coba otak-atik, belakangan diketahui, salah satu penyebabnya adalah Pretty Permalinks di WordPress. Sebab, jika diubah ke Ugly Permalinks, semua berjalan normal. Tapi mengingat banyak link yang menggunakan alamat dengan format Pretty Permalinks, perubahan itu akan membuat banyak sekali broken links. Jadi, coba berusaha mencari solusi untuk masalah ini.

Debugging file PHP wordpress, berhari-hari, hasilnya nihil. Try to think out of the box, dan … akhirnya ketemu. It’s the Akismet Plug-in. Pas Akismet di-deactivate, kini meninggalkan komen lewat IE bisa berjalan lagi.

Jadi, sampai saat ini, Akismet saya berada dalam keadaan non-aktif. Nanti di ulik lagi lah. Klo ngga, makin banyak komen yang terlewatkan dari para pengunjung blog.

Koneksi GPRS Modem di Linux UBUNTU 9.04

Koneksi Modem GPRS di Linux ternyata tidak ribet yang dikita. PLUG ‘N PLAY! Tinggal, colok (USB), yang langsung kebaca beserta account koneksinya.

Berikut ini adalah contoh koneksi Sony Ericsson K810i ke Ubuntu 9.04 (sebagai modem GPRS) di COMPAQ Presario V3000.


Begitu colok, langsung muncul dialog box diatas. Next!


Pilih operator yang digunakan. Pilihan diatas mungkin berbeda untuk setiap perangkat. Perangkat yang saya gunakan adalah HP Sony Ericsson K810i.


Klik Apply.

Untuk koneksi, klik Network Applet yang berada disebelah kanan atas desktop, jika semuanya berjalan dengan baik, pada menu akan muncul juga nama account operator terkait. Klik pada nama account tersebut maka … voila! You are connected! :)

Hah, makin cinta deh ama Jaunty Jackalope. :)

Uang Pecahan Rp. 2000

Hari ini (9 Juli 2009), Bank Indonesia resmi mengeluarkan pecahan uang baru senilai Rp. 2000.

Uang pecahan baru tersebut bergambar Pangeran Antasari (Pahlawan Nasional asal Banjarmasin, Kalimantan Selatan) dengan gambar bagian belakang Tarian Adat Dayak. Uang tersebut akan berlaku sebagai alat pembayaran yang sah mulai tanggal 10 Juli 2009. Pemilihan gambar pada uang tersebut mengacu kepada desain uang kertas sebelumnya yang bertemakan Pahlawan Nasional. Hal ini sebagai bentuk apresiasi kepada para pahlawan dan untuk turut serta melestarikan budaya bangsa.

Uang kertas baru pecahan Rp2.000 berwarna dominan abu-abu dengan unsur pengaman berupa tanda air bergambar Pangeran Antasari dengan benang pengaman yang tertanam di kertas uang dan bertuliskan BI2000 berulang-ulang yang akan memendar merah di bawah sinar ultraviolet. Uang kertas pecahan baru ini juga mengakomodasi kebutuhan para tuna netra dengan menyediakan kode tertentu (blind code) di samping kanan bagian muka uang yaitu berupa kotak persegi panjang yang dicetak secara intaglio.

Pecahan 2000 rupiah

Pecahan 2000 rupiah

sumber asal duratia.net

Masalah baru buat para programmer
Programmer pasti tau program untuk menghitung uang kembalian. Salah satu hal yang kadang bikin ribet adalah pecahan uang Rp. 20.000. Nah sekarang, ada pecahan Rp. 2.000. Program untuk menghitung uang kembalian pasti tambah panjang. :D