ใช้ GMail IMAP ผ่าน Mutt

ข่าวการสนับสนุน IMAP ของ GMail เป็นข่าวดีสำหรับผม เนื่องจากการติดต่อกับ Debian จะต้องใช้ GPG ในการยืนยันตัวบุคคลอยู่ตลอด และในฐานะผู้ใช้ GMail คนหนึ่ง การอ่านเมลผ่านเว็บนั้นสะดวกก็จริง แต่ความเป็น web mail นั้นก็ทำให้ตรวจสอบและเซ็นกำกับเป็นไปอย่างทุลักทุเล อย่างน้อยในทางเทคนิค การเอา private key ไปใส่ที่เซิร์ฟเวอร์ภายนอกก็เสี่ยงเกินไป การเซ็นและตรวจสอบด้วยการตัดแปะข้อความมาตรวจสอบด้วยคำสั่งภายนอก ก็ไม่สะดวก

POP access อาจจะช่วยได้ แต่ผมก็สะดวกใจที่จะใช้ IMAP มากกว่าถ้าเป็นไปได้ เพราะไม่ต้องเก็บเมลในเครื่อง และการกระทำทุกอย่างจะเสมือนกับใช้ webmail อีกทั้งการใช้ POP กับ GMail นั้น อาจหมายถึงการบังคับ fetch ข้อความที่มี attachment ใหญ่ ๆ โดยไม่สามารถเลือก fetch ได้เหมือน IMAP

แต่ปัญหาของ IMAP ก็คือ ถึงแม้มันจะ fetch แค่ header มาเท่านั้น แต่กับ account ระดับ GMail ที่มีเมลมหาศาลแล้ว แค่การ fetch header อย่างเดียวก็อ่วมอรไทแล้ว แต่ไม่เป็นไร วันนี้ผมมีทางแก้มาเสนอ

บังเอิญว่า mail client ตัวโปรดของผมคือ Mutt ก็เลยขออ้างอิงตัวนี้นะครับ ส่วน mail client อื่น ๆ อาจมี วิธีเซ็ต ที่ซับซ้อนน้อยกว่า ก็เชิญดัดแปลงกันตามอัธยาศัยนะครับ

เปิดใช้ IMAP

เราต้องเปิดใช้ IMAP ที่ GMail เสียก่อน

  1. เปิดเว็บ ล็อกอินเข้า GMail
  2. คลิกเมนู Settings
  3. เลือกแท็บ Forwarding and POP/IMAP
  4. กำหนด Status ที่หัวข้อ IMAP Access เป็น Enable IMAP
  5. บันทึกการเปลี่ยนแปลง

กำหนดค่า Mutt เพื่อให้เก็บแคชของ mail header

เพื่อไม่ให้เสียเวลาโหลด mail header นาน ๆ ทุกครั้งที่เปิดเมล เราจะกำหนด header cache โดยสร้างแฟ้ม ~/.muttrc แล้วเพิ่มบรรทัด:

set header_cache="~/.mutt-hcache/"

ตรง "~/.mutt-hcache/" นั้น สามารถกำหนดเป็นไดเรกทอรีอื่นได้ตามใจชอบครับ ความจริงสามารถใช้แฟ้มแทนไดเรกทอรีก็ได้ แต่ผมคิดว่าใช้ไดเรกทอรีดีกว่า มันจะแยกแคชสำหรับแต่ละ mailbox ให้ในแฟ้ม

อ้อ เพิ่มคอนฟิกแล้ว ก็อย่าลืมสร้างไดเรกทอรีไว้รองรับด้วยนะครับ

เก็บเมลเก่าเข้ากรุ

นอกจากกำหนด header cache แล้ว ก็ควรจะไปเก็บเมลเก่าใน GMail เข้ากรุ (archive) ไว้ด้วย โดยเฉพาะใครที่มีเมลเป็นหลักแสนฉบับ (แบบผม) น่ะ IMAP connection มักไม่คงทนพอจะโหลด header ได้ครบหรอก

การเก็บเมลเข้ากรุ ไม่ได้แปลว่าลบเมลทิ้งนะครับ มันจะไม่แสดงใน Inbox เท่านั้นเอง แต่ยังสามารถ search ได้ โดยถ้าอยากดูเมลทั้งหมดทั้งปัจจุบันและในกรุ ก็เลือก "All Mail" แทน "Inbox" เท่านั้นเอง

รู้จุดประสงค์แล้ว ก็ลงมือเลย ปุ่มด้านบนของ GMail จะมีปุ่ม "Archive" สำหรับเก็บเมลที่เลือกไว้เข้ากรุเสีย เป็นปุ่มที่ผมไม่เคยใช้เลย เลยซวยหน่อย ที่ GMail ไม่มี search option สำหรับหาเมลที่ "เก่ากว่าเวลาที่กำหนด" ก็เลยต้องไปไล่ตั้งแต่ "Oldest" มา โดยเซ็ตตัวเลือกช่วยนิดหน่อย ดังนี้

  1. กำหนดให้ GMail แสดง 100 ข้อความต่อหน้า เพื่อให้เก็บได้ทีละมาก ๆ โดยเลือกที่
    Settings > General > Maximum Page Size
    
  2. ลงมือเก็บเข้ากรุ
    1. เลือกหน้า "Oldest"
    2. กด Select: "All"
    3. กด Archive
    4. วนไปเรื่อย ๆ ใครเมลเยอะก็วนเยอะหน่อย (ผมทยอยทำวันละนิด ได้แวะอ่านเมลเก่า ๆ ไปในตัวด้วย โหะ ๆ)

หรือใครมีวิธีที่เร็วกว่านี้ แนะนำกันบ้างก็ดีครับ

สำหรับผม ผมเก็บเมลใน Inbox ไว้แค่ 4 เดือนสุดท้าย โดยเหลืออยู่ราว 5,000 thread เท่านั้น นับจำนวนเมลทั้งหมดก็เกือบ 20,000 ฉบับ (จากเดิมเกือบ 50,000 thread จำนวนเมลทั้งหมดก็ราว ๆ 150,000 ฉบับ)

กำหนดค่า Mutt เพื่อการส่งเมลผ่าน SMTP ของ GMail

ใน คู่มือของ GMail ระบุไว้ว่า ผู้ใช้ GMail สามารถฝากส่งเมลผ่าน SMTP ของ GMail ได้ โดยมีรายละเอียดคือ

  • Server: smtp.gmail.com
  • Use Authentication: Yes
  • Use STARTTLS: Yes
  • Port: 465 หรือ 587

Mutt รุ่นแรก ๆ นั้นไม่ติดต่อ SMTP ให้ แต่จะใช้ mail transport agent (MTA) ของระบบ เช่น Exim, Postfix ส่งให้ ทำให้ต้องไปกำหนดค่าที่ MTA เหล่านั้นแทน แต่หลังจากที่ผมห่างหายจาก Mutt ไปนาน พบว่าในรุ่นใหม่ ๆ สามารถใช้ SMTP ส่งเมลได้แล้วโดยเพิ่มบรรทัดต่อไปนี้ใน ~/.muttrc:

set smtp_url="smtps://user@gmail.com@smtp.gmail.com:465"
set smtp_pass="password"

เปิดกล่องเมล IMAP ด้วย Mutt

ผู้ที่ใช้ mail client อื่น อาจเปิดเมลได้ไปแล้วโดยไม่ต้องอ่านมาถึงบรรทัดนี้ แต่สำหรับผู้ใช้ Mutt วิธีการก็คือ

  1. กด `c' ซึ่งเป็นคำสั่งเปลี่ยนกล่องเมล
  2. ป้อน imaps://user@gmail.com@imap.gmail.com/ (เป็นการใช้ IMAP + SSL เพื่อเข้ารหัสการเชื่อมต่อ พร้อมระบุ user เป็น "user@gmail.com ของคุณให้กับเซิร์ฟเวอร์ imap.gmail.com ตามคำแนะนำของ GMail)
  3. ป้อนชื่อผู้ใช้เป็น "user@gmail.com"
  4. ป้อนรหัสผ่านเมื่อถูกถาม

จากนั้นก็รอการโหลด header โดยจะรอนานในครั้งแรก แต่เมื่อเปิดในครั้งต่อไปจะใช้เวลาน้อยลง ถ้าได้เซ็ต header cache ไว้

ถ้ารำคาญที่จะต้องป้อน mail box ยาว ๆ ก็กำหนดค่าต่อไปนี้ไว้ใน ~/.muttrc:

mailboxes imaps://user@gmail.com@imap.gmail.com/INBOX

set imap_user="user@gmail.com"
set imap_pass="password"

เปิดเมลครั้งต่อไป ขณะป้อนชื่อกล่องเมลก็กด <TAB> เพื่อเติมชื่ออัตโนมัติได้เลย แล้วก็ไม่ต้องป้อนชื่อ user และรหัสผ่านอีก

การตรวจสอบลายเซ็น/เซ็นกำกับเมลใน Mutt

การตรวจสอบลายเซ็น GPG ด้วย Mutt นั้นง่ายมาก ไม่ต้องทำอะไรเลย เมื่อเปิดเมลที่มีลายเซ็น GPG, Mutt ก็จะตรวจสอบกับ public keyring ที่เรามีโดยอัตโนมัติ แล้วรายงานว่าเป็น good signature หรือไม่

มีเกร็ดนิดหนึ่งสำหรับการติดต่อกับ Debian Developer คือมีแพกเกจชื่อ debian-keyring ที่จะรวม public key ของ Debian Developer ทั้งหมด ติดตั้งแพกเกจนี้แล้ว เพิ่มบรรทัดนี้ใน ~/.gnupg/gpg.conf:

keyring /usr/share/keyrings/debian-keyring.gpg

เท่านี้ก็จะตรวจสอบลายเซ็นในเมลจาก Debian Developer ทั้งหลายได้แล้ว และเร็ว ๆ นี้ มีตำแหน่งใหม่ใน Debian คือ Debian Maintainer (มีสิทธิ์ upload แพกเกจเหมือน DD แต่ไม่มีสิทธิ์ร่วมโหวตตัดสินประเด็นต่าง ๆ) ก็มีแพกเกจชื่อ debian-maintainers สำหรับ public key ของคนกลุ่มนี้ด้วย

ส่วนการเซ็นกำกับเมลที่ส่งออกใน Mutt ก็กด `p' ในหน้าส่งเมล จะมีตัวเลือกให้เลือกด้านล่าง ว่าจะทำอะไรระหว่าง encrypt, sign, sign as, both, inline, clear ก็เลือกตัวเลือกที่ต้องการได้

  • encrypt คือเข้ารหัสลับข้อความ ด้วย public key ของผู้รับ ผู้รับต้องใช้ private key ของเขาเองในการถอดรหัส
  • sign คือการเซ็นกำกับโดยแนบลายเซ็นเป็น MIME แยกจากชิ้นข้อความ โดยอาศัยกุญแจปริยาย
  • sign as เหมือนกับ sign แต่ใช้กุญแจอื่นที่กำหนด
  • both คือทั้งเข้ารหัสลับ ทั้งเซ็นกำกับด้วย เพื่อยืนยันว่าข้อความเข้ารหัสมาจากเราจริง เนื่องจากใคร ๆ ที่มี public key ของผู้รับก็เข้ารหัสลับส่งให้เขาได้ทั้งนั้น
  • inline คือการกำหนดให้การเซ็น/เข้ารหัสลับ ทำโดยเพิ่มเพิ่มลายเซ็นต่อท้ายในข้อความเลย แทนที่จะใช้การแนบแบบ MIME ตามค่าปริยาย
  • clear คือยกเลิกการเซ็นกำกับ/เข้ารหัสลับทั้งหมด

จบละครับ หวังว่าจะมีประโยชน์สำหรับผู้ใช้ GMail โดยเฉพาะคนที่อยาก เข้าร่วม ทำงานกับ Debian ซึ่ง GPG key จะเป็น สิ่งสำคัญ อย่างหนึ่ง

Update (18 พ.ย. 2550, 18.26 น.): หลังจากที่ผมห่างหายจาก Mutt ไปนาน ตรวจสอบใหม่ เพิ่งพบว่า Mutt รุ่นใหม่ ๆ สนับสนุนการส่งเมลผ่าน SMTP ในตัวแล้ว ก็เลยแก้บทความ ตัดส่วนเซ็ต Exim4 ออก ง่ายลงเยอะครับ

Comments

พบว่า ข้อดีของการใช้ Gmail SMTP คือ เมลที่ส่งออกจะถูกบันทึกลงในกล่อง Sent Mail ของ Gmail โดยอัตโนมัติ พอผนวกกับการใช้ IMAP ก็เลยทำให้ใช้ Gmail ผ่าน mail client กับผ่านเว็บควบคู่กันไปได้ อ่าน/ตอบที่ไหนก็ sync กันหมด ทำให้ใช้เลือกใช้ข้อดีของทั้งสอง interface ได้ตามโอกาส

set exim4 มันต้องฝัง password สำหรับ authen smtp ลงไปใน config ไหม?

ถ้าพูดถึงการใช้ Exim4 ก็ต้องใส่ password ไว้ในแฟ้ม passwd.client ครับ (แต่ในตัวบทความ ผมแก้จากการใช้ Exim4 มาใช้ Mutt อย่างเดียวไปแล้ว)

แต่ถ้าใช้ SMTP ผ่าน Mutt เลย จะใส่หรือไม่ใส่ก็ได้ครับ โดยถ้าไม่ใส่ มันก็จะถามก่อนส่งเท่านั้นเอง (ลืมเขียนถึงประเด็นนี้เหมือนกัน แฮะ ๆ)

เหมือนว่า imap client บางตัว มันสามารถเลือก fetch เป็น range ของ message header ได้นะครับ, โดยไม่ต้อง fetch ทั้งหมด.
หยั่งที่ผมลองใช้ squirrelmail เป็น imap client, ก็เหมือนว่ามันจะ fetch message header เป็นหน้าๆ ไป, ไม่ได้ fetch ทั้งหมด.

ใน squirrelmail มันมี ให้ลองใส่ raw imap command เล่น
ก็ลองๆ ใส่ๆ ไปตามตัวอย่าง
SELECT INBOX.Sent
FETCH 5:7 (FLAGS BODY[HEADER.FIELDS (FROM DATE TO SUBJECT)])
fetch msg #5-7

ว่าจะถามหา feature แบบนี้เหมือนกัน พอดีเขียนแล้วลืม..

พอจะแนะนำ mail client ที่ทำแบบนี้ได้ได้ไหมครับ? ไม่นับ web mail นะครับ เพราะต้องการใช้ GPG จาก keyring ในเครื่องด้วย

ปล. ผมพยายามเซ็ต Evolution ให้ทำแบบเดียวกับ Mutt ข้างบน แต่ไม่สำเร็จแฮะ มัน fetch header ไม่สำเร็จซะที ถึงแม้จะไปเลือก subscribe เฉพาะ Inbox อย่างเดียว ไม่ใช่ทุก mailbox แล้ว ถ้ามีตัวไหนทำได้อีกก็ช่วยแนะนำด้วยนะครับ

patch mutt เลยครับ :D

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้