Skip to content

Instantly share code, notes, and snippets.

@jkramarz
Created December 9, 2019 23:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkramarz/f87eb0aed087705f6beb904e3afbfe12 to your computer and use it in GitHub Desktop.
Save jkramarz/f87eb0aed087705f6beb904e3afbfe12 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
# sends email subject line as zmtrigger command
# can be used to start ZoneMinder recording from non-Onvif capable camera that can send emails on event
use IO::Socket::INET;
use Net::Server::Mail::ESMTP;
use Email::Simple;
my $server = new IO::Socket::INET Listen => 1, LocalPort => 10025;
my $conn;
while($conn = $server->accept)
{
my $esmtp = new Net::Server::Mail::ESMTP socket => $conn;
# activate AUTH extension
$esmtp->register('Net::Server::Mail::ESMTP::AUTH');
# adding AUTH handler
$esmtp->set_callback(AUTH => \&validate_auth);
$esmtp->set_callback(DATA => \&queue_message);
$esmtp->process;
}
sub validate_auth
{
my ($session, $username, $password) = @_;
if ($username eq 'zm' and $password eq 'secret') {
# AUTH SUCCESFULL
$session->{AUTH}->{ok} = 1;
return 1;
} else {
# AUTH FAILED
return 0;
}
}
sub queue_message {
my($session, $data) = @_;
unless ($session->{AUTH}->{ok}) {
# warn "no AUTH supplied!";
return(0, 530, 'Error: Authentication required');
}
my $sender = $session->get_sender();
my @recipients = $session->get_recipients();
my $email = Email::Simple->new($$data);
my $subject = $email->header("Subject");
$zmtrigger = IO::Socket::INET->new(PeerAddr => "127.0.0.1",
PeerPort => 6802,
Proto => "tcp",
Type => SOCK_STREAM);
print $zmtrigger "${subject}\r\n";
close $zmtrigger;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment