Задача — дать сотрудникам фирмы простой и понятный инструмент для отправки факсов.
Имеем — настроенный на телефонию asterisk с sip каналом, поддерживающим передачу факсимильных сообщений.
Итак приступим:
На тему принятия факсов и отправки на e-mail литературы хватает, по этому остановлюсь только на отправке.
Для начала теория всей связки:
В заключении добавлю, что данная конструкция работает при правильно настроенных веб-сервере, почтовом сервере (я настраивал postfix в режиме relay) и конечно рабочем asterisk.
Конструкция самой страницы максимально проста, но может быть легко расширена по вкусу, например с авторизацией по пользователям и использоваться в качестве api к уже имеющимся сервисам.
В качестве основной литературы для настройки использовалась статья: Реализация работы с факсами в asterisk
Имеем — настроенный на телефонию asterisk с sip каналом, поддерживающим передачу факсимильных сообщений.
Итак приступим:
На тему принятия факсов и отправки на e-mail литературы хватает, по этому остановлюсь только на отправке.
Для начала теория всей связки:
- на php пишем маленькую страничку, на которой будут загружаться pdf файлы для отправки, номер телефона и e-mail для отчета об отправке.
- Полученные поля передаются для дальнейшей обработки в bash скрипт, который переводит .pdf в понятный для asterisk .tiff и создает call файл, давая команду на отправку, передавая в том числе переменную, содержащую e-mail
- добавляем в конфиг asterisk раздел [fax-tx], который будет осуществлять передачу и отправку отчета
- страница отправки:
cat /var/www/fax/index.html
<title>Форма для отправки факсов</title> <body> <form action="upload.php" method="POST" enctype="multipart/form-data"> <table align=center width=600 bgcolor=#ffffff border=0> <tr> <td align=center colspan=2> <h2>Форма для отправки факсов</h2> </td> </tr> <tr> <td> На какой номер отправляем факс? </td> <td> <INPUT NAME="number" VALUE ="" type="text" SIZE=11 MAXLENGTH=11> </td> </tr> <tr> <td> На какую почту сообщить статус отправки? </td> <td> <INPUT NAME="email" VALUE ="v@itc-labs.ru" type="email" SIZE=20 MAXLENGTH=50> </td> </tr> <tr> <td> Прикрепляемый файл<input type="file" accept="application/pdf" name="file" /> </td> <td> <input type="submit" name="submit" value="Отправить Факс!"> </td> </tr> <table> </form> </body>
cat /var/www/fax/upload.php
<? error_reporting(-1); if($_FILES["file"]["size"] > 1024*10*1024) { echo ("Размер файла превышает 10 мегабайт"); exit; } exec('/var/lib/asterisk/agi-bin/fax/fax-send.sh '.$_FILES["file"]["tmp_name"].' '.$_POST["number"].' '.$_POST["email"], $a); echo('<center>Факс поставлен в очередь на отправку</center>'); ?>
- Обрабатываем полученные данные и даем команду на отправку
cat /var/lib/asterisk/agi-bin/fax/fax-send.sh
#!/bin/bash work_dir="/var/spool/asterisk/monitor/fax"; outgoing_dir="/var/spool/asterisk/outgoing"; context_to="agent-test"; send_to=$2; email=$3; file=$1; id=`date +%s`; echo $id fax to $send_to from $email file $file >> /var/log/asterisk/fax.log; /usr/bin/gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sOutputFile=/var/spool/asterisk/monitor/fax/queue/$id.tif $file; tif=`echo $time.tif`; echo Channel: Local/$send_to\@$context_to > $work_dir/tmp/$id; echo Context: fax-tx >> $work_dir/tmp/$id; echo Extension: send >> $work_dir/tmp/$id; echo MaxRetries: 2 >> $work_dir/tmp/$id; echo RetryTime: 600 >> $work_dir/tmp/$id; echo WaitTime: 30 >> $work_dir/tmp/$id; echo Set: PICTURE=$work_dir/queue/$id.tif >> $work_dir/tmp/$id; echo Set: EMAIL=$email >> $work_dir/tmp/$id; sleep 1s; /bin/mv $work_dir/tmp/$id $outgoing_dir;
- конфигурирование самого asterisk:
/etc/asterisk/extensions.conf
[fax-tx] exten => send,1,NoOP(------------------- FAX from ${CALLERID(number)} ------------------) exten => send,n,Set(FAXOPT(headerinfo)=header for fax) exten => send,n,Set(FAXOPT(localstationid)=my company) exten => send,n,Set(FAXOPT(maxrate)=14400) exten => send,n,Set(FAXOPT(minrate)=2400) exten => send,n,WaitForSilence(500,1,15) exten => send,n,NoOP(--- ${WAITSTATUS} ---) exten => send,n,Answer() exten => send,n,Wait(3) exten => send,n,SendFAX(${PICTURE}) exten => send,n,NoOP(--- ${FAXSTATUS} ---${FAXERROR} ---${REMOTESTATIONID} ---) exten => send,n,Hangup() exten => h,1,NoOP(------------------- FAX to ${EXTEN} with ${FAXSTATUS} -----------------) exten => h,n,GotoIf($["${FAXSTATUS}" = "SUCCESS"]?h,success:h,failed) exten => h,n(failed),Hangup() exten => h,n(success),system(echo "${FAXSTATUS} ---${FAXERROR} ---${REMOTESTATIONID}" | mail -s "FAX to ${EXTEN}" ${EMAIL}) exten => h,n,Hangup()
В заключении добавлю, что данная конструкция работает при правильно настроенных веб-сервере, почтовом сервере (я настраивал postfix в режиме relay) и конечно рабочем asterisk.
Конструкция самой страницы максимально проста, но может быть легко расширена по вкусу, например с авторизацией по пользователям и использоваться в качестве api к уже имеющимся сервисам.
В качестве основной литературы для настройки использовалась статья: Реализация работы с факсами в asterisk