Налаштування факсу (прийом)
В ідеалі, я хотів би зробити і прийом, і відправлення через вбудований факс астеріск, але відправлення поки що викликає багато організаційних питань (як вказувати номер, конвертувати формати тощо). Тут я розгляну налаштування прийому факсів.
Самою компанією Digium розроблено і продається програмний факс для астеріск. Його можна завантажити і спробувати в безкоштовному режимі (з обмеженням на одну лінію) або докупити ліній по 40 доларів, що зовсім недорого (порівняно зі звичайними факсами).
Спробуємо налаштувати факс у режим, коли прийнятий факс автоматично надсилається на вибраний нами email.
Встановлення факсу Digium
Спочатку завантажуємо саму програму. Я скористався yum-ом:
Далі купуємо ліцензію або отримуємо безкоштовну на одне підключення, запускаємо утиліту /usr/sbin/register і реєструємо наш факс.
Створюємо файл /etc/asterisk/res_fax.conf (я взяв всі параметри з вихідного прикладу):
Перезавантажуємо астеріск і перевіряємо, що модуль факсу підвантажився
підвантажити без перезавантаження можна командою module load res_fax_digium
Налаштування діалплану
У попередній статті я описав «зародок» контексту для факсу. Прийшов час доделать його.
Частину файлу я взяв з документації до факсу, частину доделал сам. Звертаю вашу увагу, що у астеріска повинні бути права на запис у папку, яку ви призначаєте для прийому факсів.
; отримаємо ім'я файлу виду fax-[номер факсу].tif
exten => fax,n,Set(GLOBAL(FAXCOUNT)=${IF($["${GLOBAL(FAXCOUNT)}"=""]?0:${GLOBAL(FAXCOUNT)})})
exten => fax,n,Set(GLOBAL(FAXCOUNT)=$[${GLOBAL(FAXCOUNT)} + 1])
exten => fax,n,Set(FAXCOUNT=${GLOBAL(FAXCOUNT)})
exten => fax,n,Set(FAXFILE=/tmp/faxes/fax-${FAXCOUNT}.tif)
; приймаємо факс у файл
exten => fax,n,ReceiveFax(${FAXFILE})
exten => fax,n,Hangup()
; коли факс поклав трубку, займемося аналізом того,
; чого він наполучал
exten => h,1,NoOp(fax hangup)
; отримаємо статус прийому
exten => h,n,GotoIF($["${FAXOPT(status)}" != "SUCCESS" ]?finish)
; статус прийому - успішний.
; тепер необхідно передати це ім'я файлу скрипту з описом дії
; скрипт приймає такі параметри:
; -f=ім'я файлу -m=дія -p=параметр
; -m=del - видалити файл
; -m=mail -p="адреса" - відправити по email
; -m=print -p="ім'я принтера" - роздрукувати
; на першому етапі ми виконаємо всі три, потім будемо вибирати
; друкуємо
exten => h,n,NoOp(${SHELL(php /var/lib/asterisk/rittal/fax_work.php -f ${FAXOPT(filename)} -m print -p printer1)})
; відправляємо
exten => h,n,NoOp(${SHELL(php /var/lib/asterisk/rittal/fax_work.php -f ${FAXOPT(filename)} -m mail -p user@rittal.ru)})
; видаляємо
exten => h,n,NoOp(${SHELL(php /var/lib/asterisk/rittal/fax_work.php -f ${FAXOPT(filename)} -m del)})
; фінішуємо
exten => h,n(finish),NoOp(finish fax hangup)
створюємо файл /var/lib/asterisk/rittal/fax_work.php
// перевіряємо, що заданий параметр mode
if(!isset($args['m'])) die("use -m to give mode name\n");
switch ($args['m'])
{
case 'del':
// видалення файлу
unlink($args['f']);
break;
case 'mail':
// відправка емейла
if( (!isset($args['p'])) || ($args['p']=='')) die("use -p to give dest mail\n");
$to=$args['p']; // кому
$subject="Fax received ".date("d.m.Y H:i:s"); // тема
$random_hash = md5(date('r', time()));
// Заголовки
$headers = "From: fax@rittal.ru\r\nReply-To: postmaster@rittal.ru";
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
$attachment = chunk_split(base64_encode(file_get_contents($args['f'])));
$body="";
$body .="\r\n".'--PHP-mixed-'.$random_hash;
$body .="\r\n".'Content-Type: multipart/alternative; boundary="PHP-alt-'.$random_hash.'"';
$body .="\r\n";
$body .="\r\n".'--PHP-alt-'.$random_hash;
$body .="\r\n".'Content-Type: text/plain; charset="iso-8859-1"';
$body .="\r\n".'Content-Transfer-Encoding: 7bit';
$body .="\r\n";
$body .="\r\n".'Please, see fax message in attachment';
$body .="\r\n";
$body .="\r\n".'--PHP-alt-'.$random_hash.'--';
$body .="\r\n".'--PHP-mixed-'.$random_hash;
$body .="\r\n".'Content-Type: application/tiff; name="fax.tiff"';
$body .="\r\n".'Content-Transfer-Encoding: base64';
$body .="\r\n".'Content-Disposition: attachment';
$body .="\r\n";
$body .="\r\n".$attachment;
$body .="\r\n".'--PHP-mixed-'.$random_hash.'--';
$body .="\r\n";
mail( $to, $subject, $body, $headers );
break;
case 'print':
// друк файлу на принтері
if( (!isset($args['p'])) || ($args['p']=='')) die("use -p to give printer name\n");
exec('tiff2ps "'.$args['f'].'" | lpr -P'.$args['p']);
break;
default:
die("wrong mode!\n");
}
?>
