ติดตั้งและคอนฟิก dovecot

จากที่ได้ติดตั้ง 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 ตามด้วยลำดับที่เมล์ เพื่อแสดงรายละเอียดของเมล์นั้นๆ

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.