Search
Write a publication
Pull to refresh

Asterisk. Отправить факс — просто

Задача — дать сотрудникам фирмы простой и понятный инструмент для отправки факсов.

Имеем — настроенный на телефонию asterisk с sip каналом, поддерживающим передачу факсимильных сообщений.

Итак приступим:
На тему принятия факсов и отправки на e-mail литературы хватает, по этому остановлюсь только на отправке.

Для начала теория всей связки:
  1. на php пишем маленькую страничку, на которой будут загружаться pdf файлы для отправки, номер телефона и e-mail для отчета об отправке.
  2. Полученные поля передаются для дальнейшей обработки в bash скрипт, который переводит .pdf в понятный для asterisk .tiff и создает call файл, давая команду на отправку, передавая в том числе переменную, содержащую e-mail
  3. добавляем в конфиг asterisk раздел [fax-tx], который будет осуществлять передачу и отправку отчета


  1. страница отправки:
    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>');
    ?>
    

  2. Обрабатываем полученные данные и даем команду на отправку
    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;
    

  3. конфигурирование самого 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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.