分享

运行HylaFAX传真服务器

 昵称6656145 2013-05-13
1. HylaFAX传真服务器简介

  介绍HylaFAX传真服务器,先得说说传真的来龙去脉。

  传真标准Group 1标准在很久以前被开发出来,当时的速度是6分钟/页。70年代末,应用了压缩技术的Group 2标准使传输时间减半,为3分钟/页左右。Group 3标准于八十年代通过,速度有了进一步提高,达到1分钟/页以内。我们日常所说的传真通常就是指它,简称G3传真。后来还有Group 4标准,即所谓G4传真,主要适合可靠传输媒介,例如数字化的ISDN线路。ADSL大行其道之前,中国电信力推的"高速"连接ISDN,其中一个卖点就是G4传真能力。可惜G4传真生不逢时,和电子邮件系统相较完全没有吸引力,加上G4传真机较贵,因此从来就没有得到过广泛的应用。

  用于G3传真的调制解调器又有class 1、class 2、class 2.0之分。class 1标准比较简陋,大部分工作都由电脑系统上的软件完成。class 2标准接手了以前由CPU承担的大部分工作,在class 1的基础上增加了四十多条新命令。和往常一样,标准化的过程十分漫长,厂商和用户都不想继续等待,因此根据1991年的一份草案推出了产品。这些调制解调器一般称为class 2调制解调器,为便于区分,在标准发布以后生产的严格符合官方标准的调制解调器被称为class 2.0调制解调器。在这之后,陆续还有class 3和class 4标准推出,只是时过境迁,已经乏人问津了。

  HylaFAX即是一款支持G3标准的传真软件。前身是SGI的Sam Leffler在八十年代末期为公司编制的传真软件。后来SGI同意Sam将该软件贡献出来,放到网上供更多的人免费使用。早期的软件称为FlexFAX,后来发现和已有的商标相冲突,才改用现名。它是已有的开放源码传真软件之一――依我之见,是最好的一个。

  HylaFAX功能强大,应用灵活,运行稳定,管理方便,即使与商业传真软件相比,也毫不逊色。它有诸多特性:

  1)不同的用户从不同的电脑使用不同的操作系统接收/发送传真。
  2)将收到的传真email给用户
  3)使用电子邮件提交传真。
  4)记录和归档传真
  5)使用多条线路,传送海量传真
  6)自动打印收到的传真
  7)访问控制

  HylaFAX传真服务器能力很强。有用户报告说在一部Pentium Pro 200机器上使用30个调制解调器,每天可以毫无问题地接收 6000-7000页传真。发送记录则是Matthias Reich创下的:他在10部Solaris 2.4上运行HylaFAX 4.0pl2,每日发送多达10,000页传真。

  2.HylaFAX如何工作?

  正如邮件传输代理(MTA)软件从客户端接收电子邮件并发送到正确的电子邮件地址,HylaFAX传真服务器软件从客户端接收传真并发送到正确的传真号码。主要的进程有三种:后台守护进程 hfaxd监听 4559 端口、队列调度进程faxq和终端处理进程faxgetty。基本上,hfaxd精通HylaFAX的传真协议,负责服务器同客户端的通信,将需要发送的传真放入适当的队列当中;faxgetty则负责实际的传送工作――与端口、调制解调器、传真机什么的打交道;而faxq则坐镇中枢,掌管着繁忙的传真队列。三者互相配合、密切合作,在一些辅助程序的帮助下完成各种传真事务。

   请看下图:



图一

  绝大多数情况下,我们通过启动脚本在系统启动时运行hfaxd,如果你的系统负载很轻,也可以利用inetd/xinetd来做这件差使,只是我看不出来有多大裨益罢了。当收到客户机的联接请求时,hfaxd会foke出一个子进程加以处理;faxgetty有所不同,每个faxgetty进程都和系统中的调制解调器一一对应,和其它终端守护进程如mgetty相似,由init在系统初始化时启动。faxgetty是个友好的进程,能够识别数据、语音和传真信号。如果发现拨入的是数据/语音信号而不是期待中的传真信号,它会将处理权转交给适当的处理程序,因此你可以毫无问题地使用同一根电话线执行其它任务。

3.安装和配置

  在着手安装之前,我们需要有所准备。

  1) 这里谈论的是运行在RedHat Linux 8.0上的HylaFAX 4.1.2。好吧,HylaFAX的最新版本是HylaFAX 4.1.5,不过我的经验主要是在HylaFAX 4.0/4.1.2上,而我的原则是不随便谈论不懂的东西,特别是公开场合:)
  2) 确保modem安装正常。通常我们使用终端仿真程序连接到调制解调器,来测试它与电脑之间联接的正确性,比如说cu,

  [/root ] cu -l ttyS1
  Connected
  at+fclass=?
  0,1,8
  OK
  ~[athlon].
  Disconnected

  只要调制解调器能够给出合理的回应,就表示联接正常。响应0,1,8表示我目前使用的调制解调器支持数据、class 1传真和语音功能。

  另外,我们需要清楚地知道调制解调器的生产厂家、具体型号和固件(firmware)版本,出现问题的时候很有用处。记住,在邮件列表上提出问题的时候固件版本很重要!

  3) Postscript和libtiff,
  libtiff不必说,TIFF,更确切的说TIFF/F,是传真使用的标准格式,Postscript则是客户端和服务器较换数据的通用语言。这两个软件包不是万能,但没有则万万不能,所以在这里特别指出,安装时不要漏掉。

  4) 硬盘空间分配
  HylaFAX的主要程序文件分布 /var/spool/hylafax。所有收到的传真被存放到/var/spool/hylafax/recvq,对应的,所有已发送的传真被存放到/var/spool/hylafax/doneq。在安装操作系统的时候,我们就必须考虑到这一点,在/var分区为HylaFAX保留足够的空间以保存所有的传真。因为/var的空间被系统和众多程序所使用,这给HylaFAX带来了某些不明朗因素,因此,如果你决定在/var/spool/hylafax为HylaFAX挂载一个独占的分区,我也不会感到吃惊。

  使用源代码安装

  和其他开源软件相似,展开从 www.hylafax.org 下载的源代码包hylafax-4.1.2.tar.gz,保存到/tmp目录,然后展开,
  tar -zxvf hylafax-x.x.x.tar.gz

  展开后的源码被保存到一个新的目录hylafax-x.x.x下.进入源代码目录, 
  cd hylafax-x.x.x

  不要急于安装,先阅读README以及相关说明文档。然后运行
  ./configure 

  命令,稍等一会儿。熟悉GUN autoconf 和 automake的读者都知道,用户安装软件的默认的位置在/usr/local。习惯上我们通过指定configure的参数来改变安装位置,比如说,我们想要安装到/usr目录,则使用命令 
  ./configurer --prefix=/usr

  不过Hylafax稍有不同,它的configurator并不是用autoconf和automake生成,而是手工编写的,并不识别这些参数,而是使用了稍微不同的方法。如果你是坐在电脑旁边,手里拿着文章照做的话,现在显示器屏幕上可能已经出现了以下提示

  HylaFAX configuration parameters (part 1 of 2) are:
  [ 1] Directory for applications: /usr/local/bin
  [ 2] Directory for lib data files: /usr/local/lib/fax
  [ 3] Directory for lib executables: /usr/local/sbin
  [ 4] Directory for system apps: /usr/local/sbin
  [ 5] Directory for manual pages: /usr/local/man
  [ 6] Directory for HTML documentation: /var/httpd/htdocs/hylafax
  [ 7] Directory for spooling: /var/spool/hylafax
  [ 8] Directory for uucp lock files: /var/lock/uucp
  [ 9] Uucp lock file scheme: ascii
  [10] PostScript imager package: gs
  [11] PostScript imager program: /usr/bin/gs
  [12] Manual page installation scheme: bsd-source-cat
  [13] Default page size: North American Letter
  [14] Default vertical res (lpi): 98
  Are these OK [yes]?

  你可以在这里为hylafax指定不同的路径。在中国大陆,最常使用的标准传真纸张尺寸是ISO A4,因此我们需要回答no并将 North American Letter改为需要的ISO A4,为此你可以输入ISO A4或者,简单些,A4。第[14]项Default vertical res由Group 3标准定义(即常说的G3传真),有两个选择:普通分辨率的98或良好分辨率196,目前默认的垂直分辨率是98 lpi。根据我的个人经验,较低的98 lpi感觉已经相当不错,不过,也许你希望修改它到 196 以获得更好的传真效果,当然,传真时间也会相应增长。顺带说一句,lpi是英制单位 line per inch的缩写,所以98 lpi大致相当于公制 4 线/毫米,而196 lpi约为公制7线/毫米。
既然是(part 1 of 2),自然跟着(part 2 of 2):

  HylaFAX configuration parameters (part 2 of 2) are:

  [15] Location of getty program: /sbin/agetty
  [16] Location of voice getty program: /sbin/vgetty
  [17] Location of sendmail program: /usr/sbin/sendmail
  [18] Location of TIFF tools: /usr/bin
  [19] Location of SysV init scripts: /etc/rc.d/init.d
  [20] Location of SysV start scripts: ../rc2.d ../rc3.d ../rc4.d ../rc5.d
  [21] Location of SysV stop scripts: ../rc0.d ../rc1.d ../rc6.d
  [22] Name of SysV start script: S97hylafax
  [23] Name of SysV stop script: K05hylafax
  [24] Init script starts faxq: yes
  [25] Init script starts hfaxd yes
  [26] Start old protocol: no
  [27] Start paging protocol: no
  Are these OK [yes]?

  这里的默认设置相当妥当,不过我个人更喜欢start scripts和stop scripts的数字之和为100,所以总是修改stop scripts为 K03hylafax。如果使用其它的MTA而不是sendmail,情况有点棘手。简单来说,HylaFAX使用sendmail命令行发送邮件,所以若你的MTA可以成功地伪装sendmail并识别aliases 文件的话,一般是没有问题的――我的HylaFAX服务器就在运行Postfix,一切正常。

  然后执行 make 命令编译系统,
  [/] make

  编译期间会有些警告信息,抱怨说使用了过时的函数调用――有点讨厌,但不碍事。完成后执行
  [/] make install

  安装HylaFAX到指定位置。

  安装完成后会自动调用 faxsetup 设置运行环境相关的系统参数,此后配置改变的话,你也可以单独执行这个命令重新配置你的系统。

  faxsetup依次向我们提出常规问题,比如国家代码(Country Code)、区码(Area Code)、长途拨号前缀(Long dialing prefix[1])、往日志写入ServerTracing消息时使用的名称(Syslog facility name for ServerTracing messing[daemon]) 等等。

  这些设定需要根据各人自身的情况设置,不可从一而论。有时配置脚本认死理,你必须迁就它,完成后手动修改配置文件即可。有时候我们会碰到点例外小状况,比如我设置香港分公司的传真服务器时,发现中国香港特别行政区只有国家代码而没有区码,这时你就要灵活处理。根据我的经验,一般可以使用默认值。

  faxsetup运行完毕后,情况有点小变化,

  添加了新用户fax,
  /etc/services 下添加了 hylafax 的端口号 4557/4559,
  [/ ] grep fax /etc/services
  fax 4557/tcp # FAX transmission service (old)
  hylafax 4559/tcp # HylaFAX client-server protocol (new)
  /etc/aliases 中添加了 
  grep FaxMaster /etc/aliases

  这里faxsetup会自动运行newalises更新别名数据库。

  已经够乱的了,不过我们还要手动在 /etc/inittab 里加上一点小把戏

  [/] grep fax /etc/inittab
  # HylaFAX faxgetty
  f0:2345:respawn:/usr/local/sbin/faxgetty ttyS0

这会确保init运行后自动启动faxgetty。init也会监控faxgetty并在必要的时候重新启动它。

  完成后faxsetup自动运行faxaddmodem设置系统中的调制解调器。

  faxaddmodem首先检测系统中的调制解调器,自动探测该调制解调器的能力,这时调制解调器的CS/TR灯会亮起。如果faxaddmodem不能正确识别你的调制解调器,它不得不询问一些有关通信的技术细节,诸如支持的AT命令,时间延迟等等使人不知所措的问题。好在faxaddmodem会从一个一般性的配置开始,因此如果你没有使用AT命令拨号的经验又不是一位串口通信行家的话,尽管使用你的Enter键好了,默认配置几乎总能正常运转。

  调制解调器配置完毕后系统几乎可以运行了。若你的默认安装位置是/usr/local,还有一点小工作必须完成:
  在 /etc/ld.so.conf 的末尾加上一行
  /usr/local/lib

  然后运行ldconfig使更动生效。否则会提示找不到库文件,拒绝运行。
  输入命令
  [/] kill -HUP 1 

  让init重新读取配置文件 /etc/inittab 并启动 faxgetty。瞄瞄你的调制解调器的CS/TR灯,它现在应该亮。

  输入命令
  [/] /etc/init.d/hylafax start
  HylaFAX: faxq hfaxd (without old protocol & without SNPP support).
  来运行hfaxd和faxq。

  现在可以看看HylaFAX的状态
  [/] faxstat
  HylaFAX scheduler on athlon.setiatchina.org: Running
  Modem ttyS0 (020-12345678): Running and idle

  OK! 现在你的传真服务器已经在运转了!让我们来发送本服务器的第一份传真。创建一个新文件
  [/] echo "Hello! This is my first facsimile. Thanks" > /tmp/testfax
  sendfax -n -d /tmp/testfax

  参数 -n告诉sendfax不要使用封面页。只见调制解调器上的LED灯一阵狂闪,看看这时传真服务器的状态
  [/] faxstat
  HylaFAX scheduler on athlon.setiatchina.org: Sending
  Modem ttyS0 (020-12345678): Running and idle

  给它一点时间,凝神倾听那"嘀嘀嘟嘟"的拨号音,难道你不觉得很有成就感吗?当一切安静下来的时候,传送完成。

  最后,不要忘了清除临时文件
  [/] rm -rf /tmp/hylafax-4.1.2 hylafax-4.1.2.tar.gz

  4.进一步的配置

  1)JobFmt
  当运行faxstat查看传真队列状态的时候,典型的输入如下
  HylaFAX scheduler on athlon.setiatchina.org: Running
  Modem ttyS0 (020-12345678): Running and idle
  JID Pri S Owner Number Pages Dials TTS Status
  5 127 R root 11223344 0:1 0:3

  它使用的就是默认的格式,

  JobFmt: "%-3j %3i %1a %6.6o %-12.12e %5P %5D %7z %.25s"

  你可以在/usr/lib/fax/hfaxd.conf中设置新的格式,以便更符合你的需要。特别是第4列Job owner定为%6.6o,对于Alexander这样的英文名字显然太少了;我通常还要加长第5列(Public (external) format of dialstring)%-12.12e到%-16.16e,因为这样才能容下9,00852,12345678这样的国际长途直拨电话号码。
hfaxd.conf

  因为这个设置可以在HylaFAX协议中使用JobFmt原语调整,所以有时仅在传真服务器上设定是不够的。例如,前面介绍的whfc客户端使用服务器上默认的JobFmt格式,结果你不得不在所有用户的电脑上修改设置。

  2)Kill Time / MaxDial /MaxTries
  发送失败的传真,根据错误的严重程度,被区别对待:有些只是小问题,比如对方占线,当然只需等一会儿重新发送就好了;也可能拨叫的传真号码根本不存在或者另一端根本不是传真设备――用户输入了错误的号码――这个问题不能被任何软件解决,因此立即被停止发送并传回错误消息。

  有时传真在队列中会停留很久,比方说对方不巧电话没有放好导致总是忙音,这会占用系统资源。HylaFAX使用MaxTries、MaxDial、KillTime三道防线来防止此类无效的资源占用。

  前面提到过,当两个传真系统通过电话网联接上并建立虚链路以后,要执行握手程序,以便协商某些细节问题,比如传真速度、压缩方式等,只有双方达成一致后才开始正式传送数据。在这个过程中如果出现某些问题,比如电话线路出现干扰,就可能需要"retry"一下。如果"retry"的次数太多,超过了上限MaxTries(默认是12次),HylaFAX将停止本次会话(但不会停止传送)。

  MaxDial则用于为一份传真拨叫特定传真号码的最大次数,默认也是12次。也就是说,比如连续十二次都碰到忙音的话,HylaFAX会想,很可能是对方的电话没有放好吧,这可没办法了,只好停止传送。但是有些公司很节约(或者是申请不到足够的电话线),使用三合一甚至四合一机器,传真、电话、复印甚至打印都在同一部机器上,高峰时可能会很难打进去。这种情况下,你必须指定更大的MaxDial值以避免用户重传。

  HylaFAX传真服务器每次拨叫失败后会等待更长的时间再重试。具体的等待时间由KillTimeMap指定,默认为5 5 5 15 60 240 720 1440 1440 1440 1440 1440,单位是分钟。即第1、2、3次失败后等待5分钟,第4次等待15分钟,第五次等待60分钟,以此类推。

  如果你在它等待期间修正了错误,可以使用命令
  [/] faxalter -p JOBID
  或者
  [/] faxalter -a now JOBID
  --两者等价--立即发送队列中任务号为JOBID的传真。

KillTime则是最后的雷霆手段,默认是3小时。午时三刻一到,任何在队列中停留超过KillTime的传真将被认为不可送达而立即终止。

  MaxDial和KillTime这两个限制条件只要触发了任意一个即会导致任务终止,传真归于失败。

  3)运行在程控电话交换机后的传真服务器 
  有时候我们需要在程控电话交换机后运行HylaFAX服务器,在拨叫外线之前,往往需要先拨一个前缀号码,通常是"9"。我们当然可以在客户端的地址簿上为每个联系人的传真号码前加上一个9,不过还有更好更简单的方法。通过修改调制解调器配置文件config.ttySx中的拨号设定
  #ModemDialCmd: ATDT%s # T for tone dialing
  为
  #ModemDialCmd: ATD9T%s # T for tone dialing
  此调制解调器在拨叫任何号码前都会自动添加前缀"9",同时用户对此一无所知――这符合面向对象的信息隐蔽原则:)获得的好处是,如果有一天我们想把这部服务器移到程控电话交换机之前,只须花上5秒钟修改服务器配置文件的一行而不是所有用户的所有数据。

  4)调制解调器组
  默认情况下faxgetty为任务分配当前可用的任何调制解调器,但HylaFAX也提供由指定调制解调器/调制解调器组发送的功能。我们可以将多个调制解调器分配到一个组中,方法是在调制解调器配置文件/usr/local/lib/fax/config.ttySx中指定一个或多个ModemGroup参数,其值为正则表达式。当指定调制解调器组发送时,faxgetty会在匹配的调制解调器中为任务分配调制解调器。

  我使用这个功能保留一个调制解调器专用于接收传真,而发送全部通过SENDER组中的调制解调器进行。

  5.我应该使用什么样的调制解调器?

  你能够买到的最贵的那种--我很想这样回答。遗憾的是,生活总是不那么简单。这里的要点在于,HylaFAX服务器和传真设备之间的通信是通过AT命令集完成的。理论上说,能够理解AT命令的传真设备都是可以的和HylaFAX一起运行的。但在实际生活当中,明智的方法是只购买经过验证的产品。因此请检查www.hylafax.org的HCL(Hardware Compatibility List),看看是否能够买到上面列出的产品。

  现在国内调制解调器市场上山头林立,不禁使人缅怀当年Hayes公司风光一时的日子。那时该公司垄断了调制解调器市场,你只须到市场上要求购买一个Hayes牌传真调制解调器即可确保软件可以很好地识别、支持它。
除了必须支持AT命令外,我们主要关心调制解调器的接口类型。常见类型包括

  1)外置串行调制解调器
  这一类调制解调器历史悠久,从2400 bps一路行来,普通常见,因此支持最好,不失为最稳妥的选择,而且可保证不会有WinModem这类鱼目混珠的坏分子掺杂其中。这里有个限制,就是一般AT体系结构机器只有两个串行接口可用。如果你已经有一部UPS的监控电缆接在COM2上,就只剩下唯一的一个接口了。
适用于1-2根线路的传真系统。

  2)内置ISA硬件调制解调器
  老骥伏枥,志在千里,虽然速度低了点,ISA总线用于传真还是绰绰有余的。具体的用法就和内置PCI硬件调制解调器差不多,只是由于IRQ的缘故,仅适用于1-2根线路的传真系统。 

  3)内置PCI硬件调制解调器
  这一类也不错,而且不会额外占用地方,也没有各种连线一大堆,机架会很清爽,PCI总线的自配置特性对于防止资源分配错误有很大的帮助。只是它一般只有唯一一个位于板卡挡片上的LED指示灯,对查错没有什么贡献。系统的最大规模取决于系统的PCI插槽数目,一般在六个以下。

  4)外置USB调制解调器
  目前相当流行的调制解调器接口形式,据说工作得不错,能够同时支持很多的线路。注意USB电缆比较容易滑落。

  5)内置多端口卡/调制解调器
  很贵,但是,如果你需要支持更多的线路,这可能是唯一的途径。例如Moxa公司Intelligent系列的 C320Turbo/PCI高密度串行接口卡,提供有Linux版本的驱动程序,每片卡支持的端口总数从基本配置1 UART模块 8端口到4 UART模块级联32端口,同一部机器上可安装达惊人的四片共128端口之多!高档板卡上通常集成有CPU和缓存,自身有一定处理能力,对主机CPU的要求不高。
  多端口调制解调器进一步将传真功能集成到板卡上,不必象多端口卡那样外接调制解调器,不过端口密度一般不如多端口卡。

  6)ISDN和其它高带宽数字调制解调器

  ISDN有专用的传真协议:Group 4,即所谓G4传真。G4传真速度较快,图像分辨率也高,但并没有得到广泛应用。通过语音类型的呼叫,运行在ISDN上的G4传真设备可以同Group 3传真设备通信,但其速度被降低到G3的水平。个人认为没有这个必要。

  有了一堆串口之后,你可能需要使用setserial命令(或者厂商提供的工具程序)来设置串行口参数,其范围之广泛,从速率、奇偶校验到UART类型无所不包。需要说明的是,内置PCI/ISA调制解调器中有一类恶名在外的WinModem,一般称之为软调制解调器/软猫的,需要设备驱动程序配合实现部分功能,因而大多数只能在Windows下工作,罕见的几种可以在Linux或其它Unix系统中工作的也强差人意而已。因此,忠告是:避之则吉。

  另外随着ADSL的大范围普及,有一个常见的疑问,在ADSL线路上运行传真服务可以吗?答案是可以,只要是按照ADSL的安装要求连接在信号分离器后面。

  有时候,某些调制解调器的行为很奇怪。例如我现下用来上网兼传真的调制解调器,Acer出品,支持class 1传真。它能够响应AT命令,但是有时并不象我们期望的那样。例如,正常的ATI0命令会报告产品代码,但这个调制解调器对ATI0命令的返回代码很奇怪:"57600 - DSP PATCH:001.65"。后来发现它与众不同地使用ATI9报告产品代码"Acer Modem 56 Surf"!你知道,大公司都有不遵循标准的癖好,对此我们早已见怪不怪了--好在发送传真倒是没有大问题。稳妥起见,对待此类坏孩子最好小心些--不兼容就是这样造成的。

  class 1、class 2还是class 2.0?

  class 1调制解调器比较便宜,但它有两个缺陷。如前所述,class 1调制解调器将大部分工作推给CPU做,这就要求:

  a)电脑系统必须及时处理串口上源源而来的数据,大的串口延迟将导致数据丢失。
  b)实时系统响应。出于同样的理由,系统调度算法必须保证HylaFAX能够不受干扰地获得CPU时间片。这个问题在Linux系统中通常采用临时提高HylaFAX服务器进程优先级的方法加以解决,但此路在有些系统上行不通。

  所以,class 1调制解调器较适合小规模系统。 

  class 2调制解调器对实时性的要求不太严格,但它也有弱点,那就是不兼容性。同为class 2调制解调器,可能一个一切正常,另一个则总是莫名其妙地中断传输过程,必须借助特别的设定。

  所以,请尽可能使用class 2.0调制解调器。当然,也不必过于担心,这只是理论情形而已。我为公司运行的传真服务器用的就是两个废弃的class 1杂牌调制解调器,取其价廉,迄今为止发送6447份/接收12173份的传真,没见有什么问题――毕竟极端的运行条件是少数。

  提醒你一下,个别情况中调制解调器声称支持较高的级别,但是并不能正常地运行,这时候你可以选择较低的级别试试--当然,效能也会随之打个折扣。

  6.日志和报告

  HylaFAX的日志保存在标准日志文件/var/log/messages中,通过修改/var/spool/hylafax/etc/config文件中ServerTracing的级别可以调整日志的详细程度。除此之外,每次会话的详细记录则保存在/var/spool/hylafax/log目录下。运行xferfaxstats会生成相当详尽的统计报告。

  你也可以对sendfax/faxalter使用-vv参数,可以将协议执行过程输出到文件中,这对调试客户端与服务器的联接问题很有用。

  7.发送和接收

  1)从用户端提交传真
  从用户端提交传真有两种方法

  A)通过虚拟的传真打印机
  基本的想法是通过把文件打印到虚拟的传真打印机,使用PostScript打印机驱动程序作为过滤器,将文件转化为HylaFAX服务器理解的PostScript格式,然后由客户端程序向HylaFAX传真服务器提交此文件及有关信息即可。

对此我有五点看法,

  a)Windows下客户端程序当中,我感觉whfc不错,你不妨试试。作者Ulrich Eckhardt是德国人,注意安装的时候要去掉默认的德语支持,否则界面是德语的。在Windows NT/98下和Windows 2000下的行为稍有不同。过去的1.08版本由于使用了专有的库文件,因此不是开放源码的,我一直有点担心后续支持问题。但作者似乎解决了这个问题,今天察看主页的时候才发现目前1.09版本已经使用GPL许可,还有了简体中文支持!恭喜!

  b)并不是所有的PostScript打印机驱动程序都表现优异。历史上看,Apple公司是PostScript的积极支持者。80年代中期,Adobe出PostScript、Aldus出PageMaker,Apple出MacOS和LaserWriter系列打印机,三剑客携手桌上排版革命,对PostScript成为印前行业事实上的工业标准功不可没。所以大多数人选择使用高品质的Apple LaserWriter 16/600 PS驱动程序不是没有道理的。

  c)有些方案要求你在要传真的文件中插入有特殊意义的字符序列,比如sambafax要求 
  Fax-Nr:

  委婉一点说,这种方式不象听起来那么好;换句话,这种方式也太差劲了。首先,这是一个肮脏的解决方案,把传真和它的元信息搞混了,其次,若你的文档是一张图片,这种方法会失效,最后,当然了,你的自由被剥夺了――这个特定的字符序列将成为传真正文中永远的禁忌字眼。颇不光明正大。建议在采用此类方案之前三思。

  d)正如上面已经提到的,通常我们将需要传真的文档打印到设定的PostScript传真打印机即可通过HylaFAX发送出去。这真是一个绝妙的好点子,简单又易行,只是还有一个小小问题需要注意――很多时候我们的文件是分多次打印到打印机的,尽管看起来好像是一次。说句题外话,我很喜欢举这个例子来说明什么是编程中意想不到的副作用。 

  举例来说,你收到同事发来的电子邮件,正文中和你讨论了替换公司Web服务器磁带机的进度,附带一份Acrobat PDF格式的进度报告和一份Word DOC格式的供应商报价。为防止眼睛过度疲劳,你决定打印到网络上的激光打印机上以便阅读。当发出打印指令后,你的Outlook首先打印正文,然后激活Acrobat Reader打印进度报告,最后激活Word打印供应商的报价单。从打印机上看,三者将依次打印,间隔不过数秒钟,几乎不太可能有另一份打印作业插入到它们中间(尽管繁忙时不排除这个可能性,实际中也确实会发生),效果上和一次性打印没有两样。

  但是对于传真,你的正文和进度报告之间相隔2、3分钟,进度报告和报价单又相隔3、4分钟,这种情况并非不常见。由于以上原因,在你的进度报告和报价单中间有时会插入一份来自其他发送者的会议邀请函再加一份内部会议议程表。我们对此几乎无能为力。打印机上万一出现了插队现象,由于打印者对文档的内容很清楚,可以轻易挑出自己的文件;位于电话线那头传真机边上的接收人可没有这个便利条件,我们唯一可以做的就是为相关联的多份传真做好标记,比如在封面页上标上Part 1 of 3、Part 2 of 3、Part 3 of 3等等。

  希望对面是位认真负责的伙计(A型血尤佳:)

  e)HylaFAX服务器试图将IP地址转换为域名。如果你的主机没有域名的话,反向解析将导致漫长的等待。解决办法不值一提:给它所要求的。你有两个选择,或者维护一份hosts文件,或者运行一个DNS服务器。

  B)email to fax

  首先要说的是,此项功能并不完善,因此不要期望过高。其次,它相当复杂。最后,也是最致命打击,它目前只支持us-ascii和iso-8859-1编码,所有中文被解码为一堆天书。请所有用户注意练习英文,不要出有损公司形象的语法和拼写错误。

  faxmail从标准输入读取数据,从头行当中,也就是From、To、Cc和Subject,解析出发送传真的必要信息。头行的写法好似史前人类图腾上描摹的巫咒,复杂程度几乎够得上一个微型标记语言,你要在里面指定发送人、接收人、传真号码等信息,设置Tab字符宽度、字体路径等诸多细节。

  这听起来不错,理论也说得通,可是正所谓知易行难,执行起来根本不是那一回事。问题在于,情况不象7位 ASCII字符的控制台时代那么单纯----我们有了HTML邮件和MIME编码。单独一个已经挺难对付的了,何况两者一起兴风作浪。考虑一下一个混合了JavaScript脚本、JPEG和GIF图片、ActiveX控件、使用魏碑体的电子邮件,上面嵌入了一张Excel电子表格,该表格的部分数据存放在另一部电脑的关系数据库里!真够瞧的。
显然我们的传真服务器不可能大包大揽,同时身兼HTML渲染引擎、脚本解释器、Excel和SQL查询引擎(以及其它各种知名或不知名的应用程序)的功能,更不要说字体这类细节。既然faxmail不可能打中移动的靶子,此项功能对邮件内容的范围有严格的限制。首先,要求是纯文本邮件,其次,所有不可显示的MIME编码的内容,包括音频、视频、二进制数据等,都被舍弃了。faxmail内建仅可以识别text/plain、multipart/mixed、multipart/digest、message/rfc822、applica-tion/postscript和 application/x-faxmail-prolog MIME类型。也就是说,附带的Excel表格、PDF文档甚至TIFF图片全部都会被不动声色地清理掉。

  结果,真糟糕,被传送的传真往往出乎不了解技术细节的用户的意料,完全走了调。

  诸位,相信我,这不是事前的精心设计,而是事后无奈的修补,其方法就是每发现一个接不上榫的地方就得有个新标记加入进来处理――毕竟传真和电子邮件的设计是独立进行的,不能很好地交互虽然让人沮丧,倒也在意料之中。

  总之,这玩艺颇不光明正大,有鸡鸣狗盗之风,非处常之法,君子所不取。因此请原谅,我决定在开始讨论讨论这项用处不大、麻烦不小的功能之前尽快结束掉这一节。执意不听者请自行察看man page。注意安全。

  接收传真

  faxgetty会把刚接收到的传真(TIFF格式)放入recvq队列并调用faxrcvd脚本加以处理。常见的方式有两种:

  A)fax to email
  最常用的传真处理手段是将收到的传真以指定的格式作为电子邮件的附件传送给传真管理员FaxMaster的电子邮箱。传真管理员初步查看和分拣传真,然后转发给适当的人员。因为缺乏足够的信息,传真并不能象电子邮件那样自动分发。HylaFAX服务器手上所有的只是一幅TIFF图片,发送/接收人信息齐全,就在那儿,但没有方法加以利用。希望随着图像识别技术的进步这一问题能够解决。

  B)直接传送到到打印机
  一般来说,PostScript打印机是最易使用的。在faxrcvd中添加打印功能即可,具体的命令取决于你所采用的打印软件。例如我常用HP LaserJet 2100TN网络打印机和行式打印机守护进程lpd,因此修改faxrcvd为
/usr/bin/tiff2ps -a $FILE | lpr

  当然,在此之前需要先配置好你的打印机。

  8.访问控制和传真路由

  在加以说明之前,有几个在HylaFAX文档中反复提及的名词需要略加解释,它们是CID、DNIS和TSI。
什么是CID?喜欢看港产警匪片的读者可能想起了Criminal Investigation Department,不过这里的意义就是Caller IDentification的缩写,一个代表联接另一方的标识符。Caller ID大致相当于来电显示服务,可查知拨叫者的电话号码,该功能需要PSTN网络支持。该信息由电信服务商提供,可能需要申请开通和/或付费。由于拨叫者的电话号码理论上属于隐私,并不一定总能获得此项服务,具体情况取决于所处的国家和地区。

  什么是DNIS?它是Dialled Number Identification Service的缩写,也由电信服务商提供,同样可能需要申请开通和/或付费。此服务可查知拨叫者正在拨叫的--也就是我们自己的--电话号码。一般情况下我们当然清楚自己的电话号码,但如果有多条线路且有遇忙自动转线功能,DNIS也是有一定作用的。对运行HylaFAX服务器来说,DNIS用处不大,这里提到它主要是为了防止读者把它和CID混淆。

  什么是TSI?它是Transmission Subscriber Identification的缩写,又一个代表联接另一方的标识符。和CID、DNIS不同,TSI由用户设置,通常是可打印字符的组合。

  1)访问控制有两方面的含义:
  a)只接收期望的传真。

实际当中收到垃圾传真的可能性不大,其危害程度远远没有泛滥成灾的垃圾邮件那么严重。这主要是因为传真系统不如电子邮件系统便宜和快捷。一个垃圾邮件制造者可以以极低的成本向无辜的人们发送数以百万计的电子邮件,但一百万份传真则几乎是不可能的任务――通信费用高昂,时间上也不允许。另外,传真运行在传统的面向虚电路的电话交换网络上,不太容易抹去发送者的信息,难以象垃圾邮件制造者那样保持匿名。警方根据电话号码按图索骥,很快就会找上门来,发送者将会面临法律上的麻烦。

  无论如何,你可以通过在hfaxd.conf中指定QualifyTSI、QualifyCID来排除不速之客。通过设置/var/spool/hylafax/etc/cid和/var/spool/hylafax/etc/tsi文件,你可以指定想要和不想要的传真,faxgetty在建立联接之前会根据这些文件盘查拨入的电话,给不受欢迎的恶客一个清脆的闭门羹,不亦快哉!

  b)不多不少只有已授权的人可以从已授权的机器上发送传真。
  访问控制在新版本的HylaFAX服务器中得到了很大改进――较老的版本中只能指定哪些主机可发送传真,并没有基于用户/密码的机制。

  在hosts.hfaxd中指定客户端的访问控制。默认情形下,该文件包含以下两行
  localhost
  127.0.0.1

  这时HylaFAX仅接受本机的联接请求。如果我们有一个IP子网192.168.1.0/24,运行命令
  [/] echo "192.168.1.0" >> hosts.hfaxd

  将允许子网内的所有电脑/用户联接到HylaFAX服务器。再一次地,我们可以运行命令 
  [/] echo "alan@192.168.2.8" >> hosts.hfaxd

  以允许192.168.2.8/24主机上的用户alan访问HylaFAX服务器。

  你也可以为用户指定密码,并且正则表达式同样可应用在这里。

  2)传真路由

  前面提到传真不支持自动分发(即路由)。虽说如此,我们倒也不是完全束手无策,因为我们手上多少还是有几张牌的。当传真接收完毕之后,faxgetty会把它和相关的会话信息,包括对方的TSI、CSI、支持的分辨率、传输速率14400、图像压缩方式等等,传递给faxrcvd脚本。faxrcvd脚本根据这些信息对收到的传真作初步的粗粒度分类,读取/var/spool/hylafax/etc/FaxDispatch配置文件来决定具体的路由规则。路由规则一般是一个长长的case语句。借助正则表达式大强大威力,我们可以构造相当复杂的选择条件。在faxrcvd的手册页中有一个非常详尽的脚本范例,可作为量身定制脚本的出发点。 

  现在也可以指定附件的格式为TIFF、PDF或PostScript。例如要指定为TIFF格式,只须简单地在FaxDispatch中加上一行即可:

  FILETYPE=tif

  要知道,在过去的黑暗日子里,管理员们必须自己动手编制不同的脚本来生成不同的附件格式。

  这里有一种稍加变化的方式。你可以选择可以在邮件中指明一个URL,然后通过运行在HylaFAX服务器上的FTP或Web服务器提供下载服务,优点是可以大大减小电子邮件的尺寸。对于那些惯于动辄cc给10多人的用户,这会大大减轻企业电子邮件系统的压力。

  有件事要牢记在心:电信公司一般在第一/二次振铃之间发送CID或DNIS信息,因此如果你设置在三声振铃后faxgetty才接受拨叫,就会错失良机,这时CID或DNIS为空值。

  附带说一句,我最常见到的TSI是""--非常遗憾,大家都很忙,以至大多数传真设备并没有适当地设置TSI。我也见过各种稀奇古怪的TSI,诸如空白、电话号码、110,以及:you are pig。很有幽默感,嗯?

  请检查你的传真机/传真服务器并正确设置TSI为贵公司名称或缩写。

  9.查看收到的传真

  传真主要以TIFF格式或PDF格式呈现给用户,少数情况下也使用PostScript格式。这些都是应用非常广泛的格式,根据平台的不同,我们有不同的查看器。

  Windows附带的Imagimg for Windows(在不同的Windows上名称稍有不同)完美地支持TIFF文件。Adobe Acrobat Reader用于察看PDF文件,PostScrip文件可用GSView配合Ghostscript察看。需要指出的是,有些图像软件,例如著名的Acd See的某些版本并不能正确地察看多页TIFF文件,导致只能看见封面页。
Unix和Mac也有相应的察看器可用。

  有一个小细节需要指出:HylaFAX支持1-D MR、2-D MR、2-D MMR压缩格式,默认情况下HylaFAX使用传输过程中和对方商定的格式保存收到的传真,因此recvq目录下的TIFF文件可能采用了不同的压缩格式。少数时候会碰到2-D MMR格式的TIFF文件,某些查看器对此种格式的支持没有1-D MR、2-D MR完善,可能会导致无法查看。为此我们可以使用/var/spool/hylafax/etc/config.ttySx中的RecvDataFormat参数指定一种标准的格式保存所有的传真,通常是2-D MR。

  10.制作传真封面页

  当今社会注重包装(有时甚至到了本末倒置的程度),因此传真封面页作为内容的脸面不可小视。

  传真封面页通常包括收/发双方传真号码、公司名称、人员、主题以及内容提要。因此制作要点在于生成一页这些内容可动态改变的传真并在正确的时间,正确的位置,填上正确的内容。它当然和我们的传真一样,是PostScript格式。

  制作传真封面页有不同的方法,这里介绍我常用的latex-cover包。在动手之前,我们先介绍必备工具LaTeX。

  何谓 LaTeX?无它,一种排版用标识语言而已,由L.B.Lamport对D.E.Knuth(没错,就是写《计算机程序设计艺术》的那个D.E.Knuth)发明的TEX作了外层宏包装,最初的用途是数学论文排版(Knuth写的,你还能指望它做什么呢)。就其精神实质而言,LaTeX和XML相近,它描述元素的属性而不是格式化信息。

  我们用普通的文本编辑器,比如说vi,创建一个扩展名为tex的LaTeX源文件faxcover.tex。latex尚未支持直接输出PostScript格式,因此我们先转换到dvi格式。输入以下命令
  [/] latex faxcover.tex

  这会输出一个faxcover.dvi文件,然后运行dvips把此dvi文件转化为PostScript格式。 
  [/] dvips -o faxcover.ps faxcover.dvi

  做法并不复杂,难度在于LaTeX本身颇不简单。对大多数人来说,这是一种闻所未闻的新语言。既然如此,直接写PostScript岂不爽快?之所以兜这么个圈子,是因为PostScript远比LaTeX更复杂、更低级。要知道,PostScript 3 Language Reference有912页,编程手册更不用说,而文末列出的LaTeX教程一般不多于50页。现在你明白,选择LaTeX也是不得已而为之,所谓两害相权取其轻罢了。

  当然,若你能直接用文本编辑器编写一个PostScript封面页出来,记住在简历上列出这一条,肯定能使人对你刮目相看:)

  后面附有我制作的传真封面页,使你可以对此有个概念。在这个范例文件中,公司logo是使用Peter Kadal的TEXdraw包中的Bezier曲线函数画出的。偷懒的法子是用AutoCAD绘制出DWG图然后保存为EPS文件,然后导入到目标文件中。这样做的得到的是位图格式,目标文件较大,缩放时效果也较差。

  生成的faxcover.ps文件还不能直接在GSView中打印或察看,因为它还包含着某些未定的域,导致渲染出错。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多