
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:
- MySQL? (MySQL?-client, MySQL?-devel, MySQL?-shared) http://www.mysql.com/downloads/
- Postfix (Silahkan pilih Official release,Experimental release, atau terserah)
- PCRE (Disesuaikan dengan source postfix source)
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
- /etc/vmailer/virtual_mailbox.cf -- handle virtual_mailbox_maps
- /etc/vmailer/virtual_domain.cf -- handle virtual_mailbox_domains
- /etc/vmailer/virtual_alias.cf -- handle virtual_alias_maps
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
Ad :
/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'
Ad :
/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'
Ad :
/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 ( 'divtri79@lippotele.com', 'lippotele.com/divtri79/', 'oke');
-testing transport to mailbox
INSERT INTO `mailbox_maps` ( `emailaddr` , `maildir` , `status` )
VALUES ('zerg@lippotele.com', 'lippotele.com/zerg', 'oke');
-testing aliases
INSERT INTO `alias_maps` ( `emailaddr` , `remotemail` , `status` )
VALUES ( 'jim@lippotele.com', 'jim@corebsd.or.id', '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=
<20030901144249.10370.qmail@web41902.mail.yahoo.com>
postfix/qmgr[11193]: 3D712960E: from=<xxxxx@yahoo.com>, size=904, nrcpt=1 (queue active)
postfix/cleanup[11344]: 2EE929609: message-id=
<20030901144249.10370.qmail@web41902.mail.yahoo.com>
postfix/qmgr[11193]: 2EE929609: from=<xxxxx@yahoo.com>, size=909, nrcpt=1 (queue active)
postfix/cleanup[7396]: 390E8960D: message-id=
<20030901144249.10370.qmail@web41902.mail.yahoo.com>
postfix/smtpd[4318]: disconnect from web41902.mail.yahoo.com[66.218.93.153]
postfix/qmgr[11193]: 390E8960D: from=<xxxxx@yahoo.com>, 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=<divtri79@lippotele.com>, relay=virtual,
delay=8,status=sent (maildir)
postfix/virtual[32065]: 390E8960D: to=<zerg@lippotele.com>, relay=virtual,
delay=8,status=sent (mailbox)
postfix/smtp[24159]: 3D712960E: to=<jim@corebsd.or.id>, orig_to=<jim@lippotele.com>,
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>