Theppitak's blog

My personal blog.

08 ธันวาคม 2547

Virtual E-mail Accounting

จากที่เคยเซ็ตระบบเมลรอไว้เมื่อสามเดือนก่อน โดยใช้ maildir format + imap + pop3 interface พร้อม spam/virus scanner ก็ทดลองใช้เป็นการภายในมาระยะหนึ่ง มันก็ใช้การได้ดี มาถึงตอนนี้ ผู้บริหารต้องการเริ่มใช้ระบบเมลแล้ว ก็เลยมาเซ็ตต่อ ให้ใช้ virtual account คือไม่ต้อง generate shell account บนระบบ เพื่อความปลอดภัยของระบบ แต่ใช้ DBMS เก็บข้อมูลผู้ใช้ (ตามที่ kitty เคยแนะนำในการสนทนาครั้งหนึ่ง)

เคยอ่านพบในข้อมูลแพกเกจของ debian ว่า cyrus สามารถทำ virtual mail ได้ แต่สูตรที่ใช้อยู่ คือ exim4 + courier ยังไม่อยากเปลี่ยน ค้นไปสักหน่อยก็พบว่า ทั้ง exim4 และ courier ต่างก็สนับสนุนการ deliver และ authenticate ผ่าน DBMS ทั้ง MySQL และ PostgreSQL ก็เลยจัดการลองซะ โดยเริ่มจาก HOWTO ที่เคยเก็บไว้ใน blog เก่า ทำไปทำมา ปรากฏว่าเขาทำครบถ้วนมากๆ มีทั้งระบบตอบกลับอัตโนมัติด้วย จะทดสอบทีละขั้นก็ทำได้ยาก ก็เลยค้นใหม่อีก จนไปเจอ อีกฉบับ ดูเป็นขั้นเป็นตอนดี ทำทีละขั้นได้เลย สรุปย่อๆ สักหน่อย (เพิ่มเติมจาก exim4 + sa-exim + spamassassin + amavisd-new + clamav + courier-imap บน Debian) ก็คือ:

  1. apt-get install exim4-daemon-heavy ซึ่งจะมาแทน exim4-daemon-light ที่ไม่สนับสนุนการ lookup DBMS
  2. apt-get install courier-authmysql (หรือ courier-authpostgresql) เพื่อเพิ่ม module การ authenticate ของ courier ผ่าน DBMS
  3. create database และ table สำหรับการ authenticate ตามคำแนะนำในเอกสารของ courier-authmysql
    CREATE TABLE users (
      id       char(128) DEFAULT '' NOT NULL,
      crypt    char(128) DEFAULT '' NOT NULL,
      clear    char(128) DEFAULT '' NOT NULL,
      name     char(128) DEFAULT '' NOT NULL,
      uid      int(10) unsigned DEFAULT '65534' NOT NULL,
      gid      int(10) unsigned DEFAULT '65534' NOT NULL,
      home     char(255) DEFAULT '' NOT NULL,
      maildir  char(255) DEFAULT '' NOT NULL,
      quota    char(255) DEFAULT '' NOT NULL,
      KEY id (id(128))
    );
    
  4. เพิ่มโมดูล authmysql (หรือ authpostgresql) ในรายการ authmodulelist ใน /etc/courier/authdaemonrc แล้วเซ็ตค่าใน /etc/courier/authmysqlrc (หรือ authpostgresqlrc)
    MYSQL_SERVER         localhost
    MYSQL_USERNAME       mail
    MYSQL_PASSWORD       password
    MYSQL_DATABASE       maildb
    MYSQL_USER_TABLE     users
    MYSQL_CRYPT_PWFIELD  crypt
    MYSQL_LOGIN_FIELD    id
    MYSQL_HOME_FIELD     home
    MYSQL_NAME_FIELD     name
    
    จบแล้ว /etc/init.d/courier-authdaemon restart
  5. ทดลองเพิ่ม user ลงใน database และทดสอบ imap authentication
  6. เซ็ต exim4 เพื่อให้กระจายจดหมายตามข้อมูลใน database (ขั้นนี้วิธีในเว็บหลังไม่ผ่าน ต้องผสมวิธีการกับเว็บแรก):
    • กำหนดการเชื่อมต่อ DBMS (ในที่นี้คือ MySQL)
      hide mysql_servers = host/db/user/password
      
    • เพิ่ม virtual_local director ให้ accept และใช้ virtual_local_md_delivery transport
      virtual_local:
        driver = accept
        domains = +local_domains
        transport = virtual_local_md_delivery
      
    • เพิ่ม virtual_local_md_delivery transport ให้กระจายเมลแบบ Maildir โดย query หาแหล่งถุงเมลของผู้ใช้จาก DBMS
      virtual_local_md_delivery:
        driver = appendfile
        directory = ${lookup mysql {SELECT maildir FROM users \ 
                     WHERE id='${quote_mysql:$local_part@$domain}'}{$value}}
        maildir_format
      
      (พอสังเขปนะครับ ความจริงมีต่ออีก แต่เป็นการ fine tune อย่างอื่น)
    แล้วก็ update-exim4.conf และ /etc/init.d/exim4 restart

จบแล้ว ทดลองส่งเมลถึงผู้ใช้แล้วเปิดเมลผ่าน IMAP interface ได้เรียบร้อย :-)

0 ความเห็น:

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem