Tạm biệt MDaemon, Xin chào postfix!


Bài viết sau sẽ giới thiệu cách chuyển từ MDaemon sang postfix.

Cách làm việc của máy mail hiện tại:

mailserver.hostingcompany.com đang nhận mail cho cơ quan abc.com
Cơ quan dùng mailserver.hostingcompany.com để gởi mail đến khách hàng
MDaemon đang chạy để nhận và gởi mail
Cơ quan đang dùng modem để gởi và nhận mail.

Phần mềm sử dụng: postfix, fetchmail và wvdial trong bản VNLinux Secure (hoặc trong các bản Linux khác).

Giả sử cơ quan có domain là abc.commạng nội bộ là 192.168.1.0/24. Bên dưới là những việc cần làm sau khi đã có postfix (nhận và gởi mail), fetchmail (tải mail từ máy mail của ISP) và wvdial (chương trình quay số lên mạng) cài đặt.

1. Thêm người dùng nhận mail trên hệ thống:

Nếu bạn sử dụng VNLinux Secure thì có thể thêm nguời dùng bằng cách log in vào webtool, chọn "Quản lý hệ thống" để thêm người dùng. Nếu bạn dùng các bản Linux khác, gõ "useradd -m -s /bin/false id_người_dùng" và "passwd id_người_dùng" để gán mật khẩu.

-s /bin/false có nghĩa shell sử dụng là /bin/false, tức là người dùng sẽ không thể log in vào máy nhưng vẫn có thể nhận và gửi mail.

-m có nghĩa tạo các thư mục của người dùng trong /home/id_người_dùng nếu chưa có sẵn.

2. Đặt hostname cho máy là abc.com

3. Thêm vào /etc/postfix/main.cf những dòng sau:

mynetworks = 192.168.1.0/24

disable_dns_lookups = yes

relayhost = mailserver.hostingcompany.com

4. Tạo một script để tải và gởi mail:

Pollmail là một script sẽ thực hiện việc nhận và gởi mail. Script này được sử dụng trong trường hợp bạn đang dùng wvdial để nối lên mạng bằng modem mỗi nữa giờ để gởi và nhận mail. Trong script này, bạn sẽ cần thay đổi mailserver.hostingcompany.com thành địa chỉ của máy mail bạn đang dùng và đổi abc.com thành tên domain của bạn. Lưu script này lại với tên pollmail, gõ "chmod 755 pollmail" và đặt script này trong /usr/local/bin. Lưu ý: nếu bạn không dùng wvdial để nối lên mạng thì cần sửa lại dòng gần cuối cái tên chương trình bạn đang dùng (thay vì wvdial). Nếu không đường truyền của bạn sẽ không tự disconnect sau khi gởi và nhận mail.

#! /bin/bash
 # Poll for mail
 # May be run either by cron or at will by the superuser.
 
 PATH=/bin:/usr/bin:/etc:/sbin:/usr/sbin:/usr/local/bin
 
 # See if we already have PPP running
 if netstat -nr | grep ppp0 >/dev/null
 then
 	echo PPP already running
 	ppp_running=TRUE
 else
 #	if not, start it up...
 	if [ -f /var/run/ppp0.pid ] && ps -p `cat /var/run/ppp0.pid`
 	then
 		echo wvdial is running
 		ping -c 1 mailserver.hostingcompany.com
 		ppp_running=TRUE
 	else
 		ppp_running=FALSE
 		echo Not connecting to the net right now
 	fi
 	sleep 2
 
 	waitpd=0
 	until netstat -nr | grep ppp0 >/dev/null
 	do
 		if ps -axu | grep -v grep | grep -E 'pppd' >/dev/null
 		then
 			sleep 5
 			waitpd=`expr $waitpd + 5`
 			if [ $waitpd -gt 120 ]
 			then
 				echo Timed out
 				exit 2
 			fi
 		else
 			echo 
 			exit 1
 		fi
 	done	
 fi
 sleep 5
 
 # Collect any mail that is waiting for us
 echo "Downloading mail for abc.com"
 fetchmail -f /root/.fetchmailrc
 case $? in	0) :;;			 # no problem
 		1) echo No mail to collect;;
 		2) echo Could not open socket;;
 		3) echo User authentication failed;;
 		4) echo Fatal protocol error;;
 		5) echo syntax error in fetchmail command;;
 		6) echo Bad permissions for run control file;;
 		7) echo Server error reported;;
 		8) echo Exclusion error;;
 		9) echo SMTP failure;;
 		10) echo Undefined error /(bug in fetchmail/);;
 		*) echo Totally unexpected error in fetchmail;;
 esac
 
 echo "Downloading mail for abc.com"
 fetchmail 
 case $? in	0) :;;			 # no problem
 		1) echo No mail to collect;;
 		2) echo Could not open socket;;
 		3) echo User authentication failed;;
 		4) echo Fatal protocol error;;
 		5) echo syntax error in fetchmail command;;
 		6) echo Bad permissions for run control file;;
 		7) echo Server error reported;;
 		8) echo Exclusion error;;
 		9) echo SMTP failure;;
 		10) echo Undefined error /(bug in fetchmail/);;
 		*) echo Totally unexpected error in fetchmail;;
 esac
 
 # Send anything we have for the outside world
 sendmail -q
 sleep 900
 # If we started PPP, stop it again
 if [ "$ppp_running" = TRUE ]
 then
 	/bin/killall -v wvdial
 fi
 

5. Tạo cron job để tự động nối lên mạng mỗi nữa tiếng và thực hiện việc nhận và gởi mail sau 3 phút nối lên mạng

Bằng root, gõ crontab -e rồi bỏ những dòng này vào:

00,30 * * * * /usr/bin/wvdial
03,33 * * * * /usr/local/bin/pollmail

6. Dùng fetchmail để nhận mail từ mailserver.hostingcompany.com. Script pollmail ở trên sẽ làm chuyện này. Tuy nhiên bạn cần khai báo nội dùng của ~/.fetchmailrc như bên dưới.

set no bouncemail
set logfile "/var/log/fetchmail"
set postmaster [email protected]
set daemon 0
poll mailserver.hostingcompany.com with protocol pop3, with options
localdomains abc.com
no dns
envelope Envelope-to
user "id_để_login_pop" there with password "mật_khẩu" is * here
with options rewrite mimedecode fetchall pass8bits
antispam -1

* Thay đổi những giá trị này cho phù hợp với tài khoản của bạn

Với cách cấu hình fetchmail bên trên, messages khi tải về sẽ tự động vào hộp mail của người dùng. Nếu mail vì lý do gì đó bị từ chối thì sẽ gởi đến postmaster. Ở đây postmaster là [email protected]

Trong thời gian thử nghiệm, bạn có thể chạy cả 2 máy (MDaemon và Postfix) cùng lúc và nhớ đổi .fetchmailrc bên trên, thay vì fetchall trong dòng "with options…" thì thế bằng chữ "keep". Nghĩa là khi fetchmail bắt đầu chạy, thông điệp vẫn được giữ lại trên máy chủ để MDaemon lấy về (đây chỉ là trong thời gian thử nghiệm). Khi bạn cảm thấy máy mail postfix đã hoạt động tốt, thay chữ "keep" thành chữ "fetchall" để fetchmail sẽ lấy hẵn về các messages (máy mailserver.hostingcompany.com sẽ không còn những messages này sau khi fetchmail chạy).

Nếu bạn đang sử dụng ADSL, sửa lại script pollmail để khỏi kiểm tra việc đường truyền pppd đang có và việc "hang up" pppd (trong script này wvdial đã được sử dụng). Đồng thời, không cần phải tạo cron job để nối lên mạng mỗi nữa giờ như hàng đầu số 5. bên trên.

Xin lưu ý: đừng quên tạo người dùng trên máy postfix. Nếu không mọi thông điệp sẽ gửi đến postmaster.

Bạn có thể đọc thêm bài giới thiệu về các lệnh căn bản của Postfix để biết cách sử lý thông điệp trong queue.

Postfix: Các lệnh căn bản để xử lý thông điệp trong queue

Tất cả các thông điệp ra/vào đều đi qua queue và chúng được quản lý bởi queue manager hay nói rõ hơn chương trình/lệnh qmgr. Có 5 loại queue trên postfix. Đó là active, bounce, corrupt, deferred, hold. Và tất cả đều nằm trong /var/spool/postfix

Người quản trị mail hay dùng 2 lệnh postsuperpostqueue để quản lý thông điệp nằm trong queue. Thông điệp gởi đi sẽ nằm lại trong deferred queue nếu bị trục trặc nhỏ, ví dụ, không thể tìm thấy host vì hiện tại mạng chưa kết nối, hay vì máy host bên kia đang tạm thời bị sự cố. Những thông điệp nào bị từ chối bởi người nhận hay bị lỗi trầm trọng do máy chủ mail chưa thiết lập đúng thì sẽ bị trả về người gởi ngay lập tức nghĩa là những thông điệp này sẽ không nằm trong queue. Thông điệp nào nằm trong queue sẽ được postfix gởi đi mỗi 17 phút (1000 giây) cho đến khi chúng đã được gởi đi thành công. Bạn có thể thay đổi thời gian postfix kiểm tra thông điệp trong queue (thay vì 1000 giây một lần) bằng cách khai báo/thay đổi giá trị của queue_run_delay trong /etc/postfix/main.cf, postfix sẽ tiếp tục cố gắng gởi đi những thông điệp trong queue trong vòng 5 ngày (5d), sau đó sẽ trả lại người gởi vì lý do gì đó mà thông điệp không gởi được. Bạn có thể thay đổi thời gian postfix giữ thông điệp trong queue bằng cách thay đổi giá trị của maximal_queue_lifetime Để xem giá trị hiện tại (5d), gõ dòng lệnh

[[email protected] kdlc]# postconf | grep maximal_queue_lifetime
maximal_queue_lifetime = 5d

Thông thường postfix sẽ gởi đi khoảng 5 thông điệp một lần. Tùy vào số thông điệp trong queue mà postfix sẽ tự tăng giá trị này lên. Giá trị ( default_destination_concurrency_limit) tối đa là 20. Bạn không nên thay đổi giá trị này vì rất có thể nó sẽ làm những máy mail bạn gởi thông điệp đến sẽ bị tắt nghẽn/chậm chạp đi vì thông điệp gởi đến nhiều quá. Tuy nhiên bạn có thể hạn chế số lượng thông điệp gởi đi ra ngoài cùng lúc bằng cách thay đổi smtp_destination_concurrency_limit hay sử dụng local_destination_concurrency_limit để hạn chế việc giao (deliver) thông điệp đến người dùng. Thông thường giá trị chuẩn của smtp_destination_concurrency_limit là 20 (tức là bằng với default_destination_concurrency_limit) còn local_destination_concurrency_limit là 2. Làm sao mình biết? Gõ postconf | grep smtp_destination_concurrency_limit postconf | grep local_destination_concurrency_limit thì bạn sẽ thấy.

 

  • Để xem có bao nhiêu thông điệp trong queue, gõ: postqueue -p (đây là lệnh tương đương với mailq)
  • Để xóa một thông điệp trong queue, gõ: postsuper -d queue_id queue_id là giá trị trong cột đầu tiên khi bạn dùng lệnh postqueue -p
  • Để xóa tất cả các thông điệp trong queue, gõ: postsuper -d ALL Lưu ý: chữ ALL phải viết hoa.
  • Để tạm giữ lại (hold) một thông điệp trong queue, gõ: postsuper -h queue_id Muốn không tạm giữ nữa thì gõ: postsuper -H queue_id Lưu ý: chữ H viết hoa.
  • Để re-queue thông điệp, gõ: postsuper -r queue_id hay postsuper -r ALL Bạn sẽ dùng re-queue trong trường hợp máy chủ mail bạn vừa được điều chỉnh lại với các giá trị hợp lệ và bạn muốn những thông điệp đang nằm trong queue (vì lý do máy chủ đã cấu hình không đúng) nay sẽ được gởi đi với các giá trị hợp lệ sau khi bạn vừa cấu hình lại.
  • Để xem nội dụng của thông điệp trong queue, gõ: postcat -q queue_id
  • Để tống đi (flush) các thông điệp trong queue, gõ: postqueue -f Lưu ý: bạn không nên thực hiện thao tác này mà nên chờ postfix tự gởi lại. Thực hiện thao tác này nhiều lần, có thể làm máy mail của bạn bị trì trệ. Bạn có thể tống đi thông điệp trong queue cho một domain bạn biết bằng cách gõ: postqueue -s domain.com
    Lưu ý: domain.com phải nằm trong biến fast_flush_domains hay relay_domains
    Ví dụ: khai báo fast_flush_domains = $relay_domains domain.com trong /etc/postfix/main.cf.

    domain.com chỉ là một ví dụ, bạn cần thay đổi một tên thật khi sử dụng. Mỗi lần sửa đổi /etc/postfix/main.cf, bạn phải khởi động lại postfix với dòng lệnh /etc/init.d/postfix restart hay service postfix restart

    Bạn có thể theo dõi hoạt động của postfix bằng cách gõ tail -f /var/log/mail.log tại console. Để thoát, nhấn Ctrl-C.

    Trong bài viết tới, mình sẽ giới thiệu việc sử dụng clamav để lọc thông điệp bị virus.

    Mọi thắc mắc xin gửi lên forum của vnLinux. Bài viết được chuẩn bị bởi larry at vnlinux dot org Script pollmail và .fetchmailrc được sửa lại dựa trên scripts có sẵn trên mạng.

  • Nguồn: Internet

    Có thể bạn quan tâm

    Để lại một trả lời

    Địa chỉ email của bạn sẽ không được công bố.