Postfix merupakan mail server(mta) yang juga dikenal sebagai secure mailer dan juga dikenal sebagai alternative dari sendmail. Postfix diciptakan oleh [Wietse Venema] yang sering mungkin tidak asing lagi bagi kita yang sering memakai unix/linux.
[krisna@gohan]->[01:10]$man 8 tcpd <-- nah ini juga om Wietse Venema yang bikin
Postfix juga menawarkan banyak kemudahan, cepat, dan aman. Banyak juga software-software tambahan yang menjadikan postfix semakin powerfull. Salah satunya yang digunakan database server dalam hal ini MySQL?. Dalam hal ini MySQL? berfungsi sebagai table lookup maping table. Apa yang bisa dilakukan jika postfix digabungkan dengan MySQL?? Banyak sekali hal yang bisa dilakukan. Dengan maping table maka banyak sekali hal yang bisa dilakukan, contoh untuk membuat sebuah portal yang terintegrasi yahoo like.
Disesi ini kami coba membuat tulisan mengenai langkah-langkah dalam pembuatan sebuah mail server(postfix) yang terintegrasi dengan MySQL?. Langkah ini dipraktekan dalam lingkungan OpenBSD
Diasumsikan MySQL? client telah ada.
[krisna@gohan]->[~]$cd /usr/ports/mail/postfix/stable [krisna@gohan]->[/usr/ports/mail/postfix/stable]$sudo env FLAVOR="mysql" make [krisna@gohan]->[/usr/ports/mail/postfix/stable]$cd /etc/postfix/ [krisna@gohan]->[/etc/postfix]$sudo postfix-enable old /etc/mailer.conf saved as /etc/mailer.conf.pre-postfix postfix /etc/mailer.conf enabled NOTE: do not forget to add sendmail_flags="-bd -q30m" to /etc/rc.conf.local to startup postfix correctly. NOTE: do not forget to remove the "sendmail clientmqueue runner" from root's crontab. [krisna@gohan]->[/etc/postfix]$sudo vi /etc/rc.conf.local # Tambahkan -> sendmail_flags="-bd -q30m" [krisna@gohan]->[/etc/postfix]$sudo crontab -e # comment out didepan -> #*/30 * * * * /usr/sbin/sendmail -L sm-msp-queue -Ac -q
Pada proses install tersebut, postfix telah diintegrasikan dengan mysql. Proses ini berlaku dioperating sistem OpenBSD saja. Jika memakai operating sistem lain, alangkah baiknya membaca MANUAL MYSQL_README installasi dari source postfix.
Contoh installasi yang dilakukan pada linux redhat 7.2 dengan PCRE supports. Source yang dibutuhkan adalah:
Installasi MySQL tidak akan dibahas 'rpm -ivh packages.rpm'
Proses installasi MySQL & PCRE dilakukan terlebih dahulu karena postfix membutuhkan library masing-masing pacakages tersebut.
Extract sources pcre & postfix.
[krisna@bell source] gzcat pcre-2.xx.tar.gz | tar xvf -
[krisna@bell source] gzcat postfix-2.x.xx.tar.gz | tar xvf -
Compile PCRE
[krisna@bell source] cd pcre-2.xx && make install => Jika diperlukan optimasi pada compiler silahkan dicheck
ulang sebelum make install
Hasil dari proses installasi akan didapatkan file pokok yang diperlukan.
/usr/local/lib/ /usr/local/bin/ /usr/local/include/
+ libpcre.a + pgrep + pcre.h
+ libpcreposix.a
Compile Postfix
[krisna@bell source] cd postfix-2.x.xx
[krisna@bell postfix-2.x.xx] env "CCARGS=-DHAS_PCRE -I/usr/local/include -DHAS_MYSQL -I/usr/include/mysql" \
> "AUXLIBS=-L/usr/local/lib -lpcre -L/usr/mysql/lib -lmysqlclient -lz -lm" make -f Makefile.init makefiles
[krisna@bell postfix-2.x.xx] make
<proses compile>
Jika ditemukan error mengenai MySQL, kemungkinan 3 komponen MySQL tersebut belum terinstall, silahkan
tinjau kembali 3 komponen pokok MySQL tersebut. Jika sudah terinstall tetapi masih saja error
Check path pada CCARGS & AUXLIBS pada proses install.
</proses compile>
[krisna@bell postfix-2.x.xx] su -c "make install"
<proses install>
Please specify the prefix for installed file names. Specify this ONLY
if you are building ready-to-install packages for distribution to other
machines.
install_root: [/]
Sesuaikan dengan yang diinginkan.
</proses install>
Bagian ini hanya perkenalan sederhana mengenai MySQL? dan apa saja yang dibutuhkan postfix yang akan diintegrasikan dengan MySQL?. MySQL? merupakan sebuah database server yang disangat populer dikalangan komunitas opensource. Saat ini banyak sekali aplikasi web yang menggabungkan database MySQL dan dengan scripting language PHP. Dengan PHP maka banyak sekali kemudahan yang ditawarkan, dengan kemudahan tersebut kita bisa menghasilkan sebuah portal yang terintegrasi antara satu bagian dengan bagian lain.
Oke tidak perlu ngomong panjang lebar mengenai MySQL yang nanti dibahas dilain waktu. Nah sekarang apa yang diperlukan untuk mempersiapkan MySQL sebagai maping pada mail server postfix?
- Yang diperlukan saat ini adalah sebuah database mysql yang digunakan untuk menghandle maps virtual. Adapun spesifikasi database yang diperlukan dideskripsikan pada gambar dibawah ini: Disini saya memakai database dengan spesifikasi sebagai berikut:
database name : postfix
database uname : postfix
uname password : myvmailpassword
database host : localhost
table name : domain_maps <menghandle maps domain>
alias_maps <menghandle maps aliases>
mailbox_maps <menghandle maps mbox>
description masing-masing table
table : domain_maps -- maps untuk domain map
+------------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------+------+-----+---------+-------+
| namadomain | varchar(255) | | PRI | | |
| pemilik | varchar(255) | | | | |
| status | enum('oke','noke') | | | oke | |
+------------+--------------------+------+-----+---------+-------+
table : mailbox_maps -- maps untuk usermail & where path
+-----------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------------+------+-----+---------+-------+
| emailaddr | varchar(255) | | PRI | | |
| maildir | varchar(255) | | | | |
| status | enum('oke','noke') | | | oke | |
+-----------+--------------------+------+-----+---------+-------+
table : alias_maps -- maps untuk usermail & where to point
+------------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------------+------+-----+---------+-------+
| emailaddr | varchar(255) | | PRI | | |
| remotemail | varchar(255) | | | | |
| status | enum('oke','noke') | | | oke | |
+------------+--------------------+------+-----+---------+-------+
Dimana pada fields emailaddr pada table mailbox_maps dan emailaddr pada table alias_maps
tidak boleh ada yang sama.
Pada kasus ini akan digambarkan sebuah server gohan.palapa.org yang pada awalnya telah memiliki localmail sendiri, akan difungsikan sebagai mail hosting untuk domain-domain palapa.org, lippotele.com, bangsat.lippotele.com, dan tulip.surabaya-it.com. Apa yang perlu dilakukan agar gohan.palapa.org dapat menerima email yang dikirimkan ke virtual user pada masing-masing host.
Update pada dns server sehingga masing-masing mx dipointkan ke- gohan.palapa.org
gohan.palapa.org:: [krisna@bell]->[19:39]$host -t mx gohan.palapa.org gohan.palapa.org mail is handled (pri=0) by gohan.palapa.org palapa.org:: [krisna@bell]->[19:39]$host -t mx palapa.org palapa.org mail is handled (pri=5) by zeus.palapa.org palapa.org mail is handled (pri=0) by gohan.palapa.org lippotele.com:: gohan.lippotele.com memiliki A/Address yang sama dg gohan.palapa.org [krisna@bell]->[19:40]$host -t mx lippotele.com lippotele.com mail is handled (pri=0) by gohan.lippotele.com bangsat.palapa.org:: [krisna@bell]->[19:41]$host -t mx bangsat.lippotele.com bangsat.lippotele.com mail is handled (pri=0) by gohan.lippotele.com tulip.surabaya-it.com:: [krisna@bell]->[19:42]$host -t mx tulip.surabaya-it.com tulip.surabaya-it.com mail is handled (pri=0) by tulip.surabaya-it.com
Tempat disini yang dimaksud adalah partisi atau direktori tersendiri sehingga akan lebih memudahkan dalam pengaturan. Juga persiapkan sebuah user/group yang dikhususkan sebagai owner dari mail-mail yang masuk.
Sebagai contoh saya gunakan tempat/dirpath '/home/virtual' dan user/group 'virtual:virtual' uid/gid '3333:3333'.
[krisna@gohan]->[~]$groupadd -g 3333 virtual [krisna@gohan]->[~]$useradd -g 3333 -u 3333 virtual :: Siapkan tempat:: [krisna@gohan]->[~]$mkdir -p /home/virtual/ [krisna@gohan]->[~]$ chown -R 3333:3333 /home/virtual
Lihat –postfix-src/README_FILES/VIRTUAL_README {main.cf & master.cf }
main.cf -- virtual_transport = virtual virtual_mailbox_base = /home/virtual virtual_mailbox_maps = mysql:/etc/vmailer/virtual_mailbox.cf virtual_mailbox_domains = mysql:/etc/vmailer/virtual_domain.cf virtual_alias_maps = mysql:/etc/vmailer/virtual_alias.cf virtual_minimum_uid = 100 virtual_uid_maps = static:3333 virtual_gid_maps = static:3333 local_transport = local mydestination = $myhostname $localhost.$mydomain local_recipient_maps = unix:passwd.byname $alias_maps master.cf virtual unix - n n - - virtual
Option tambahan merupakan kelengkapan dari sebuah postfix virtual mail sistem. Option ini mutlak diperlukan supaya virtual mail sistem dapat berjalan bersama dengan maps mysql. Adapun file yang diperlukan adalah
File-file tersebut akan mengatur hubungan antara postfix dengan maps - mysql.
Untuk melengkapi konfigurasi file tersebut dalam postfix documentasi telah diberikan contoh:
postfix-src/README_FILES/MYSQL_README -- # mysql config file for alias lookups on postfix # comments are ok. # the user name and password to log into the mysql server user = someone password = some_passwordd # the database name on the servers dbname = customer_database # the table name table = mxaliases # select_field = forw_addr where_field = alias # you may specify additional_conditions here additional_conditions = and status = 'paid' # the above variables will result in a query of # the form: # select forw_addr from mxaliases where alias = '$lookup' and status = 'paid' # ($lookup is escaped so if it contains single quotes or other odd # characters, it will not cause a parse error in the sql). # # the hosts that postfix will try to connect to # and query from (in the order listed) hosts = host1.some.domain host2.some.domain
user = postfix password = myvmailpassword dbname = postfix hosts = localhost table = domain_maps select_field = pemilik where_field = namadomain additional_conditions = and status = 'oke'
user = postfix password = myvmailpassword dbname = postfix hosts = localhost table = mailbox_maps select_field = maildir where_field = emailaddr additional_conditions = and status = 'oke'
user = postfix password = myvmailpassword hosts = localhost dbname = postfix select_field = remotemail where_field = emailaddr additional_conditions = and status = 'oke'
Untuk memenuhi design database diatas maka akan diimplementasikan sebagai berikut
## ADDUSER postfix & Create DatabaseB postfix
mysql> GRANT USAGE ON *.* TO "postfix"@"localhost" IDENTIFIED BY "myvmailpassword";
mysql> CREATE DATABASE `postfix`;
## Grant DB postfix to user postfix
mysql> GRANT ALL PRIVILEGES ON `postfix` .* TO "postfix"@"localhost" WITH GRANT OPTION;
## Create Table yg diperlukan
mysql> CREATE TABLE `domain_maps` (
`namadomain` VARCHAR( 255 ) NOT NULL ,
`pemilik` VARCHAR( 255 ) NOT NULL ,
`status` ENUM( 'oke', 'noke' ) NOT NULL ,
PRIMARY KEY ( `namadomain` )
);
mysql> CREATE TABLE `mailbox_maps` (
`emailaddr` VARCHAR( 255 ) NOT NULL ,
`maildir` VARCHAR( 255 ) NOT NULL ,
`status` ENUM( 'oke', 'noke' ) NOT NULL ,
PRIMARY KEY ( `emailaddr` )
);
mysql> CREATE TABLE `alias_maps` (
`emailaddr` VARCHAR( 255 ) NOT NULL ,
`remotemail` VARCHAR( 255 ) NOT NULL ,
`status` ENUM( 'oke', 'noke' ) NOT NULL ,
PRIMARY KEY ( `emailaddr` )
);
-tambahkan domain lippotele.com
mysql>INSERT INTO `domain_maps` ( `namadomain` , `pemilik` , `status` )
VALUES ( 'lippotele.com', 'BayuKrisna', 'oke');
-testing transport to maildir
INSERT INTO `mailbox_maps` ( `emailaddr` , `maildir` , `status` )
VALUES ( '[email protected]', 'lippotele.com/divtri79/', 'oke');
-testing transport to mailbox
INSERT INTO `mailbox_maps` ( `emailaddr` , `maildir` , `status` )
VALUES ('[email protected]', 'lippotele.com/zerg', 'oke');
-testing aliases
INSERT INTO `alias_maps` ( `emailaddr` , `remotemail` , `status` )
VALUES ( '[email protected]', '[email protected]', 'oke');
Sep 1 21:41:08 gohan postfix/postfix-script: refreshing the Postfix mail system
postfix/master[22103]: reload configuration
postfix/smtpd[30583]: connect from web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[874]: connect from web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[4318]: connect from web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[30583]: 2EE929609: client=web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[874]: 390E8960D: client=web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[4318]: 3D712960E: client=web41902.mail.yahoo.com[66.218.93.153]
postfix/cleanup[25991]: 3D712960E: message-id=
<[email protected]>
postfix/qmgr[11193]: 3D712960E: from=<[email protected]>, size=904, nrcpt=1 (queue active)
postfix/cleanup[11344]: 2EE929609: message-id=
<[email protected]>
postfix/qmgr[11193]: 2EE929609: from=<[email protected]>, size=909, nrcpt=1 (queue active)
postfix/cleanup[7396]: 390E8960D: message-id=
<[email protected]>
postfix/smtpd[4318]: disconnect from web41902.mail.yahoo.com[66.218.93.153]
postfix/qmgr[11193]: 390E8960D: from=<[email protected]>, size=905, nrcpt=1 (queue active)
postfix/smtpd[30583]: disconnect from web41902.mail.yahoo.com[66.218.93.153]
postfix/smtpd[874]: disconnect from web41902.mail.yahoo.com[66.218.93.153]
postfix/virtual[7505]: 2EE929609: to=<[email protected]>, relay=virtual,
delay=8,status=sent (maildir)
postfix/virtual[32065]: 390E8960D: to=<[email protected]>, relay=virtual,
delay=8,status=sent (mailbox)
postfix/smtp[24159]: 3D712960E: to=<[email protected]>, orig_to=<[email protected]>,
relay=mx.echosoft.ca [xx.xx.xx.xx], delay=18, status=sent (250 Ok: queued as 40BFC63)
-[root@gohan]->[/home/virtual]$ls -al
total 3
drwxr-xr-x 3 virtual virtual 512 Sep 1 22:17 .
drwxr-xr-x 9 root wheel 512 Aug 31 11:29 ..
drwx------ 3 virtual virtual 512 Sep 1 21:49 lippotele.com
[root@gohan]->[/home/virtual]$ls -al lippotele.com/
total 5
drwx------ 3 virtual virtual 512 Sep 1 21:49 .
drwxr-xr-x 3 virtual virtual 512 Sep 1 22:17 ..
drwx------ 5 virtual virtual 512 Sep 1 21:49 divtri79
-rw------- 1 virtual virtual 1038 Sep 1 21:49 zerg
Itu dalam tiap tabel ada status buat apa sih?
Coba aja dikasih noke lalu kirimin email kealamat itu.Yang jelas sih kalo ditable domain_maps status domain yang bersangkutan diberi noke maka email pasti akan dikembalikan pada sipengirim. Mungkin ini sangat penting jika server difungsikan sebagai hosting mail server yang memberikan kemudahan seorang pemilik domain memanage user-user yang ada.''
Oke sekian dulu. Jika ada kekurangan or saran or tambahan silahkan hubungi saya: BayuKrisna krisna@id.or.corebsd