謝意
http://ll.just4fun.biz/Perl/CPAN/CPAN%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B.html
そのほか、前の記事で記載したサイトを参考にさせていただきました。
注意:
インストール手順の詳細については、ログファイル紛失のため不明です。
ここでは、mailread@local に届いたメールを SIP/1001 に電話をかけて読み上げるという設定で行っています。
また、Asterisk の AMI のユーザーを「mailreader」パスワードを「pass」としています。適時書き換えてください。
まず、Perl のモジュールをインストールするために cpan と expect をインストールします。
# yum groupinstall 'Development tools' # yum -y install cpan expect
あとは、エラーメッセージに合わせて Perl のモジュールを入れていく感じです。
インストール時のログが見つからないので、詳細は見つかった時に追記します。
# touch /usr/bin/mailAnalyse.pl # chmod a+x /usr/bin/mailAnalyse.pl # mkdir /tmp/mail # chmod a+rw /tmp/mail # vi /usr/bin/mailAnalyse.pl
中身は以下の通りです。
#!/usr/bin/perl use File::Basename; use MIME::Parser; my $parser = MIME::Parser->new; #デフォルトの送信先時間設定 my $exten = 'SIP/1001'; my $SendAt = 'now'; #ファイルの一時保存場所を指定 $parser->output_dir('/tmp'); #標準入力からメールを取得 my $entity = $parser->parse(*STDIN); #FromとSubjectのみ取り出し my $from = $entity->head->decode->get('From'); my $subject = $entity->head->decode->get('subject'); my $body = $entity->is_multipart ? $entity->parts(0) : $entity; my $bodyHandle = $body->bodyhandle; my $lines = $bodyHandle->as_string; my $TextHead1 = "メールが届いています。今から読み上げます。"; $from =~ s/info/インフォ/; $from =~ s/sip/シップ/; if (length($body) > 3) { my @strline = split(/n/, $lines,2); my $wardindex = index($strline[0],"To:"); if ($wardindex == 0) { $lines = $strline[1]; $exten = substr($strline[0],3); @strline = split(/n/, $lines,2); my $wardindex1 = $strline[0]; my $wardindex2 = index($strline[0],"At:"); if ($wardindex1 == 8 && $wardindex2 == 0) { $SendAt = substr($strline[0],3); $lines = $strline[1]; } } } $lines =~ s/info/インフォ/; $lines =~ s/sip/シップ/; my $TextRead = $TextHead1; $TextRead = $TextRead . "送信元は、$from です。"; $TextRead = $TextRead . "件名は、$subject です。"; $TextRead = $TextRead . "本文を読み上げます。$lines"; $TextRead = $TextRead . "以上で終了します。"; #改行を削除 $TextRead =~ s/r//; $TextRead =~ s/n//; open(DAT,">>/tmp/mail.dat"); print DAT "To:$extenn"; print DAT "At:$SendAtn"; print DAT "$TextRead"; close(DAT); sleep 2; system("cp /tmp/mail.dat /tmp/mail/mail.dat");
/tmp/mail にファイルが届いた場合は wav ファイルを作成する準備をします。
postfix ならば、 /etc/aliases に、
mailread: | "/usr/bin/mailAnalyse.pl"
を1行書き加え、変更を反映させます。
# newaliases
# touch /usr/bin/mailAnalyse2.pl # chmod a+x /usr/bin/mailAnalyse2.pl # vi /usr/bin/mailAnalyse2.pl
中身は以下の通りです。
#!/usr/bin/perl my $exten = 'SIP/1001'; my $SendAt = 'now'; my @data; open(IN,"/tmp/mail/mail.dat"); @data = <IN>; close(IN); if (@data > 2){ my $wardindex1 = index($data[0],"To:"); my $wardindex2 = index($data[0],"At:"); if ($wardindex1 == 0) { $exten = $data[0]; $data[0] = ''; $wardindex2 = index($data[1],"At:"); if ($wardindex2 == 0) { $SendAt = $data[1]; $data[1] = ''; } } else { if ($wardindex2 == 0) { $SendAt = $data[0]; $data[0] = ''; $wardindex1 = index($data[2],"At:"); if ($wardindex1 == 0) { $exten = $data[1]; $data[1] = ''; } } } } $exten =~ s/r//; $exten =~ s/n//; $exten =~ s/To://; $SendAt =~ s/r//; $SendAt =~ s/n//; $SendAt =~ s/At://; $SendAt =~ s/Now//; my $MailBody = ''; foreach $lines (@data) { my $tmp = $lines; $tmp =~ s/[[:cntrl:]]//g; $MailBody .= $tmp; } open(OUT,"> /tmp/mail/mail.dat") or die "$!"; print OUT $MailBody; close(OUT); system("/usr/local/bin/open_jtalk -m /var/lib/open_jtalk/nitech_jp_atr503_m001.htsvoice -x /usr/local/dic -ow /tmp/mail.tmp.wav /tmp/mail/mail.dat"); system("/usr/local/ffmpeg_build/bin/ffmpeg -i /tmp/mail.tmp.wav -ac 1 -ar 8000 -y /tmp/mail.wav"); system("rm -f /tmp/mail.tmp.wav"); system("rm -f /tmp/mail/mail.dat"); system("rm -f /tmp/mail.dat"); if ($SendAt == 'now'){ open(OUT,">> /tmp/mail.log") or die "$!"; print OUT "mailAnalyse3 $exten /tmp/mailn"; close(OUT); system("/usr/bin/mailAnalyse3 $exten /tmp/mail"); } else { }
# touch /usr/bin/mailAnalyse3 # chmod a+x /usr/bin/mailAnalyse3 # vi /usr/bin/mailAnalyse3
中身は以下の通りです。
#!/usr/bin/expect log_file /tmp/expect.log set timeout 20 set hostname localhost set port 5038 # AMI のマネージャーのユーザー名とパスワードの設定 # 適時書き換えてください set username mailreader set password pass set WaveFile ../../../../tmp/mail set Exten SIP/1001 if {$argc > 0} { set Exten [lindex $argv 0]; if {$argc > 1} { set WaveFile [lindex $argv 1]; } } spawn telnet $hostname $port expect "Asterisk Call Manager" send "Action: Loginn" send "username: $usernamen" send "secret: $passwordnn" expect "Status" send "Action: Originaten" send "Application: Playbackn" send "Data: ../../../..$WaveFilen" # ここでは直接チャンネルを指定していますが、RingGroup 等番号で指定する場合は # ローカルのコンテキストが default なら # send "channel: Local/$Exten@defaultn" # というように、Local/内線番号@コンテキストnというように書き換えます send "channel: $Extenn" # タイムアウトをミリ秒で指定します。 send "Timeout: 40000n" send "Async: truenn"; expect "Response:" # 成功不成功の解析は複雑なため、下の行は使用せず、送信したらそのまま切断しています send "Action: Logoffnn" expect "Response:" interact
/tmp/mail にファイルが作られたときに、mailAnalyse2 を呼び出します。
postfix が nobody 権限で実行しており、スクリプトがうまく動かなかったので
incron を使用しました。
# incrontab -e
最後に以下の1行を追加します
/tmp/mail/ IN_CREATE perl /usr/bin/mailAnalyse2.pl
変更を反映させます
# incrontab -d