๑๒/๐๘/๒๕๕๒

Sendmail + MySQL + Slackware


Mail + MySQL



จุดประสงค์

ไม่ต้องการให้ E-mail Users เป็น users ของระบบ แต่จะเก็บรายชื่อ และ Password ของผู้ใช้งาน email ไว้ใน table ของ MySQL

เหตุผล

เพื่อความปลอดภัยของระบบ เพราะ users จะไม่สามารถใช้ users และ password นั้น ๆ เพื่อ login เข้าระบบได้ อาจจะเพื่อเหตุผลอื่น ๆ อีก แต่ยังนึกไม่ออก ว่าทำไมต้องทำแบบนี้ ที่ลองทำเพราะ มีหลายคนพูดถึง และสอบถามมาว่าเคยลองทำหรือไม่
 

ขั้นตอนการทำงาน (ของผม)

เริ่มลองหา ว่ามีใครเขียนเรื่องนี้ไว้บ้าง ที่พบคือhttp://www.posixnet.org/index1.html ซึ่งที่นี้จะเป็น patch กับ sendmail โดยตรง เพื่อให้ใช้ users จาก MySQL เลย แต่ความสามารถผมน้อยไป ไม่สามารถทดลองทำได้สำเร็จ จึงมองหาที่อื่นอีก ก็พบที่  http://www.riverstyx.net/qpopmysql/ เป็น patch กับ qpopper โดยให้ใช้ user และ password ใน table ของ MySQL ทดลองอยู่ หลายวัน และกับ patch หลายเวอร์ชั่นของเขา  ต้องเอาเวอร์ชั่นเก่า ๆ หน่อยมาลอง จึงสำเร็จ
เมื่อทดลองว่า POP Server สามารถรู้จัก users ที่เก็บไว้ใน MySQL แล้ว จึงทดลองส่งเมล์ไปยัง users ดังกล่าว ปรากฏว่า ได้รับคำตอบกลับมาว่า Unknown user จึงคิดต่อไปว่า จะทำอย่างไรดี เพราะในเวบที่กล่าวถึงแล้ว ก็ไม่ได้อธิบายการใช้งาน จนถึงกับใช้งานได้เลย จบเพียงแค่ POP Server ใช้ users ในตารางของ MySQL เท่านั้น หลังจากคิด และทดลองอยู่หลายวัน จึงได้แนวความคิดว่า :-
  • จะให้ sendmail ส่งเมล์ทั้งหมดที่มายังเซิฟเวอร์นี้ ไปยัง root
  • จากนั้น จะให้ procmail จัดการส่งต่อไปยัง /var/spool/mail/users
  • เมื่อเมล์ไปอยู่ยัง /var/spool/mail/users แล้ว ก็จะทำให้ users สามารถเช็คเมล์ได้

วิธีที่ว่า มีปัญหาไหม

  • ตอนนี้อยู่ในขั้นทดลอง การที่ procmail จะส่งเมล์ไปยัง users ต่าง ๆ ได้ถูก ทุกครั้งที่มีการเพิ่ม users จะต้องแก้ไขไฟล์ สมมุตว่าชื่อ rc.mail2user โดยต้องเพิ่ม users ใหม่เข้าไปทุกครั้ง ยังไม่ได้เขียนโปรแกรม ให้เพิ่มเข้าไปได้แบบอัตโนมัติ
  • เนื่องจาก root เป็นคนส่งเมล์ต่อให้อีกทีหนึ่ง ทำให้ /var/spool/mail/users (ที่เกิดขึ้นอัตโนมัติ จาก procmail) อ่านและเขียนได้โดย root เท่านั้น ดังนั้นการ ที่จะให้ users อ่านเมล์ได้ ต้องแก้ปัญหา โดยการสร้างไฟล์ ว่าง ๆ ด้วยชื่อของ users ใหม่ที่เพิ่งเพิ่มเติมเข้ามา ใน /var/spool/mail จากนั้นสั่ง chmod 666 <users>
  • ถ้ามีเมล์ฉบับหนึ่ง ส่งถึงหลาย users ในวิธีการนี้ เมื่อ procmail เจอชื่อแรก ก็จะส่งไปถึง user นั้นเลย ไม่ได้เช็คต่อว่ามี cc ถึง users อื่นอีกหรือไม่ ทำให้เมล์จะไม่ถึง users ที่อยู่หลัง ๆ
ปัญหาดังกล่าวทั้งสามข้อนี้ ถ้าท่านใดนำไปดัดแปลง จนแก้ไขปัญหาได้ ก็กรุณาช่วยเผยแพร่ต่อไปด้วยครับ หรือจะส่งกลับไปที่ผม ให้ช่วยเผยแพร่ต่อก็ ยินดีเป็นอย่างยิ่งครับ
ผมไม่ทราบว่า วิธีที่ว่านี้ เป็นวิธีที่ดีหรือไม่ มีใครเขียนเรื่องที่ดีกว่านี่ไว้แล้วหรือไม่ จึงทำไปในแนวทางของตัวเอง ถ้าท่านใดรู้ว่า วิธีนี้ เป็นวิธีที่ไม่ถูกต้อง หรือมีวิธีการที่ดีกว่า จะกรุณาแนะนำ ก็ยินดีรับฟังเช่นกันครับ

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

วิธีทำ

  • ผมทดลองติดตั้งกับ slackware 7.1 ใช้ sendmail และ procmail ที่มากับ slackware 7.1 เลย ไม่ได้ดาวน์โหลด มาติดตั้งใหม่ (เพื่อจะได้ไม่มีปัญหาเรื่องการ compile)
  • ขออนุญาตข้ามขั้นตอนเรื่องการติดตั้ง MySQL
  • ดาวน์โหลด  http://www.ibiblio.org/pub/solaris/freeware/SOURCES/qpopper-3.0b18.tar.gz (qpopper ทำให้เมล์เซิฟเวอร์ใช้ POP3 ได้)
  • cp qpopper-3.0b18.tar.gz /usr/local/src
  • cd /usr/local/src
  • tar xvfz qpopper-3.0b18.tar.gz
  • cd qpopper3.0
  • ./configure --enable-specialauth
  • ดาวน์โหลด   http://www.riverstyx.net/qpopmysql/qpopper-mysql-0.6.tar.gz (patch นี้จะทำให้ qpopper ใช้ user & password จาก mysql แทน user & password ของระบบ)
  • cp qpopper-mysql-0.6.tar.gz /usr/local/src
  • cd /usr/local/src
  • tar xvfz qpopper-mysql-0.6.tar.gz
  • patch -d qpopper3.0 -p1 < mspatch
  • จะมีข้อความขึ้นดังนี้ error ที่เกิดขึ้น คงไม่เกี่ยวกับที่จำนำมาใช้งาน patching file doc/Makefile Reversed (or previously applied) patch detected!  Assume -R? [n] Apply anyway? [n] y Hunk #1 FAILED at 32. Hunk #2 FAILED at 50. 2 out of 2 hunks FAILED -- saving rejects to file doc/Makefile.rej patching file man/Makefile Reversed (or previously applied) patch detected!  Assume -R? [n] Apply anyway? [n] y Hunk #1 FAILED at 14. Hunk #2 FAILED at 41. 2 out of 2 hunks FAILED -- saving rejects to file man/Makefile.rej The next patch would create the file mmangle/Makefile, which already exists!  Assume -R? [n] Apply anyway? [n] y patching file mmangle/Makefile Patch attempted to create file mmangle/Makefile, which already exists. Hunk #1 FAILED at 1. 1 out of 1 hunk FAILED -- saving rejects to file mmangle/Makefile.rej patching file popper/Makefile.mysql patching file popper/pop_auth.c patching file popper/pop_pass.c patching file popper/pop_rpop.c patching file popper/pop_user.c patching file popper/popper.c patching file popper/popper.h patching file popper/popper_conf.c patching file popper/version.h
  • cd /usr/local/src/qpopper3.0/popper
  • แก้ไข Makefile .mysql
  • ของเดิม LIBS  =    -lgdbm -lmysqlclient -L /usr/lib/mysql เพิ่มเติมเป็น (หรือตามที่ mysql lib ในเครื่องท่าน) LIBS  =    -lgdbm -lmysqlclient -L /usr/local/lib/mysql
  • mv Makefile.mysql Makefile
  • cd /usr/local/src/qpopper3.0
  • make
  • cd popper
  • cp popper /usr/sbin
  • สร้างไฟล์ชื่อ mail.sql (ความจริงไม่จำเป็นต้องสร้าง ท่านสามารถ connect ไปยัง mysql แล้วสั่งโดยตรงได้) มีข้อความดังนี้
  • ## mysql -uroot -p < mail.sql CONNECT mysql; INSERT INTO user ( host, user, password ) VALUES ( 'localhost','qpopper',password('mailpass') ); INSERT INTO db ( host, db, user, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv ) VALUES ( 'localhost', 'qpopper', 'qpopper', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y' ); CREATE DATABASE qpopper; CONNECT qpopper; CREATE TABLE popusers ( username char(32), password char(32), uid mediumint(9) DEFAULT '0' NOT NULL auto_increment, gid mediumint(9) DEFAULT '0', maildrop char(128), PRIMARY KEY (uid));
  •  mysql -uroot -p < mail.sql
  • คำสั่งนี้จะสร้าง database 'qpopper' พร้อมทั้ง privileges ว่าใครสามารถเข้าใช้งานได้
  • mysql -uroot -p
  • Enter password: mysql> flush privileges; Query OK, 0 rows affected (0.03 sec) คำสั่ง flush privileges; จะเป็นการอัพเดต privileges ที่เราเพิ่มเติมให้มีผลใช้งานได้
  • ลองออกจาก mysql แล้วเข้า login ด้วย user qpopper และดูตามแล้วกัน สีน้ำเงิน เป็นคำสั่งที่ผมใช้ สีดำ คือข้อความที่โต้ตอบกลับมา
    bash-2.04# mysql -uqpopper -p Enter password: Welcome to the MySQL monitor.  Commands end with ; or g. Your MySQL connection id is 20 to server version: 3.22.30 Type 'help' for help. mysql> use qpopper; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-------------------+ | Tables in qpopper | +-------------------+ | popusers          | +-------------------+ 1 row in set (0.00 sec) mysql> desc popusers; +----------+--------------+------+-----+---------+----------------+ | Field    | Type         | Null | Key | Default | Extra          | +----------+--------------+------+-----+---------+----------------+ | username | char(32)     | YES  |     | NULL    |                | | password | char(32)     | YES  |     | NULL    |                | | uid      | mediumint(9) |      | PRI | 0       | auto_increment | | gid      | mediumint(9) | YES  |     | 0       |                | | maildrop | char(128)    | YES  |     | NULL    |                | +----------+--------------+------+-----+---------+----------------+ 5 rows in set (0.03 sec) mysql> insert into popusers values('jack','jackpass','1200','0','/var/spool/mail/'); Query OK, 1 row affected (0.00 sec) mysql> insert into popusers values('jane','janepass','0','0','/var/spool/mail/'); Query OK, 1 row affected (0.00 sec) สองคำสั่งนี้ เป็นการเพิ่ม user ให้กับ pop3 user ใน table 'popusers' ของ database 'qpopper' สองท่านคือ jack และ jane mysql> select * from popusers; +----------+----------+-----+------+-----------------+ | username | password | uid | gid  | maildrop        | +----------+----------+-----+------+-----------------+ | jane     | janepass |  1201 |    0 | /var/spool/mail | | jack     | jackpass |  1200 |    0 | /var/spool/mail | +----------+----------+-----+------+-----------------+ 2 rows in set (0.00 sec)
  • แก้ไข /etc/inetd.conf โดยเพิ่มเติม
  • # qpopper I add Myself pop3    stream  tcp     nowait  root    /usr/sbin/popper        popper -s
  • ให้ดู pid number ของ inetd โดย
  • bash-2.04# ps -ax|grep inetd    95 ?        S      0:00 /usr/sbin/inetd  1630 pts/0    S      0:00 grep inetd
  • ตัวอย่าง จะได้ pid number คือ 95 สั่ง restart inetd โดย
  • bash-2.04# kill -HUP 95
  • สร้างไฟล์ /etc/poper.conf มีข้อความดังนี้
  • MySQLUsername qpopper MySQLPassword mailpass MySQLAuthDB qpopper MySQLAuthTable popusers MySQLAuthUsernameField username MySQLAuthPasswordField password MySQLAuthPasswordMethod both MySQLAuthSpoolField maildrop MySQLAuthServer localhost
  • ทดลองว่า pop3 ใช้งานกับ user ที่อยู่ใน mysql ได้หรือยัง โดย
  • bash-2.04# telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK QPOP (version 3.0b18-mysql0.5b) at mercury.sra.cat.or.th starting. user jack +OK Password required for jack. (MySQL-enabled) #ข้อสังเกต ว่าใช้ user & passwd จาก MySQL pass jackpass +OK jack has 0 messages (0 octets). +OK jack has 0 messages (0 octets). แสดงให้เห็นว่า สามารถใช้ user และ password ที่อยู่ใน MySQL เช็คเมล์แบบ POP3 ได้แล้ว

ถึงคราวแก้ไข sendmail แล้ว

  • แก้ไขไฟล์ /etc/mail/sendmail.cf  ต้องสร้างไฟล์ sendmail.cf ใหม่ เพื่อให้สนับสนุน virtual user วิธีทำผมมั่ว ๆ เอา ถ้าอยากรู้วิธีทำลองหาอ่านใน FAQ ของ Sendmail ดูแล้วกัน ตอนนี้ดาวน์โหลดจาก ที่นี่ ไปลองดูก่อน อย่าลืมเก็บของเก่าของท่านไว้ได้วย
  • สร้างไฟล์ /etc/mail/virtusertable มีข้อความเช่น
  • @mercury.sra.cat.or.th    root @mercury.sra.cat.or.th คือเมล์เซิฟเวอร์ชื่อ mercury โดเมน sra.cat.or.th จากด้านบน จะเป็นตัวบอกว่า เมล์ที่ส่งไปถึงทุก users ให้ส่งต่อไปยัง root ทั้งหมด NOTE ระหว่าง @mercury.sra.cat.or.th และ root ต้องใช้ <Tab key> ห้ามใช้ space bar ไม่งั้นอาจจะทำงานผิดพลาดได้
  • makemap hash /etc/mail/virtusertable < virtusertable
  • /usr/sbin/sendmail -bd -q15m # สั่งรัน sendmail ถ้าไม่มี error อะไรแสดงว่า sendmail ใช้งานได้แล้ว
  • cd /root
  • สร้างไฟล์ .procmailrc (ต้องมี '.' อยู่หน้าด้วย) มีข้อความดังนี้
  • #Set on when debugging VERBOSE=off MAILDIR=/var/spool/mail PMDIR=$HOME/.procmail LOGFILE=$PMDIR/log INCLUDERC=$PMDIR/rc.mail2user
  • mkdir .procmail
  • cd ./procmail
  • สร้างไฟล์ rc.mail2user มีข้อความดังนี้
  • :0: * ^TOjack jack :0: * ^TOjane jane
  • สร้างไฟล์ว่าง ๆ ไว้เก็บเมล์ของ users : jack และ jane (ถ้าไม่สร้างไว้ procmail ก็จะสร้างให้เอง แต่ root เท่านั้นที่มีสิทธิอ่านและเขียนได้) สร้างไฟล์ว่างเสร็จแล้ว ต้องเปลี่ยนสิทธิให้ ทุกคนอ่านและเขียนได้โดย
  • touch /var/spool/mail/jack touch /var/spool/mail/jane chmod 666 /var/spool/mail/jack chmod 666 /var/spool/mail/jane
  • ทดลองส่งเมล์ไปยัง jack@mercury.sra.cat.or.th (กรณีของผม) ท่านก็ส่งไปยังเมล์เซิฟเวอร์ของท่าน เสร็จแล้วลองใช้ POP3 clients เช็คเมล์ดู เช่นผมใช้ netscape ก็สามารถรับเมล์ของ jack ได้แล้ว
  • ***


Mail + MySQL II


ตอนนี้เป็นตอนที่สอง (นึกว่าจะไม่มีเสียแล้ว) ขอเปลี่ยนแปลงนิดหน่อย คือตอนที่หนึ่ง จะให้ส่งเมล์ทั้งหมดไปที่ root จากนั้นให้ procmail จัดการส่งต่อไปยัง user ที่อยู่ใน MySQL ทีนี้คิดมาคิดไป ไม่รู้ว่าจะทำให้เกิดอันตราย ต่อเมล์เซิฟเวอร์ได้ง่ายหรือไม่ ที่จะให้ root ทำงานเรื่องนี้ (ไม่ทราบจริง ๆ เพราะไม่เก่ง) จึงตัดสินใจเปลี่ยนแปลง จะให้ user  หนึ่ง สมมุติว่าชื่อ mailadmin เป็นคนจัดการส่งเมล์ต่อ ไปยัง users อื่น ๆ แทน

Changes

  • ให้ mailadmin จัดการส่งต่อยัง users อื่น ๆ ใน MySQL แทน root
  • ใช้ PHP3 ช่วยจัดการในการ add new user เข้า MySQL
  • ใช้ PHP3 ในการสร้าง หรือเพิ่มเติม user ในไฟล์ rc.mail2user
  • สรุปแล้ว จะใช้ PHP3 ทำงานต่าง ๆ ให้ครบ แทนที่จะพิมพ์ด้วยมือ

ปัญหา (ที่ยังแก้ไขไม่ได้)

เมล์ฉบับเดียว ไม่สามารถส่งถึง users ได้มากกว่าหนึ่ง user ใน mail server ของเราได้ จะส่งถึง user แรกที่มีชื่ออยู่ในไฟล์ rc.mail2user เท่านั้น เช่นในไฟล์ rc.mail2user มีข้อความดังนี้
       :0:
       * ^TOjack
       jack
       :0:
       * ^TOjane
       jane
และสมมุติว่าท่านส่งเมล์ถึง jack แล้ว cc ถึง jane หรือว่าจะส่งถึง jane แล้ว cc ถึง jack เมล์ฉบับนั้น ๆ จะส่งถึงแค่ jack เท่านั้น เพราะเป็นชื่อที่ถึงก่อน jane โดยมันไม่สนใจว่าคุณจะใช้ To หรือ cc พอเจอชื่อแรก การทำงานของ procmail ก็จะจบลงทันที
  • ขั้นตอนต่าง ๆ ให้อ่านจากเรื่อง mail + mysql ตอนที่หนึ่งประกอบ ด้านล่างจะกล่าวเฉพาะส่วนที่เพิ่มเติม
  • เริ่มต้นด้วยการ adduser ชื่อ mailadmin ขั้นตอนนี้ไม่แนะนำละ ให้ทำกันเอง
  • แก้ไขไฟล์ /etc/mail/virtusertable มีข้อความ
  •        @mercury.sra.cat.or.th    mailadmin      # @your_server.domain.com    mailadmin
  • makemap hash /etc/mail/virtusertable < virtusertable
  • login เข้าระบบด้วย mailadmin
  • สร้างไฟล์ nosuchuser ไว้บอกผู้ส่งเวลาไม่มี user อยู่ที่เซิฟเวอร์เรา มีข้อความดังนี้
  • ---------------------------------------------------------------------- The user you wanted to contact is not present at this system. Please contact postmaster@mercury.sra.cat.or.th for more information. ----------------------------------------------------------------------
  • สร้างไฟล์ .procmailrc  # /home/mailadmin/.procmailrc
  •        #Set on when debugging        VERBOSE=off        MAILDIR=/var/spool/mail        PMDIR=$HOME/.procmail        LOGFILE=$PMDIR/log        INCLUDERC=$PMDIR/rc.mail2user
  • mkdir .procmail
  • chmod 777 .procmail
  • สร้างไฟล์ ~/public_html/mail.conf มีข้อความดังนี้
  • <?php $dbhost         = 'localhost'; $dbname         = 'qpopper'; $dbpassword     = 'mailpass'; $dbusername     = 'qpopper'; $fileuser        = '/home/mailadmin/.procmail/mailuser'; $filefooter        = '/home/mailadmin/.procmail/footer'; $filetouser      = '/home/mailadmin/.procmail/rc.mail2user'; ?>
  • สร้างไฟล์ adduser.php3
  • <html><body> <? require '../public_html/mail.conf'; $open           = mysql_connect($dbhost, $dbusername, $dbpassword); $dbh            = @mysql_select_db($dbname, $open); if($submit) {   $str = ":0 \n* ^TO".$name." \n".$name." \n";   $fp=fopen($fileuser, 'a+');   fwrite($fp,"$str \n");   fclose($fp); if (!copy($fileuser, $filetouser)) {     print ("failed to copy $fileuser...<br>\n");                          }    $fp = fopen($filefooter,"r");    $fp1 = fopen($filetouser, 'a+'); while (!feof($fp)) {  $buffer = fgets($fp, 4096);  fwrite( $fp1, $buffer, strlen($buffer) );  }  fclose($fp);  fclose($fp1);    $fp = fopen("/var/spool/mail/".$name,"w");    $ch = chmod("/var/spool/mail/".$name, 0666);    fclose($fp);         $adusr = mysql_query("insert into popusers values('$name','$password','0','0','/var/spool/mail/')");  $adduser=mysql_query($adusr);  printf("<html><meta http-equiv='refresh' content='1; url=adduser.php3'>"); }  else { print ("<center><h2>Add New Mail User</h2><table border=0>"); print ("<form method=post action=\"$PHP_SELF\">"); print ("<tr><td>User Name</td>"); print ("<td><input type=text name=\"name\"  value=\"\" size=35></td></tr>"); print ("<tr><td>Password</td>"); print ("<td><input type=text name=\"password\" value=\"\" size=25></td></tr>"); print ("</table>"); print ("<input type=submit name=\"submit\" value=\"Add User\">"); print ("<input type=\"reset\" name=\"reset\" value=\"reset\">"); print ("</form></center>"); } ?> </body></html>
  • touch /home/mailadmin/.procmail/mailuser
  • chmod 666 /home/mailadmin/.procmail/mailuser
  • chmod 777 /var/spool/mail # ใช้คำสั่งนี้ต้องเป็น root และผมไม่ทราบว่าการทำแบบนี้ จะเป็นอันตรายต่อเซิฟเวอร์ของท่านหรือไม่ โปรดพิจารณาเอง แต่ถ้าไม่ทำ PHP จะไม่สามารถสร้างไฟล์ สำหรับเก็บเมล์ของ user ที่ท่าน add เข้ามาได้
  • mysql> insert into popusers values('jack','jackpass','1200','0','/var/spool/mail/');
  • Query OK, 1 row affected (0.00 sec) # ต้อง add ด้วยมือหนึ่ง record ก่อน ไม่งั้น script จะไม่ add record ให้
  • touch /var/spool/mail/jack
  • chmod 666 /var/spool/mail/jack
  • cd /home/mailadmin/.procmail
  • ทีนี้เราจะสร้างไฟล์ rc.mail2user ให้มีส่วนที่จะแจ้งให้ผู้ส่งรู้ว่า  ไม่มี user ที่เขาส่งถึง ขั้นตอนเราจะแยกไฟล์เป็นสองไฟล์ ส่วนที่ใช้ add user เข้ามาเรื่อย ๆ กับส่วนท้ายของไฟล์ จากนั้นทุกครั้งที่ add user จะนำสองไฟล์นี้มาต่อกัน ได้เป็นไฟล์ rc.mail2user สร้างไฟล์ชื่อ footer มีข้อความดังนี้
  •          :0
      * ^TOjack jack # ต้องใส่ user ที่เรา add ด้วยมือหนึ่งคนนี้ ลงในไฟล์ footer ด้วย :0 * ^TOroot root # ตรงนี้ยังไม่ได้ลอง เพิ่งนึกได้ว่าควรมี root อยู่ด้วย :0     |(/usr/bin/formail -r -k -X From: -X Subject: -X To:\        -A"X-loop: postmaster@mercury.sra.cat.or.th "| \ # postmaster@yourhost.domain.com          /usr/bin/gawk '{print }\          /^/ && !HEADER \            { system("cat /home/mailadmin/nosuchuser"); \            print"--" ;\            HEADER=1 }' ) |\            /usr/bin/sendmail -t exit
  • restart sendmail
  • bash-2.04# ps -ax|grep sendmail   115 ?        S      0:03 sendmail: accepting connections bash-2.04# kill -HUP 115 เป็นอันจบตอนที่สอง สำหรับเรื่องการจัดการ user ที่มากกว่านี่ ลองเขียน php ดูกันบ้างนะครับ เช่น แสดง user แก้ไข user ลบ user คิดว่าท่านที่ติดตามเรื่องของผมมาตลอด คงจะพอเขียนกันได้ หรือติดขัดตรงไหน ก็สอบถามไปได้ครับ

    ไม่มีความคิดเห็น: