** ยืนยันว่าบทความนี้เวอร์ค 1000% ครับ ส่วนมากที่ทำแล้วมีปัญหาคือ ใจร้อน ข้ามขั้นตอนใดขั้นตอนหนึ่งไป คอนฟิกข้อมูลไม่ครบ หรือไม่ก็ติดปัญหาที่ Firewall บน Elastix **
ในตอนที่ 2 ผมได้พูดถึงเรื่องของการส่ง Fax จากหน้าเว็บเพจ ซึ่งก็เวอร์คดีครับ แต่ก็จะส่งได้เฉพาะไฟล์ pdf, tiff และ txt เท่านั้น ถ้าเรามีไฟล์เอกสารของ Microsoft Office ไฟล์รูปภาพ ถ้าจะส่งทางหน้าเว็บก็ต้องแปลงเป็น pdf ก่อน แต่ด้วยโปรแกรม Winprint HylaFAX นี้เองครับทำให้เราไม่ต้องแปลงเอกสาร โดยเราสามารถกด Print แล้วเลือก Printer เป็นไดร์เวอร์ของ Winprint ได้เลย สะดวกดีเหมือนกัน
มาดูวิธีการทำกันเลยครับ
1. คอนฟิก Virtual Fax บน Elastix
ดูวิธีการคอนฟิก Virtual Fax ในตอนที่ 1 นะครับ ให้คอนฟิก Virtual Fax และ IAX2 Extensions ให้ครบตามจำนวนที่ต้องการ
วิธีการใช้งาน Fax บน Elastix ตอนที่ 1
** เน้นว่าต้องคอนฟิกนะครับ มี 100 users ก็ต้องคอนฟิกเบอร์ IAX2 100 เบอร์ และคอนฟิก Virtual Fax 100 เบอร์เช่นกัน **
2. คอนฟิกการ์ด TDM410P
เฉพาะเมื่อต้องการ Fax ออกไปเบอร์ภายนอกผ่านสายโทรศัพท์
3. ติดตั้งและคอนฟิกโปรแกรม Winprint HylaFAX
ผมจะโฟกัสโปรแกรม Winprint เยอะหน่อยครับ
** จริงๆโปรแกรมสำหรับส่ง Fax จากเครื่อง Windows, Linux, Mac OS X มีเป็นสิบๆโปรแกรมเลยนะครับ ไม่ได้มีแค่ Winprint โปรแกรมเดียว ดูจากเว็บนี้ก็ได้ http://www.hylafax.org/content/Client_Software มีทั้งฟรีและไม่ฟรี **
3.1 ดาวน์โหลด Winprint HylaFAX Reloaded
เวอร์ชั่นใหม่ๆรองรับ Windows 7 ด้วยนะครับ
เช็คเวอร์ชั่นใหม่ๆ เว็บนี้ครับ
- โค้ด: เลือกทั้งหมด
http://sourceforge.net/projects/wphf-reloaded/
เวอร์ชั่น 0.4.1
- โค้ด: เลือกทั้งหมด
http://sourceforge.net/projects/wphf-reloaded/files/0.4.1/
เวอร์ชั่นเก่า
- โค้ด: เลือกทั้งหมด
http://sourceforge.net/projects/wphf-reloaded/files/old%20versions/
3.2 ติดตั้ง Winprint HylaFAX Reloaded 0.4.1
ติดตั้งเหมือนโปรแกรมอื่นๆบน Windows ติดตั้งเสร็จแล้วก็จะมี Printer เพิ่มขึ้นมา ชื่อว่า "HylaFax" ตามรูปครับ ปล่อยไว้ตามค่าดีฟอลท์ ไม่ต้องคอนฟิกอะไรเพิ่มเติม
** รูปตัวอย่างเป็นเวอร์ชั่น 0.3.7 นะครับ คล้ายๆกัน **
3.3 คอนฟิก Windows Firewall (ถ้า On ไว้)
ให้เพิ่มโปรแกรม Winprint HylaFAX เข้าไป
4. คอนฟิก IAX2 Extensions สำหรับให้ Winprint Hylafax ใช้
ต้องคอนฟิกให้ครบตามจำนวนเครื่อง (Client) ที่จะใช้งาน Winprint HylaFAX นะครับ ซึ่งคอนเซ็ปต์ก็คือเราต้องเอา IAX2 Extensions แต่ละเบอร์คอนฟิกใส่เข้าไปในโปรแกรม Winprint HylaFAX แต่ละเครื่อง ไม่อย่างนั้นก็จะแฟ็กซ์ไม่ได้
ผมจะสร้าง IAX2 Extension ขึ้นมาอีก 1 เบอร์สำหรับใช้เทสกับ Winprint ในเครื่องผม ซึ่งเบอร์นี้ต้องไม่ซ้ำกับเบอร์ Extensions อื่นๆที่มีอยู่แล้ว
เมนู "PBX" -> "Extensions" -> "Add Extension" -> เลือก IAX2
คอนฟิกแค่นี้ก็พอครับ ไม่ต้องคลิ๊กเข้าไป Edit ไม่ต้องใส่ Codec แล้วเอา Extension 8500 และ Secret faxnuiz ไปคอนฟิกใน Winprint Hylafax
5. ใส่ IP Address ของ Fax Clients
Fax Clients ก็คือบรรดาเครื่องที่ติดตั้งโปรแกรม Winprint HylaFAX นั่นเองครับ เราต้องเอา IP address ของเครื่องเหล่านี้ใส่เข้าไปในลิสต์ของ Fax Clients ด้วย ไม่อย่างนั้น Elastix มันก็จะ Reject ไม่ยอมรับ Fax วิธีการใส่ก็ไม่ยุ่งยากอะไรครับ ตามนี้
เข้าหน้าเว็บ Elastix -> "Fax" -> "Fax Clients" เพิ่ม IP address เข้าไป ไอพีเครื่องผมคือ 192.168.100.100
มีข้อควรระวังนิดนึงครับตอนที่ใส่ IP address ต้องชัวร์นะครับว่าเป็น IP ของเครื่องเราจริงๆ ยกตัวอย่างเช่น Elastix วางที่โคโล เป็นไอพีจริง แต่เครื่องเราเป็น IP ปลอม ออกเน็ตผ่าน ADSL router ไอพีที่ใส่เข้าไปไม่ใช่ IP ของเครื่องเรานะครับ ต้องใส่ไอพีขา WAN ของ ADSL router
** และถ้า Elastix มี Firewall (เวอร์ชั่นใหม่ๆจะมี Firewall ด้วย) ต้องแน่ใจนะครับว่า ถ้าเปิดใช้งาน Firewall ต้อง Allow IP นี้ด้วย และทุกๆ IP ที่อยู่ใน Fax Clients **
เวลาผมอยากเช็คว่าตอนนี้ออกเน็ตด้วยไอพีจริงอะไร ผมมักจะเข้าเว็บ http://checkip.dyndns.org มันก็จะโชว์ไอพีจริงให้เห็น
ทีนี้ก็อาจจะมีปัญหาอีก ถ้า IP เร้าท์เตอร์เปลี่ยนก็จะส่ง Fax ไม่ได้อีกจนกว่าจะใส่ IP เข้าไปให้ถูก เคสแบบนี้ถ้าจะให้ใช้เน็ตแบบ Fixed IP ก็ดูจะเวอร์เกินไป ผมแนะนำให้ใช้ VPN แทนครับ ดูรายละเอียดวิธีการคอนฟิก VPN ได้จากบทความนี้ครับ เทคนิคการติดตั้ง VPN แบบ PPTPD บน CentOS
6. คอนฟิก Winprint Hylafax
บน Windows คลิ๊ก "Start" -> "Programs" -> "Winprint HylaFAX Reloaded" -> "Winprint HylaFAX GUI"
ครั้งแรกจะเห็นข้อความแบบนี้ คลิ๊ก "Yes"
คอนฟิกค่าต่างๆดังนี้
HylaFAX server address ใส่ไอพีแอดเดรสของ Elastix
Username ใส่ 8500
Password ใส่ faxnuiz
Defaylt notify ใส่ Email address ที่จะใช้รับข้อความ Error/Success โดยข้อความที่โชว์ Success จะมีไฟล์ Fax แนบไปด้วยนะครับ เป็นไฟล์ pdf
ที่เหลือปล่อยไว้ตามเดิม
คลิ๊ก "OK" ก็จะได้หน้าจอแบบนี้ พร้อมส่ง Fax แล้ว
ตอนนี้โปรแกรม Winprint HylaFAX จะยังไม่ส่ง Register มาที่ Elastix นะครับ คอนฟิกไว้เฉยๆ
7. เทสส่ง Fax จากโปรแกรม Winprint
ตอนจะ Fax เลือกทำได้ 2 วิธีครับ คือ
วิธีที่ 1: เปิดโปรแกรม Winprint HylaFAX GUI ก่อน แล้ว Add ไฟล์เอกสารเข้าไป ดูตามรูปเลยครับ ใส่เบอร์ Fax ปลายทาง เวลาใส่เบอร์ Fax ต้องใส่ให้ถูกต้องนะครับ เช่นถ้าต้องมี 9 นำหน้าก็ต้องใส่ไม่งั้นจะโทรไม่ออก
*** วิธีนี้สามารถส่งได้หลายไฟล์พร้อมๆกัน ***
วิธีที่ 2: เปิดโปรแกรมทำเอกสารก่อน เวลาจะ Print ก็เลือก Printer เป็น HylaFAX ก็จะมีหน้าจอของ Winprint HylaFAX โผล่ขึ้นมา ใส่เบอร์ Fax ปลายทาง เวลาใส่เบอร์ Fax ต้องใส่ให้ถูกต้องนะครับ เช่นถ้าต้องมี 9 นำหน้าก็ต้องใส่ ไม่งั้นจะโทรไม่ออก
8. ข้อความบนหน้าจอ Asterisk Console ขณะส่ง Fax
หลังจากกดส่ง Fax แล้ว รอประมาณ 5 วินาทีก็จะมีข้อความบน Asterisk Console คล้ายๆแบบนี้ครับ
- โค้ด: เลือกทั้งหมด
[Feb 22 17:50:10] -- Accepting AUTHENTICATED call from 127.0.0.1:
> requested format = slin,
> requested prefs = (),
> actual format = ulaw,
> host prefs = (ulaw|alaw|gsm),
> priority = mine
[Feb 22 17:50:10] -- Executing [9023456789@from-internal:1] Macro("IAX2/8000-6744", "user-callerid,SKIPTTL,") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:1] ExecIf("IAX2/8000-6744", "0]?Set(CALLERID(number)=08000)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:2] ExecIf("IAX2/8000-6744", "0]?Set(CALLERID(number)=08000)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:3] ExecIf("IAX2/8000-6744", "0?Set(CALLERID(number)=0)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:4] Set("IAX2/8000-6744", "AMPUSER=8000") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:5] GotoIf("IAX2/8000-6744", "0?report") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:6] ExecIf("IAX2/8000-6744", "0?Set(REALCALLERIDNUM=8000)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:7] Set("IAX2/8000-6744", "AMPUSER=8000") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:8] Set("IAX2/8000-6744", "AMPUSERCIDNAME=Fax Marketing") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:9] GotoIf("IAX2/8000-6744", "0?report") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:10] Set("IAX2/8000-6744", "AMPUSERCID=8000") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:11] Set("IAX2/8000-6744", "CALLERID(all)="Fax Marketing" <8000>") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:12] ExecIf("IAX2/8000-6744", "0?Set(CHANNEL(language)=)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:13] GotoIf("IAX2/8000-6744", "1?continue") in new stack
[Feb 22 17:50:10] -- Goto (macro-user-callerid,s,22)
[Feb 22 17:50:10] -- Executing [s@macro-user-callerid:22] NoOp("IAX2/8000-6744", "Using CallerID "Fax Marketing" <8000>") in new stack
[Feb 22 17:50:10] -- Executing [9023456789@from-internal:2] Set("IAX2/8000-6744", "_NODEST=") in new stack
[Feb 22 17:50:10] -- Executing [9023456789@from-internal:3] Macro("IAX2/8000-6744", "record-enable,8000,OUT,") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-record-enable:1] GotoIf("IAX2/8000-6744", "1?check") in new stack
[Feb 22 17:50:10] -- Goto (macro-record-enable,s,4)
[Feb 22 17:50:10] -- Executing [s@macro-record-enable:4] ExecIf("IAX2/8000-6744", "0?MacroExit()") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-record-enable:5] GotoIf("IAX2/8000-6744", "0?Group:OUT") in new stack
[Feb 22 17:50:10] -- Goto (macro-record-enable,s,15)
[Feb 22 17:50:10] -- Executing [s@macro-record-enable:15] GotoIf("IAX2/8000-6744", "0?IN") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-record-enable:16] ExecIf("IAX2/8000-6744", "1?MacroExit()") in new stack
[Feb 22 17:50:10] -- Executing [9023456789@from-internal:4] Macro("IAX2/8000-6744", "dialout-trunk,3,023456789,,") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:1] Set("IAX2/8000-6744", "DIAL_TRUNK=3") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:2] GosubIf("IAX2/8000-6744", "0?sub-pincheck,s,1") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:3] GotoIf("IAX2/8000-6744", "0?disabletrunk,1") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:4] Set("IAX2/8000-6744", "DIAL_NUMBER=023456789") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:5] Set("IAX2/8000-6744", "DIAL_TRUNK_OPTIONS=tr") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:6] Set("IAX2/8000-6744", "OUTBOUND_GROUP=OUT_3") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:7] GotoIf("IAX2/8000-6744", "0?nomax") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:8] GotoIf("IAX2/8000-6744", "0?chanfull") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:9] GotoIf("IAX2/8000-6744", "0?skipoutcid") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:10] Set("IAX2/8000-6744", "DIAL_TRUNK_OPTIONS=") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:11] Macro("IAX2/8000-6744", "outbound-callerid,3") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:1] ExecIf("IAX2/8000-6744", "0?Set(CALLERPRES()=)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:2] ExecIf("IAX2/8000-6744", "0?Set(REALCALLERIDNUM=8000)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:3] GotoIf("IAX2/8000-6744", "1?normcid") in new stack
[Feb 22 17:50:10] -- Goto (macro-outbound-callerid,s,6)
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:6] Set("IAX2/8000-6744", "USEROUTCID="Marketing Dept" <8000>") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:7] Set("IAX2/8000-6744", "EMERGENCYCID=") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:8] Set("IAX2/8000-6744", "TRUNKOUTCID=") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:9] GotoIf("IAX2/8000-6744", "1?trunkcid") in new stack
[Feb 22 17:50:10] -- Goto (macro-outbound-callerid,s,12)
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:12] ExecIf("IAX2/8000-6744", "0?Set(CALLERID(all)=)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:13] ExecIf("IAX2/8000-6744", "1?Set(CALLERID(all)=Marketing Dept <8000>)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:14] ExecIf("IAX2/8000-6744", "0?Set(CALLERID(all)=)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-outbound-callerid:15] ExecIf("IAX2/8000-6744", "0?Set(CALLERPRES()=prohib_passed_screen)") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:12] ExecIf("IAX2/8000-6744", "1?AGI(fixlocalprefix)") in new stack
[Feb 22 17:50:10] -- Launched AGI Script /var/lib/asterisk/agi-bin/fixlocalprefix
[Feb 22 17:50:10] == fixlocalprefix: Dialpattern +X. matched. 023456789 -> 023456789
[Feb 22 17:50:10] -- <IAX2/8000-6744>AGI Script fixlocalprefix completed, returning 0
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:13] Set("IAX2/8000-6744", "OUTNUM=023456789") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:14] Set("IAX2/8000-6744", "custom=DAHDI/g0") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:15] ExecIf("IAX2/8000-6744", "0?Set(DIAL_TRUNK_OPTIONS=M(setmusic^))") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:16] Macro("IAX2/8000-6744", "dialout-trunk-predial-hook,") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk-predial-hook:1] MacroExit("IAX2/8000-6744", "") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:17] GotoIf("IAX2/8000-6744", "0?bypass,1") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:18] GotoIf("IAX2/8000-6744", "0?customtrunk") in new stack
[Feb 22 17:50:10] -- Executing [s@macro-dialout-trunk:19] Dial("IAX2/8000-6744", "DAHDI/g0/023456789,300,") in new stack
[Feb 22 17:50:10] -- Called g0/023456789
[Feb 22 17:50:17] -- DAHDI/4-1 answered IAX2/8000-6744
[Feb 22 17:51:13] -- Executing [h@macro-dialout-trunk:1] Macro("IAX2/8000-6744", "hangupcall,") in new stack
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:1] GotoIf("IAX2/8000-6744", "1?noautomon") in new stack
[Feb 22 17:51:13] -- Goto (macro-hangupcall,s,3)
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:3] NoOp("IAX2/8000-6744", "TOUCH_MONITOR_OUTPUT=") in new stack
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:4] GotoIf("IAX2/8000-6744", "1?noautomon2") in new stack
[Feb 22 17:51:13] -- Goto (macro-hangupcall,s,6)
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:6] NoOp("IAX2/8000-6744", "MONITOR_FILENAME=") in new stack
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:7] GotoIf("IAX2/8000-6744", "1?skiprg") in new stack
[Feb 22 17:51:13] -- Goto (macro-hangupcall,s,10)
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:10] GotoIf("IAX2/8000-6744", "1?skipblkvm") in new stack
[Feb 22 17:51:13] -- Goto (macro-hangupcall,s,13)
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:13] GotoIf("IAX2/8000-6744", "1?theend") in new stack
[Feb 22 17:51:13] -- Goto (macro-hangupcall,s,15)
[Feb 22 17:51:13] -- Executing [s@macro-hangupcall:15] Hangup("IAX2/8000-6744", "") in new stack
[Feb 22 17:51:13] == Spawn extension (macro-hangupcall, s, 15) exited non-zero on 'IAX2/8000-6744' in macro 'hangupcall'
[Feb 22 17:51:13] -- Hungup 'DAHDI/4-1'
[Feb 22 17:51:13] == Spawn extension (macro-dialout-trunk, s, 19) exited non-zero on 'IAX2/8000-6744' in macro 'dialout-trunk'
[Feb 22 17:51:13] == Spawn extension (from-internal, 9023456789, 4) exited non-zero on 'IAX2/8000-6744'
[Feb 22 17:51:13] -- Hungup 'IAX2/8000-6744'
6. ผลลัพธ์
ผมแสกนแฟ็กซ์ที่ได้รับทางเครื่อง Fax มาให้ดูครับ
เพิ่มเติม...
เวลาเราส่ง Fax แต่ละครั้ง Elastix จะเลือกใช้ Virtual Fax แบบสุ่มๆ ซึ่งที่ผมเจอก็คือตรงหัว Fax มันจะเปลี่ยนชื่อไปเรื่อยๆตามค่าที่เราคอนฟิกไว้ในแต่ละ Virtual Fax ครับ
เป็นอันว่าก็สามารถส่ง Fax ด้วยโปรแกรม Winprint HylaFAX ได้สำเร็จครับ หวังว่าบทความนี้จะมีประโยชน์บ้างนะครับ
บทความที่เกี่ยวข้อง
เทคนิคการรับส่ง Fax ด้วย Elastix ตอนที่ 1 - ส่ง Fax จาก PSTN -> Elastix -> Email
เทคนิคการรับส่ง Fax ด้วย Elastix ตอนที่ 2 - ส่ง Fax ทางเว็บ
เทคนิคการรับส่ง Fax ด้วย Elastix ตอนที่ 3 - ส่ง Fax ทางอีเมล์ (Email to Fax)
เทคนิคการติดตั้งการ์ด X100P
เทคนิคการติดตั้งการ์ด TDM410P บน Elastix
เทคนิคการติดตั้งการ์ด TDM400P
เทคนิคการคอนฟิกพอร์ต FXO ของการ์ด TDM410P