หลังจากครั้งก่อนลงเครือง postfix ไว้ยิงเมลออกอย่างเดียวไปแล้ว ครั้งนี้เบื้องบนมีความต้องการอยากได้
mail server postfix ที่เต็มระบบเพื่อนำมาแทน Qmail server ที่เคยทำไว้ใช้นานแล้วเหมือนกัน ได้จัดให้ ลองผิดลองถูกหลายวันเลย
เอามาแชร์ไว้
1. ก่อนอื่นเพื่อความแน่นอน ทำการอัพเกรดซอฟแวร์ server ก่อน
[code] # apt-get update
# apt-get upgrade[/code]
2. install software ที่ต้องใช้ในการติดตั้งครั้งนี้ครับ บน debian ก็ apt ทีเดียวรวดเลยครับ
รวมถึงพวก apache mysql phpmyadmin จัดเลยทีเดียว
[code]
# apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common dovecot-imapd dovecot-pop3d libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl telnet mailutils php5 php5-ldap php5-mysql phpmyadmin apache2[/code]
- จะขึ้นหน้าต่างให้เราใส่ตั้ง password สำหรับ mysql5
- postfix จะขึ้นหน้าเลือกออฟชั่นในการลง ให้เลือก internet site
- ตั้งชื่อในการใช้งาน dns ให้เห็นคอนเฟิก postfix ซึ่งมักจะใช้ชื่อเครื่องเรานั้่นเอง ลองดูจาก uname -a ก็ได้
เสร็จขึ้นตอนนี้ ก็ลองเข้าใช้งาน mysql
[code]# mysql -u root -p[/code]
แล้วสร้าง database ในการ install mailserver เลยครับตั้งชื่อว่า postfix
[code]CREATE DATABASE postfix;[/code]
[code]USE posfix;[/code]
สร้าง user และกำหนดสิทธิ์ user ( แทนค่า admin ด้วย user ที่เราต้องการ, แทน admin_password ด้วย password ที่ต้องการ
[code]GRANT SELECT, INSERT, UPDATE, DELETE ON postfix.* TO 'admin'@'localhost' IDENTIFIED BY 'admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON posfix.* TO 'admin'@'localhost.localdomain' IDENTIFIED BY 'admin_password';
FLUSH PRIVILEGES;[/code]
แล้วสร้างตารางต่างๆไว้รองรับเมล์ postfix
[code]CREATE TABLE domain (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );[/code]
[code]CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );[/code]
[code]CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );[/code]
[code]CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );[/code]
[quote]quit[/quote]
ตรวจไฟล์ my.cnf ว่าค่าตรงค่า bind ได้ตัั้งไว้ไหม
# vi /etc/mysql/my.cnf
bind-address = 127.0.0.1
ออกมาแล้ว restar service รอบหนึ่ง
# /etc/init.d/mysql restart
3 Install postfix admin ก่อนเลยครับ ตรวจสอบเวอร์ชั่นใหม่ๆ ได้ที่นี่ http://postfixadmin.sourceforge.net/
เหตุที่ลงตัวนี้ก่อนเพราะตัวโปรกแกรมนี้ค่อนข้าง fix ชื่อตารางด้านในไว้แล้วครับ ถ้าเปลียตอนหลังยุ่งยากมากแล้วโอกาสไม่เวิรคสูงครับ ( เคยปวดหัวมาแล้ว )
หลังจากดาวโหลดมาในตอนแรกแล้วก็นำไปไว้ในพาร์ทของเวปเราเลยครับ
# cd /var/www
# tar -xzf postfixadmin-2.3.3.tar.gz
# mv postfixadmin-2.3.3.tar.gz postfixadmin
# cd postfixadmin
แก้ configure.inc.php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'admin';
$CONF['database_password'] = 'admin_password';
$CONF['database_name'] = 'postfix';
แล้วเปิดเข้าหน้า postfixadmin
http://ipaddress/postfixadmin/setup.php
โปรแกรมจะตรวจสอบระบบที่ต้องการของเครืองเรา เมื่อผ่านหมดจะขึ้นให้เราใส่ ระหัสในการติดตั้ง
[img]http://img84.imageshack.us/img84/8908/001rea.jpg[/img]
เมื่อใส่ไปแล้วมันจะเด้งการ gent code ออกมาด้านบนครับ เราต้องก๊อประหัสนนี้ไปใส่ในไฟล์ configure.inc.php อีกทีครับ
$CONF['setup_password'] = 'รหัสที่ได้จากการ gen';
[img]http://img9.imageshack.us/img9/6259/002ren.jpg[/img]
เมื่อใส่เสร็จก็ refresh หน้าเวปครั้งหนึ่งก็จะโผล่หน้าให้เรา add e-mail admin ที่จะเป็นผู้เข้ามาใช้หน้าจัดการหน้านี้แล้ัวครับ
ใส่ไป admin@yourdomain.com ใส่ตามที่ระบบคุณใช้ละกันตรับ
[img]http://img29.imageshack.us/img29/2451/003rey.jpg[/img]
เมื่อเสร็จก็ ok แล้วครับ ลองทดสอบเข้าใช้งานได้ที่
url http://youraddress.com/postfixadmin/ แล้วใส่ e-mail adminที่เราตั้งไปเมื่อสักครู่นั่นเอง
แต่ระบบข้างในยังใช้งานไม่ได้จริง เราต้องไปเซ็ตระบบ postfix mail server ให้ลิงค์กับมันเสียก่อนครับ
4. สร้างไฟล์ configure ไว้สำหรับในการเรียกค่าคอนฟิกจาก postfix ให้มาเรียกใช้
# vi /etc/postfix/mysql_virtual_mailbox_domains.cf
[code]hosts = 127.0.0.1
user = admin
password = admin_password
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1[/code]
# vi /etc/postfix/mysql_virtual_mailbox_maps.cf
[code]hosts = 127.0.0.1
user = admin
password = admin_password
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
[/code]
# vi /etc/postfix/mysql_virtual_alias_maps.cf
[code]hosts = 127.0.0.1
user = admin
password = admin_pasword
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1[/code]
# vi /etc/postfix/mysql_virtual_forwardings.cf
[code]user = root
password = admin_password
dbname = postfix
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
[/code]
# vi /etc/postfix/mysql_virtual_email2email.cf
[code]user = admin
password = admin_password
dbname = postfix
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1[/code]
กำหนดค่า permition ไฟล์ทั้งหมด
[code]chmod o= /etc/postfix/mysql_virtual_*.cf
chgrp postfix /etc/postfix/mysql_virtual_*.cf[/code]
กำหนด group
[code]groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m[/code]
ตรวจสอบค่าในไฟล์ /etc/postfix/main.cf ตามนี้ครับ
[code]smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = /usr/share/doc/postfix
# TLS parameters
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
myhostname = mail.yourdomain.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail.yourdomain.com, localhost, localhost.localdomain
relayhost =
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
html_directory = /usr/share/doc/postfix/html
message_size_limit = 30720000
#virtual_alias_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_forwardings.cf, mysql:/etc/postfix/mysql_virtual_email2email.cf
#virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
#virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
#relay_domains = mysql:/etc/postfix/mysql_relay_domains.cf
relay_domains = mysql:/etc/postfix/mysql_relay_domains.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
relay_domains =
mailman_destination_recipient_limit = 1
transport_maps = hash:/etc/postfix/transport
### add after by rukwa ###
mynetworks_style = subnet
smtpd_helo_required = no
strict_rfc821_envelopes = no
smtpd_reject_unlisted_sender = no
smtpd_reject_unlisted_recipient = no[/code]
[color=red]- ค่า mynetworks = ค่าเน็ทเวิร์คที่จะยอมให้วงไหนใช้ mail เครื่องนี้บ้างก็ใส่เพิ่มตรงนี้ไปครับ
- ค่า mydestination = เปลียนจาก yourdomain เป็นโดมนของคุณใช้อยู่[/color]
5.สร้าง SSL Certificate ให้ postfix
[code]# cd /etc/postfix
# openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509[/code]
แล้วใส่ค่าตามที่ระบบเราเป็น
Country Name (2 letter code) [AU]:TH
State or Province Name (full name) [Some-State]:Bangkok
Locality Name (eg, city) []:Klongteoy
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany, LLC
Organizational Unit Name (eg, section) []:Email Services
Common Name (eg, YOUR name) []:server.yourdomain.com
Email Address []:support@yourdomain.com
เซ็ต permittion ให้ smtp
[code]# chmod o= /etc/postfix/smtpd.key[/code]
6. ตั้งค่า saslauthd ให้ mysql
[code]# mkdir -p /var/spool/postfix/var/run/saslauthd[/code]
ก๊อปไฟล์เก่าเก็บแบคอัพไว้ก่อน
# cp -a /etc/default/saslauthd /etc/default/saslauthd.bak
แก้ไฟล์ /etc/default/saslauthd ให้มีค่าดังนี้
[code]START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="rimap"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"[/code]
สร้างไฟล์ /etc/pam.d/smtp แล้วใส่ค่าดังนี้ไป แก้ admin และ password เป็นค่าที่คุณระบุไว้ในไฟล์คอนเฟิก
# vi /etc/pam.d/smtp
[code]auth required pam_mysql.so user=admin passwd=admin_password host=127.0.0.1 db=postfix table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=admin passwd=admin_password host=127.0.0.1 db=posfix table=users usercolumn=email passwdcolumn=password crypt=1[/code]
สร้างไฟล์ /etc/postfix/sasl/smtpd.conf แล้วใส่ค่าดังนี้
# vi /etc/postfix/sasl/smtpd.conf
[code]pwcheck_method: saslauthd
mech_list: plain login
auxprop_plugin: rimap[/code]
add user sasl แล้วทำการรีสตาร์เซอซ์วิสเพื่อเริ่มค่าคอนฟิกใหม่
[code]# adduser postfix sasl
# service postfix restart
# service saslauthd restart[/code]
7. Configure Dovecot
แก้ไขไฟล์ /etc/postfix/master.cf เพิ่มเติมในส่วนค่า dovecot ไว้ที่ด้านล่างสุดดังนี้
[code]dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}[/code]
แก้ไขไฟล์ โดย coppy เก็บไฟล์ต้นฉบับไว้ก่อนกันพลาด
# cp -a /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak
# vi /etc/dovecot/dovecot.conf ใส่ค่าดังนี้
[code]disable_plaintext_auth=no
protocols = imap imaps pop3 pop3s
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@yourdomain.com
mail_plugins = sieve
global_script_path = /home/vmail/globalsieverc
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
user = root
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
[/code]
แก้ไขไฟล์ /etc/dovecot/dovecot-sql.conf ( เปลียน user - password ตามระบบที่คุณใช้ )
# vi /etc/dovecot/dovecot-sql.conf
[code]driver = mysql
connect = host=127.0.0.1 dbname=postfix user=admin password=admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';[/code]
แก้ permittion ไฟล์
[code]# chgrp vmail /etc/dovecot/dovecot.conf[/code]
[code]# chmod g+r /etc/dovecot/dovecot.conf[/code]
restart service
# /etc/init.d/dovecot restart
เช็คดู /var/log/mail.log ถ้าขึ้นตามนี้แสดงว่า work แล้ว
[code]Jul 29 14:45:01 mail postfix/pipe[31225]: 85CB33C010: to=<postmaster@yourdomain.com>, orig_to=<root>, relay=dovecot, delay=0.01, delays=0/0/0/0.01, dsn=2.0.0, status=sent (delivered via dovecot service)
Jul 29 14:45:01 mail postfix/qmgr[31125]: 85CB33C010: removed[/code]
8. Configure Mail Aliases
แก้ไขไฟล์ /etc/aliases ให้เป็นดังนี้
[code]postmaster: root
root: postmaster@gmmdigital.com[/code]
แล้วรันคำสั่งเพื่อรับค่าใหม่ แล้วรี service อีกรอบ
[code]# newaliases[/code]
[code]# service postfix restart[/code]
ลองเช็คค่า configure ใช้คำสั่ง
# postconf -n จะแสดงค่าที่ระบบใช้อยู่ครับ
[code]alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
broken_sasl_auth_clients = yes
config_directory = /etc/postfix
html_directory = /usr/share/doc/postfix/html
inet_interfaces = all
mailbox_size_limit = 0
message_size_limit = 30720000
mydestination = mail.yourdomain.com, localhost, localhost.localdomain
myhostname = mail.yourdomain.com
mynetworks = 127.0.0.0/8
mynetworks_style = subnet
myorigin = /etc/mailname
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
readme_directory = /usr/share/doc/postfix
recipient_delimiter = +
relay_domains =
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_helo_required = no
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_reject_unlisted_recipient = no
smtpd_reject_unlisted_sender = no
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
strict_rfc821_envelopes = no
transport_maps = hash:/etc/postfix/transport
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = dovecot
virtual_uid_maps = static:5000[/code]
8 . ทดสอบการใช้งาน
# telnet localhost 25
[quote]Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.gmmdigital.com ESMTP Postfix (Debian/GNU)
ehlo localhost
250-mail.yourdomain.com
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN[/quote]
ok smtp ทำงานโอเค
[quote]
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Dovecot ready.[/quote]
ok pop3 ทำงานแล้ว
ต่อไปทดสอบการ add domainและ user ผ่านหน้า postfixadmin login เข้าไปแล้วสร้าง Domain สักชื่อแล้ว add mailbox ไว้
[img]http://img263.imageshack.us/img263/1346/004rel.jpg[/img]
( ในรูปภาพสร้างโดเมน test.com )
แล้วเข้าไปดูในพาร์ท server ที่ /home/vmail/ จะต้องมีโดเมน test.com แล้วสร้างให้เรา auto แล้วภายในนั้นมี folder แยกตามแต่ละคนเลยดังนี้
root@mail:/home/vmail/test.com# ls -al
total 12
drwx------ 14 vmail vmail 96 Jul 29 14:35 .
drwxr-xr-x 13 vmail vmail 4096 Jul 29 10:23 ..
drwx------ 3 vmail vmail 8 Jul 29 00:07 00001
drwx------ 3 vmail vmail 8 Jul 28 19:07 add18
drwx------ 3 vmail vmail 8 Jul 29 00:08 cong
drwx------ 3 vmail vmail 8 Jul 28 19:07 gogo
drwx------ 3 vmail vmail 8 Jul 29 01:00 jatujak
drwx------ 3 vmail vmail 8 Jul 28 18:02 ken
drwx------ 3 vmail vmail 8 Jul 28 18:30 mygod
drwx------ 3 vmail vmail 8 Jul 29 14:35 ohho
drwx------ 3 vmail vmail 8 Jul 28 17:26 pramote
drwx------ 3 vmail vmail 8 Jul 28 17:29 rukawa
drwx------ 3 vmail vmail 8 Jul 29 00:07 who
drwx------ 3 vmail vmail 8 Jul 28 17:39 work
ทีนี้เราลองเปิด outlook ขึ้นมาแล้ว set account มาสักชื่อหนึ่งแล้วชี้ smpt และ pop3 มายัง server ที่เราเทสเลยครับ
จะต้อง login ได้และไดัรับ e-mail ต้อนรับ ครับถ้าไม่ได้ แสดงว่ามีข้อผิดพลาดให้
เช็คที่
/var/log/mail.log ครับว่าขึ้นอะไร
กรณีที่ login หน้า outlook ไม่ได้ ให้ไปดูไฟล์ /etc/dovecot/dovecot.conf เลยครับ ว่าผิดตรงไหน
แล้วค่อยเทสให้ระบบส่งเมล์ไปหา user นั้นด้วยเลย ด้วยคำสั่ง
# mailx user1@test.com <enter>
cc: ใส่ หรือ <enter> ผ่าน
Subject: yoursubject
< ข้อความที่จะส่ง > แล้ว <enter>
Ctrl + D เพื่อส่งจดหมาย
แล้วไปเช็ค log และจดหมายในไฟล์เดอร์ของ user นั้นๆ ครับว่ามีมาป่าว ถ้ามาแล้วก็ย้อนไปเทสผ่านหน้าจัดการ postfixadmin
และเซ็๖ accout บน outlook ตามด้านบนอีกที ถ้าผ่านหมดก็เรียบร้อยแล้วครับ ระบบ mail server postfix โอ้ว ยาวเฟื้อย :P
แหล่งอ้างอิง: http://library.linode.com/email/postfix/dovecot-mysql-debian-6-squeeze