You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
6.0 KiB
171 lines
6.0 KiB
#!/usr/bin/perl |
|
## |
|
## asterisk-mail.pl -- Asterisk Mail User Agent |
|
## Copyright (c) 2008 Ralf S. Engelschall <rse@engelschall.com> |
|
## License: GPL (version 2 or higher) |
|
## Usage: asterisk-mail.pl <src> <dst> <name> <file> |
|
## |
|
|
|
require 5.008; |
|
use IO::File; |
|
use IO::All; |
|
use Asterisk::Manager; |
|
use Data::Dumper; |
|
use MIME::Entity; |
|
|
|
# local configuration |
|
my $my = { |
|
-prog_name => "asterisk-mail", |
|
-prog_version => "0.9.0", |
|
-asterisk_name => "OpenPKG Asterisk PBX", |
|
-asterisk_host => "127.0.0.1", |
|
-asterisk_port => "5038", |
|
-asterisk_user => "asterisk", |
|
-asterisk_secret => "asterisk", |
|
-sendmail => "/usr/sbin/sendmail", |
|
}; |
|
|
|
## |
|
## use Asterisk Manager Interface (AMI) |
|
## to retrieve information about users |
|
## |
|
|
|
my $cfg = { |
|
-extension2realname => {}, |
|
-realname2extension => {}, |
|
-extension2mailaddr => {}, |
|
-mailaddr2extension => {}, |
|
-extension2sipuser => {}, |
|
-sipuser2extension => {} |
|
}; |
|
my $astman = new Asterisk::Manager; |
|
$astman->host($my->{-asterisk_host}); |
|
$astman->port($my->{-asterisk_port}); |
|
$astman->user($my->{-asterisk_user}); |
|
$astman->secret($my->{-asterisk_secret}); |
|
$astman->connect() or die sprintf( |
|
"Could not connect to Asterisk Manager Interface (AMI) at %s:%s\n", |
|
$astman->host(), $astman->port() |
|
); |
|
my %response = $astman->action("VoicemailUsersList", 1); |
|
if ($response{"Response"} eq "Success") { |
|
while (1) { |
|
%response = map { |
|
Asterisk::Manager::splitresult($_); |
|
} $astman->read_response(); |
|
if ($response{"Event"} eq "VoicemailUserEntry") { |
|
$cfg->{-extension2mailaddr}->{$response{"VoiceMailbox"}} = $response{"Email"}; |
|
$cfg->{-mailaddr2extension}->{$response{"Email"}} = $response{"VoiceMailbox"}; |
|
$cfg->{-extension2realname}->{$response{"VoiceMailbox"}} = $response{"Fullname"}; |
|
$cfg->{-realname2extension}->{$response{"Fullname"}} = $response{"VoiceMailbox"}; |
|
} |
|
else { |
|
last; |
|
} |
|
} |
|
} |
|
my $response = $astman->sendcommand("Action" => "Command", "Command" => "sip show users", 1); |
|
$response =~ s/^.+Username\s+.+?NAT\r?\n//si; |
|
my @sipusers = map { s/^(\S+).*$/$1/; $_ } split(/\r?\n/, $response); |
|
foreach my $sipuser (@sipusers) { |
|
$response = $astman->sendcommand("Action" => "Command", "Command" => "sip show user $sipuser", 1); |
|
if ($response =~ m/^.*?Callerid\s*:\s*(.+?)\r?\n.*$/si) { |
|
$response = $1; |
|
if ($response =~ m/<(\d+)>/s) { |
|
$cfg->{-extension2sipuser}->{$1} = $sipuser; |
|
$cfg->{-sipuser2extension}->{$sipuser} = $1; |
|
} |
|
if ($response =~ m/"(.+?)"/s) { |
|
$cfg->{-extension2realname}->{$cfg->{-sipuser2extension}->{$sipuser}} = $1 |
|
if ( defined $cfg->{-sipuser2extension}->{$sipuser} |
|
and not defined $cfg->{-extension2realname}->{$cfg->{-sipuser2extension}->{$sipuser}}); |
|
$cfg->{-realname2extension}->{$1} = $cfg->{-sipuser2extension}->{$sipuser} |
|
if ( defined $cfg->{-sipuser2extension}->{$sipuser} |
|
and not defined $cfg->{-realname2extension}->{$1}); |
|
} |
|
} |
|
} |
|
$astman->disconnect(); |
|
|
|
## |
|
## resolve user information |
|
## |
|
|
|
my ($src, $dst, $name, $wavfile) = @ARGV; |
|
$src = &resolve_user($src); |
|
$dst = &resolve_user($dst); |
|
sub resolve_user ($) { |
|
my ($id) = @_; |
|
my $user = { |
|
-extension => '' |
|
-sipuser => '' |
|
-realname => '' |
|
-mailaddr => '' |
|
}; |
|
if ($id =~ m/^.+\@.+$/) { |
|
$user->{-mailaddr} = $id; |
|
$user->{-extension} = $cfg->{-mailaddr2extension}->{$user->{-mailaddr}}; |
|
$user->{-sipuser} = $cfg->{-extension2sipuser}->{$user->{-extension}}; |
|
$user->{-realname} = $cfg->{-extension2realname}->{$user->{-extension}}; |
|
} |
|
elsif ($id =~ m/^\S+\s+\S+.*$/) { |
|
$user->{-realname} = $id; |
|
$user->{-extension} = $cfg->{-realname2extension}->{$user->{-realname}}; |
|
$user->{-sipuser} = $cfg->{-extension2sipuser}->{$user->{-extension}}; |
|
$user->{-mailaddr} = $cfg->{-extension2mailaddr}->{$user->{-extension}}; |
|
} |
|
elsif ($id =~ m/^\d+$/) { |
|
$user->{-extension} = $id; |
|
$user->{-sipuser} = $cfg->{-extension2sipuser}->{$user->{-extension}}; |
|
$user->{-mailaddr} = $cfg->{-extension2mailaddr}->{$user->{-extension}}; |
|
$user->{-realname} = $cfg->{-extension2realname}->{$user->{-extension}}; |
|
} |
|
else { |
|
$user->{-sipuser} = $id; |
|
$user->{-extension} = $cfg->{-sipuser2extension}->{$user->{-sipuser}}; |
|
$user->{-mailaddr} = $cfg->{-extension2mailaddr}->{$user->{-extension}}; |
|
$user->{-realname} = $cfg->{-extension2realname}->{$user->{-extension}}; |
|
} |
|
$user->{-extension} = "0" if (not defined $user->{-extension}); |
|
$user->{-sipuser} = "unknown" if (not defined $user->{-sipuser}); |
|
$user->{-realname} = "" if (not defined $user->{-realname}); |
|
$user->{-mailaddr} = "unknown@unknown" if (not defined $user->{-mailaddr}); |
|
return $user; |
|
} |
|
|
|
## |
|
## send file as a mail |
|
## |
|
|
|
my $text = |
|
"Dear " . $dst->{-realname} . ",\n" . |
|
"\n" . |
|
"here is your audio recording of\n" . |
|
"$name.\n" . |
|
"\n" . |
|
"Yours,\n" . |
|
"\n" . |
|
"-- \n" . |
|
$my->{-asterisk_name} . "\n"; |
|
|
|
my $mail = MIME::Entity->build( |
|
From => sprintf("%s <%s>", $src->{-realname} || $my->{-asterisk_name}, $src->{-mailaddr}), |
|
To => sprintf("%s <%s>", $dst->{-realname} || $my->{-asterisk_name}, $dst->{-mailaddr}), |
|
'X-Mailer' => sprintf("%s/%s", $my->{-prog_name}, $my->{-prog_version}), |
|
Subject => sprintf("[%s] Your audio recording of %s", $my->{-asterisk_name}, $name), |
|
Data => $text, |
|
); |
|
|
|
if (-f $wavfile) { |
|
my $data = io($wavfile)->slurp(); |
|
$mail->attach(Data => $data, Type => "audio/x-wav"); |
|
} |
|
else { |
|
my $data = "ERROR: WAV file \"$wavfile\" not found\n"; |
|
$mail->attach(Data => $data, Type => "text/plain"); |
|
} |
|
|
|
my $io = new IO::File sprintf("|%s -oi -oem -f '%s' -t", $my->{-sendmail}, $dst->{-mailaddr}) or die; |
|
$io->printf($mail->stringify); |
|
$io->close(); |
|
|
|
|