จากที่ได้ติดตั้ง postfix ซึ่งเป็นโปรแกรมประเภท SMTP เพื่อรับส่งเมล์แล้ว ในบทความนี้จะอธิบายการติดตั้งและคอนฟิกโปรแกรม dovecot เพื่อให้อ่านเมล์ที่รับมาจากโปรแกรม postfix ได้
เหตุผลที่เลือกโปรแกรม dovecot เพราะความปลอดภัยของโปรแกรม ความง่ายต่อการคอนฟิก และสนับสนุนโปรแกรมอ่านเมล์ทั้ง IMAP และ POP3
ในที่นี้จะทดลองบน Fedora 14 เพื่อให้ต่อเนื่องกับบทความการติดตั้ง postfix
ติดตั้งโปรแกรม dovecot
ไฟล์ rpm ของโปรแกรม dovecot มีอยู่ในแผ่นดีวีดีติดตั้ง Fedora 14 อยู่แล้ว สามารถ mount และติดตั้งจากแผ่นได้เลย
ใช้คำสั่ง mount แผ่นดีวีดีอยู่ในไดเรคทอรี /media
[root@fc14-64a ~]# mount /dev/dvd /media mount: block device /dev/sr0 is write-protected, mounting read-only
[root@fc14-64a ~]# cd /media/Packages/ [root@fc14-64a Packages]# ls -l dovecot* -rw-r--r-- 12 root 101737 1937252 Aug 26 08:47 dovecot-2.0.1-1.fc14.x86_64.rpm
ใช้คำสั่ง rpm เพื่อติดตั้งโปรแกรม dovecot
[root@fc14-64a Packages]# rpm -ivh dovecot-2.0.1-1.fc14.x86_64.rpm Preparing... ########################################### [100%] 1:dovecot ########################################### [100%]
รันเซอร์วิส dovecot
ใช้คำสั่ง service เพื่อรันเซอร์วิส dovecot
[root@fc14-64a ~]# service dovecot start Starting Dovecot Imap: [ OK ]
หากรันได้ถูกต้อง จะมีโปรเซส dovecot รันขึ้นมาตามตัวอย่างผลลัพธ์ของคำสั่ง ps
[root@fc14-64a ~]# ps -ef | grep dovecot root 3177 1 0 02:53 ? 00:00:00 /usr/sbin/dovecot dovecot 3179 3177 0 02:53 ? 00:00:00 dovecot/anvil root 3180 3177 0 02:53 ? 00:00:00 dovecot/log root 3182 3177 0 02:53 ? 00:00:00 dovecot/config
ตรวจสอบพอร์ตประเภท POP3, IMAP ที่สตาร์ตขึ้นมา
[root@fc14-64a ~]# netstat -an Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
สามารถดูชื่อหมายเลขพอร์ตจากไฟล์ /etc/services
pop3 110/tcp pop-3 # POP version 3 imap 143/tcp imap2 # Interim Mail Access Proto v2 imaps 993/tcp # IMAP over SSL pop3s 995/tcp # POP-3 over SSL
ทดสอบอ่านเมล์ผ่าน telnet เข้าพอร์ต POP3
รันเซอร์วิส postfix เพื่อรับส่งเมล์ (หากไม่ได้รันอยู่)
[root@fc14-64a ~]# service postfix start Starting postfix: [ OK ]
ล็อกอินด้วย user1 ทดสอบส่งเมล์ให้ user2
[user1@fc14-64a ~]$ mail user2 Subject: test send mail to user2 test . EOT
เราสามารถใช้คำสั่ง telnet เข้าพอร์ต pop3 (110) เพื่ออ่านเมล์ผ่านโปรโตคอล pop3 ได้
คำสั่งที่ใช้คือ USER และ PASS เพื่อระบุ username และ password สำหรับล็อกอินเข้าอ่านเมล์ผ่าน pop3
หากระบุ USER หรือ PASS ไม่ถูกต้อง จะขึ้น “-ERR Authentication failed.”
หากต้องการออกจากคำสั่ง telnet เข้าพอร์ต 110 ให้ใช้คำสั่ง QUIT
[user2@fc14-64a ~]$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
USER user2
+OK
PASS wrong
-ERR Authentication failed.
QUIT
+OK Logging out
Connection closed by foreign host.
[user2@fc14-64a ~]$
ระบุ USER และ PASS ได้ถูกต้อง
[user2@fc14-64a ~]$ telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Dovecot ready. USER user2 +OK PASS password Connection closed by foreign host.
หลังจากระบุ USER และ PASS ได้ถูกต้อง แต่หลุดออกจากคำสั่ง telnet
การแก้ไขปัญหาโปรแกรมที่เกี่ยวกับเมล์ ไม่ว่าจะเป็น postfix หรือรวมทั้ง dovecot สามารถดูสาเหตุได้ในไฟล์ /var/log/maillog
[root@fc14-64a ~]# tail /var/log/maillog
...
Jan 3 03:13:59 fc14-64a dovecot: pop3-login: Login: user=<user2>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, mpid=3793, secured
Jan 3 03:13:59 fc14-64a dovecot: pop3(user2): Error: user user2: Initialization failed: mail_location not set and autodetection failed: Mail storage autodetection failed with home=/home/user2
Jan 3 03:13:59 fc14-64a dovecot: pop3(user2): Error: Invalid user settings. Refer to server log for more information.
สาเหตุเป็นเพราะว่าโปรแกรม dovecot ไม่สามารถหาที่อยู่ไฟล์ mailbox (mail_location) ของ user2 ได้
แก้ไขคอนฟิก mail_location
เพื่อแก้ปัญหาการหา mailbox ของ user ไม่เจอ ต้องแก้ไขคอนฟิก mail_location ของ dovecot
ไฟล์คอนฟิกหลักของ dovecot คือ /etc/dovecot/dovecot.conf ในเวอร์ชั่นก่อนจะรวมอยู่ในไฟล์นี้ทั้งหมด แต่ในเวอร์ชั่นใหม่จะมีการแยกไฟล์ตามประเภทของคอนฟิกไว้ในไดเรคทอรี /etc/dovecot/conf.d/ อีกที
สำหรับคอนฟิก mail_location จะอยู่ในไฟล์ /etc/dovecot/conf.d/10-mail.conf
ดีฟอลต์ mailbox ที่ได้รับมาจากโปรแกรม postfix จะแยกเป็นไฟล์ตามชื่อ user อยู่ในไดเรคทอรี /var/spool/mail/
[root@fc14-64a ~]# ls -l /var/spool/mail/ -rw-------. 1 root root 7141 Jan 3 02:53 root -rw-rw---- 1 user1 mail 0 Jan 3 03:02 user1 -rw-rw---- 1 user2 mail 575 Jan 3 03:03 user2
ในที่นี้จะเปลี่ยนคอนฟิกของ dovecot เพื่อให้อ่าน mailbox จาก /var/spool/mail/ โดยเปลี่ยนคอนฟิกเป็น
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u
รีสตาร์ตเซอร์วิส dovecot เพื่อให้คอนฟิกใหม่มีผล
[root@fc14-64a ~]# service dovecot restart Stopping Dovecot Imap: [ OK ] Starting Dovecot Imap: [ OK ]
ทดสอบใช้คำสั่ง telnet เข้าพอร์ต 110 เพื่ออ่านเมล์ผ่าน pop3 อีกที
[user2@fc14-64a ~]$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
USER user2
+OK
PASS password
-ERR [IN-USE] Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2011-01-03 03:30:04]
Connection closed by foreign host.
ยังใช้ไม่ได้ เพราะ dovecot ไม่สามารถหา INBOX ได้ เนื่องจากการคอนฟิกที่เปลี่ยนไปนี้ จะอ่านไฟล์ INBOX ที่อยู่ในไดเรคทอรี mail ที่อยู่ใน home ของ user ด้วย (mbox:~/mail)
ตรวจสอบปัญหาที่เกิดขึ้นในไฟล์ /var/log/maillog
[root@fc14-64a ~]# tail /var/log/maillog ... Jan 3 03:30:04 fc14-64a dovecot: pop3-login: Login: user=<user2>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, mpid=3887, secured Jan 3 03:30:04 fc14-64a dovecot: pop3(user2): Error: chown(/home/user2/mail/.imap/INBOX, -1, 12(mail)) failed: Operation not permitted (egid=502(user2), group based on /var/spool/mail/user2) Jan 3 03:30:04 fc14-64a dovecot: pop3(user2): Error: mkdir(/home/user2/mail/.imap/INBOX) failed: Operation not permitted Jan 3 03:30:04 fc14-64a dovecot: pop3(user2): Error: Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2011-01-03 03:30:04] Jan 3 03:30:04 fc14-64a dovecot: pop3(user2): Couldn't open INBOX top=0/0, retr=0/0, del=0/0, size=0
เมื่อพยายามอ่านเมล์ครั้งแรกแล้ว โปรแกรมจะสร้างไฟล์ต่างๆ ที่จำเป็นอยู่ใน home ของผู้ใช้โดยอัตโนมัติ
ตัวอย่างไฟล์ที่สร้างขึ้น
[user2@fc14-64a ~]$ find mail/ mail/ mail/.imap mail/.imap/INBOX
ทดลองอ่านเมล์ผ่าน telnet เข้าพอร์ต 110 อีกครั้ง
[user2@fc14-64a ~]$ telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Dovecot ready. USER user2 +OK PASS password +OK Logged in. LIST +OK 1 messages: 1 540 . RETR 1 +OK 540 octets Return-Path: <user1@spalinux.com> X-Original-To: user2 Delivered-To: user2@spalinux.com Received: by fc14-64a.spalinux.com (Postfix, from userid 501) id 686DC5BA29; Mon, 3 Jan 2011 03:03:39 +0700 (ICT) Date: Mon, 03 Jan 2011 03:03:39 +0700 To: user2@spalinux.com Subject: test send mail to user2 User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20110102200339.686DC5BA29@fc14-64a.spalinux.com> From: user1@spalinux.com
test . QUIT +OK Logging out. Connection closed by foreign host.
หากถูกต้อง หลังจากระบุ USER และ PASS ได้ถูกต้อง สามารถใช้คำสั่ง LIST เพื่อแสดงตัวเลขลำดับที่เมล์ และขนาดของเมล์แสดง
ใช้คำสั่ง RETR ตามด้วยลำดับที่เมล์ เพื่อแสดงรายละเอียดของเมล์นั้นๆ