CoreBSD Wiki

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

coreartikel:postfixmysql [2005/10/19 01:49] – created bangcoreartikel:postfixmysql [2025/10/25 17:09] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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.
 +<code>
 +[krisna@gohan]->[01:10]$man 8 tcpd <-- nah ini juga om Wietse Venema yang bikin
 +</code>
 +
 +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.
 +<code>
 +[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
 +
 +</code>
 +
 +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.
 +
 +<code> 
 +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>
 +
 +</code>
 +
 +===== 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:
 +<code>
 +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. 
 +</code>
 +
 +===== 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
 +<code>
 +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
 +</code>
 +
 +==== 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'''.
 +<code>
 +[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
 +</code>
 +
 +==== Tambahkan Konfigurasi Postfix ====
 +
 +Lihat --postfix-src/README_FILES/VIRTUAL_README
 +{main.cf & master.cf }
 +<code>
 +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  -                               virtual
 +</code>
 +
 +==== 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:
 +<code>
 +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
 +</code>
 +
 +=== /etc/vmailer/virtual_domain.cf ===
 +
 +<code>
 +user            = postfix
 +password        = myvmailpassword
 +dbname          = postfix
 +hosts           = localhost
 +table           = domain_maps
 +select_field    = pemilik
 +where_field     = namadomain
 +additional_conditions = and status = 'oke'
 +</code>
 +
 +=== /etc/vmailer/virtual_mailbox.cf ===
 +
 +<code>
 +user            = postfix
 +password        = myvmailpassword
 +dbname          = postfix
 +hosts           = localhost
 +table           = mailbox_maps
 +select_field    = maildir
 +where_field     = emailaddr
 +additional_conditions = and status = 'oke'
 +</code>
 +
 +=== /etc/vmailer/virtual_alias.cf ===
 +
 +<code>
 +user            = postfix
 +password        = myvmailpassword
 +hosts           = localhost
 +dbname          = postfix
 +select_field    = remotemail
 +where_field     = emailaddr
 +additional_conditions = and status = 'oke'
 +</code>
 +
 +==== MySQL Database ====
 +
 +Untuk memenuhi design database diatas maka akan diimplementasikan sebagai berikut
 +<code>
 +## 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` ) 
 +       );
 +</code>
 +
 +===== Testing =====
 +
 +<code>
 +-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
 +</code>
 +
 +===== 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 <[email protected]>