E-mail notification (was Re: [aprssig] Perl cell phone and Pager)

Arne Stahre sm6vyf at gatugarden.com
Wed Feb 1 06:08:12 EST 2006


Tyson S. wrote:
> I got excited when I saw the subject line for the first time and
> thought someone had added a feature I have been trying to make. I was
> un-successful in getting PERL-APRS running on my PHP-PERL home server
> the last time I tried. Mostly due to my total lack of programming
> knowledge. But the feature I am looking for is to be able to enter
> various area coordinates similar to the filter on a server and when
> your choice of station enters these areas a message is sent to an email
> address. In my case the email would be my cell phone. The station could
> be specific, a wild card of any SSID or a wildcard of any call sign or
> object that enters your areas of choice. If any one has experience with
> getting this application installed and running I would gladly accept
> any tips or advice you may have. Thanks. N7ZMR, Oregon.

  Well, using the junkbox, I came up with the following. It uses the 
APRS-IS filter and notifies for any packet (except server comments) 
received from the APRS-IS (one mail per packet!).

#!/usr/bin/perl -w
# 1.II.06 SM6VYF/Arne
use Socket;
use Net::SMTP;
use strict;

# For filter selection see:
# http://www.aprs-is.net/javAPRSSrvr/javaprsfilter.htm

our $HOST = 'northwest.aprs2.net';	# APRS-IS (eg.)
our $PORT = '14580';			# Select filtered port!
our $FILTER = 'a/58/10/56/12/';		# Filter (edit as wanted)

our $SENDER = 'user1 at host.domain'; 	# Who's sending this
our $RECIPIENT = 'user2 at host.domain';	# To whom the mail is sent
our $MAILSERVER = 'host.domain';	# SMTP server to connect to

our $TIMEOUT = 10;

sub connect_to_net {
   my ($host, $port) = @_;

   my $in_addr = (gethostbyname($host))[4];
   my $addr = sockaddr_in($port, $in_addr);
   my $proto = getprotobyname('tcp');
   socket(APRSPORT, AF_INET, SOCK_STREAM, $proto) or die "socket:$!";
   connect(APRSPORT, $addr) or die "connect:$!";
}

sub notify {
   my ($packet) = @_;

   my $smtp = Net::SMTP->new($MAILSERVER);
   $smtp->mail($SENDER);
   $smtp->to($RECIPIENT);

   $smtp->data();
   $smtp->datasend("To: $RECIPIENT\n");
   $smtp->datasend("From: $SENDER\n");
   $smtp->datasend("Subject: APRS notification\n");
   $smtp->datasend("\n");
   $smtp->datasend($packet);
   $smtp->dataend();

   $smtp->quit();
}

my $packet;
my $running = 1;

connect_to_net($HOST, $PORT);

select APRSPORT; $| = 1;
print APRSPORT "#filter $FILTER\r";

select STDOUT; $| = 1;		# DEBUG

$SIG{INT} = sub { $running = 0 };

while ($running) {		# perldoc -f alarm
   eval {
     local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
     alarm $TIMEOUT;
     $packet = <APRSPORT>;
     alarm 0;
   };
   if ($@) {
     die unless $@ eq "alarm\n"; # propagate unexpected errors
   } elsif (! $packet) {
     $running = 0;
   } elsif (length $packet ne 0) {
     print $packet;		# DEBUG
     notify($packet) unless ($packet =~ /^#/);  # Don't mail server comments
   }
}

close(APRSPORT);




More information about the aprssig mailing list