12 May 2005

จัดการเมลด้วย Maildir และ IMAP

หลังจากทุกอย่างเริ่มเข้าที่เข้าทาง ตอนนี้เริ่มเกิดความกังวลใหม่ เนื่องจากทุกวันนี้อ่านเมลโดยใช้โปรแกรม Mail ที่มากับ Mac OS ซึ่งก็ใช้งานสะดวกดี สามารถกรองสแปม และคัดแยกเมลได้อัตโนมัติ แต่เนื่องจากไม่รู้ว่า Mail เก็บข้อมูลต่างๆ ไว้ยังไง ทำให้เกิดความกังวลว่าต่อไป ถ้าจะย้ายไปอ่านเมลที่อื่น หรือว่าต้องการสำรองข้อมูลเมลขึ้นมาจะทำอย่างไร เนื่องจากเป็นพวกชอบเก็บเมลไว้หมด แถมยังใช้โอเอสหลายแบบอีกต่างหาก เวลาย้ายเมลไปที่เครื่องอื่นก็กลัวว่าจะมีปัญหาตามมา ทำให้ต้องเปลี่ยนวิธีอ่านเมลใหม่ เลยนำระบบ Maildir และ IMAP ที่เป็นระบบมาตรฐานใช้ได้ทุกแพลตฟอร์มมาใช้ เหมือนที่เคยทำตอนอยู่ญี่ปุ่น

Maildir เป็นมาตรฐานของโครงสร้างไดเรคทอรีสำหรับเก็บข้อมูลเมล โดยปกติแล้วเมลที่เราได้รับ ซึ่งเก็บรอไว้ในเซิร์ฟเวอร์นั้น มักจะเก็บไว้ในลักษณะ mbox คือใชัไฟล์เพียงไฟล์เดียวเก็บเมลทุกฉบับ มีการใช้สัญลักษณ์พิเศษคั่นระหว่างเมล ซึ่งก็เหมาะสมสำหรับเซิร์ฟเวอร์แบบทั่วไป เพราะหน้าที่หลักคือต้องการเก็บไว้รอคนมาเรียกไปดูเท่านั้น แต่ไม่เหมาะสำหรับการจัดการเมล เนื่องจากใช้ไฟล์แค่ไฟล์เดียวจะลบจะเพิ่มแต่ละครั้ง จะเสียเวลามาก รวมทั้งยังไม่สามารถแยกเป็นไดเรกทอรี หรือกล่องเมลย่อยๆ ได้ (แต่ดูเหมือน Mozilla ก็ยังใช้วิธีนี้เก็บเมลอยู่ แต่ว่าเพิ่มไฟล์อินเด็กซ์เพื่อช่วยจัดเรียงและค้นหา แต่มีการแยกไปหลายๆ ไฟล์ ตามกลุ่มของเมล) จึงเกิดมาตรฐานใหม่ในการเก็บข้อมูลเมล ที่เรียกว่า Maildir โดยแยกเก็บเมลฉบับละไฟล์ ทำให้สามารถจัดการเมลได้อย่างมีประสิทธิภาพมากกว่า ปัจจุบันนี้เมลเซิร์ฟเวอร์ส่วนใหญ่ สนับสนุนการเก็บข้อมูลแบบนี้ โดยเฉพาะเซิร์ฟเวอร์ที่ใช้โปรโตคอล IMAP

อย่างไรก็ดี คนส่วนใหญ่ยังคงอ่านเมลจากเซิร์ฟเวอร์แบบ POP3 ซึ่งทำให้เราสามารถดึงเมลจากเซิร์ฟเวอร์มาอ่านในเครื่องของเราได้ โดยไม่จำเป็นต้อง telnet เข้าไปอ่านที่เซิร์ฟเวอร์เหมือนสมัยก่อน หน่วยงาน หรือองค์กรต่างๆ ยังคงให้บริการเมลเฉพาะแบบนี้เท่านั้น เนื่องจากสะดวก และทุกคนคุ้นเคยกันดี แต่ POP3 ก็มีข้อจำกัดอย่างที่พูดไปแล้ว คือถูกออกแบบมาให้ทำหน้าที่ส่งต่อเมลเท่านั้น ไม่สามารถจัดการอะไรได้มากนัก เราสามารถเลือกได้แค่ว่า จะเรียกเมลมาทั้งหมดและลบเมลเลย หรือว่าจะให้เหลือเมลทิ้งไว้ที่เซิร์ฟเวอร์ ส่วน IMAP นั้่นเป็นโปรโตคอลทำหน้าที่ในลักษณะเดียวกัน เพียงแต่ว่า IMAP มีข้อดีตรงที่สามารถจัดแบ่ง คัดแยก และเก็บเมลไว้บนเซิร์ฟเวอร์ได้โดยใช้ระบบ Maildir ทำให้เราสามารถสร้างไดเรกทอรีบนเซิร์ฟเวอร์แบบ IMAP เพื่อแบ่งเมลที่เราต้องการเก็บไว้ได้ และเมลเหล่านี้ก็ยังคงอยู่บนเซิร์ฟเวอร์ตลอด แม้ว่าเราจะเปลี่ยนเครื่องที่ใช้อ่านเมล หรือติดตั้งโปรแกรมอ่านเมลใหม่ เราก็ยังคงสามารถดึงเมลทั้งหมดจากเซิร์ฟเวอร์มาอ่านได้เหมือนเดิม โปรแกรมอ่านเมลส่วนใหญ่ก็สนับสนุนการทำงานแบบนี้ ทำให้ใช้งานได้สะดวกมากขึ้น แต่ก็เป็นธรรมดาที่ IMAP ย่อมจะมีจุดอ่อน ข้อเสียของ IMAP ก็คือต้องติดต่อกับเซิร์ฟเวอร์มากกว่า มีการส่งข้อมูลปริมาณมากกว่า ทำให้ไม่สะดวกกับคนที่มีระบบเน็ตเวิร์คที่ไม่เร็วมากนัก (แต่ IMAP ก็ไม่เรียกเมลมาทั้งหมดทีเดียวหรอกนะ ตอนแรกจะแค่ดึงโครงสร้างไดเรคทอรีมาก่อน จากนั้นเลือกอันไหน ก็ค่อยเอารายการของเมลในนั้นมา เมื่อเลือกเมลจึงจะเรียกข้อมูลเมลมาอีกครั้ง)

จากข้อดี และความเป็นมาตรฐานของระบบ IMAP ทำให้เมื่อวานตัดสินใจติดตั้งเซิร์ฟเวอร์ IMAP บนโน้ตบุคของตัวเอง ใช้โปรแกรมดึงเมลมาเก็บไว้ที่ Maildir ที่กำหนดไว้ก่อน จากนั้นค่อยอ่านเมลผ่าน IMAP ที่อยู่บนเครื่องตัวเอง แค่นี้ก็สะดวกขึ้นเยอะแล้ว ถ้าจะเปลี่ยนเครื่อง หรือเปลี่ยนระบบที ก็เพียงแค่ย้าย Maildir นั้นไปเก็บที่อื่น ก็แค่นั้นเอง สำหรับการติดตั้งนั้นใช้ระบบ DarwinPorts ซึ่งช่วยอำนวยความสะดวกในการติดตั้งซอฟท์แวร์เสรีต่างๆ หลังจากติดตั้ง DarwinPorts ตามขั้นตอนแล้ว ก็เลือกติดตั้ง courier-imap เซิร์ฟเวอร์แบบ IMAP ที่คุ้นเคย โดยใช้คำสั่ง

$ sudo port install courier-imap

เมื่อติดตั้งเสร็จเรียบร้อยก็ทำการสร้าง Maildir สำหรับเก็บเมลของเรา โดย courier-imap กำหนดไว้ว่าจะมาดึงเมลจาก ~/Maildir ซึ่งอยู่ในโฮมของตัวเอง การสร้างก็ใช้คำสั่ง

$ maildirmake ~/Maildir

เสร็จแล้วก็สั่งให้เซิร์ฟเวอร์เริ่มทำงาน โดยอาจจะรีบูตเครื่องใหม่ หรือใช้คำสั่ง

$ sudo /opt/local/etc/rc.d/imapd.sh start

จากนั้นเราก็สามารถเซ็ตให้โปรแกรมอ่านเมล มาดึงเมลจาก IMAP ได้ เพียงแต่ว่ายังคงไม่มีเมล ขั้นตอนต่อไปก็ต้องติดตั้งโปรแกรมดึงเมล เพื่อดึงเมลจาก POP3 ขององค์กรมาเก็บไว้ที่ Maildir เพื่อให้มีเมลใหม่เข้ามาเสมอ โดยจะใช้โปรแกรม fetchmail ซึ่งเป็นโปรแกรมมาตรฐานบนยูนิกซ์ แต่เนื่องจาก fetchmail ยังไม่สนับสนุน Maildir เลยต้องใช้ procmail ซึ่งเป็นโปรแกรมจัดการคัดแยกเมลเข้ามาช่วย โดยติดตั้งจาก

$ sudo port install fetchmail
$ sudo port install procmail

เมื่อติดตั้งเสร็จก็ต้องตั้งค่าต่างๆ โดยกำหนดไว้ในไฟล์ .fetchmailrc และ .procmailrc โดย

poll thaigate.nii.ac.jp proto POP3 port 110 user "cholwich" 
password "mypass" options fetchall fetchsizelimit 1 
mda "/opt/local/bin/procmail"

เป็นการกำหนดให้ไปดึงเมลจาก thaigate.nii.ac.jp โดยใช้โปรโตคอลแบบ POP3 มีการระบุชื่อผู้ใช้และรหัสผ่าน จากนั้นก็กำหนดให้ส่งเมลต่อไปยังโปรแกรม procmail ส่วนใน .procmailrc ก้กำหนดว่า

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR
LOGFILE=$HOME/.procmail.log
LOCKFILE=$HOME/.procmail.lock
VERBOSE=on

:0
./

ซึ่งระบุให้นำเมลทั้งหมดไปเก็บไว้ที่ root ของ Maildir ซึ่งอยู่ที่ $HOME/Maildir ถ้าอยากจะให้ procmail คัดแยกเมลให้ด้วย ก็สามารถระบุเงื่อนไขต่างๆ ไว้ในนี้ได้เลย แต่ตอนนี้ขี้เกียจระบุ ให้โปรแกรมสำหรับอ่านเมลจัดการเองล่ะกัน เลยระบุไว้เพียงแค่นี้ จากนั้นก็ต้องสั่งให้ fetchmail ด้วยคำสั่ง

$ fetchmail -d 300

ซึ่งจะไปเช็คเมลให้ทุกห้านาที แต่ก็ติดขัดที่ต้องเรียก fetchmail ทุกครั้งที่บูตเครื่องใหม่ ถ้าขี้เกียจก็สามารถเอาไฟล์ .fetchmailrc ไปเก็บไว้ที่ /opt/local/etc/fetchmailrc ก็ได้ อาจจะต้องไปแก้ค่าเกี่ยวกับ procmail ด้วยนิดหน่อย แต่คิดว่าไม่น่ายาก แค่นี้ก็สามารถจัดการเมลได้เรียบร้อย

หมายเหตุ วิธีการนี้สามารถเอาไปใช้บนลีนุกซ์ได้ทันที แต่อาจจะต้องเปลี่ยนตำแหน่ง หรือวิธีการติดตั้งซอฟท์แวร์นิดหน่อย แต่หลักการยังเหมือนเดิม

ป.ล. เขียนไปเขียนมา ยาวเลยแฮะ

No comments: