Table of Contents

Postfix + MySQL

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

Postfix

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>

MySQL

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. 

Konfigurasi

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.

Domain Name Server

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

Siapkan Tempat Untuk Mail Virtual

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

Tambahkan Konfigurasi Postfix

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

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

/etc/vmailer/virtual_domain.cf

user            = postfix
password        = myvmailpassword
dbname          = postfix
hosts           = localhost
table           = domain_maps
select_field    = pemilik
where_field     = namadomain
additional_conditions = and status = 'oke'

/etc/vmailer/virtual_mailbox.cf

user            = postfix
password        = myvmailpassword
dbname          = postfix
hosts           = localhost
table           = mailbox_maps
select_field    = maildir
where_field     = emailaddr
additional_conditions = and status = 'oke'

/etc/vmailer/virtual_alias.cf

user            = postfix
password        = myvmailpassword
hosts           = localhost
dbname          = postfix
select_field    = remotemail
where_field     = emailaddr
additional_conditions = and status = 'oke'

MySQL Database

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` ) 
       );

Testing

-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

Question?

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