#!/usr/bin/perl -w

########################
#Adam M. Bumpus <adam@bump.us>
#smsmail.pl
#Created 1-14-02
#Last Modified 9-23-02
#9/23/02 added code to improve reliability on flaky connections.
#########################

use IO::Socket;

#########Configuration Section########
$mailUser = "pop3username";
$mailPass = "pop3password";
$mailServer = "mail.yourISP.com";

$webServer = "www.phone.provider.com";
$webUrl = "http://www.phone.provider.com//send.pl?number=##########&message=";

###################End Configuration#####################



#####
#initialize message counter
####
$currentMessages = checkmail();
$oldMessages = $main::currentMessages;
$spam = 0;

while (1){
	$main::currentMessages = checkmail();
	if ($currentMessages > $oldMessages){
		for ($i=$oldMessages;$i<$currentMessages;$i++){
			getMessage();
			sendMessage();
		}	
		$oldMessages = $currentMessages;
	}
	if ($currentMessages < $oldMessages){ #i.e. mail has been deleted
		$oldMessages = $currentMessages;
	}
	sleep 30;
}


sub checkmail {
###Open a connection to the mail server
my $pop = IO::Socket::INET -> new ( Proto => "tcp",
				PeerAddr => $mailServer,
				PeerPort => "110");
if (defined($pop)){
   ###Login to Mail Server###
   my $response = <$pop>;
   print $pop "USER ".$mailUser."\n";
   $response = <$pop>;
   print $pop "PASS ".$mailPass."\n";
   $response = <$pop>;

   ###Get count of Messages from server
   print $pop "STAT\n";
   $response = <$pop>;
   print $response;
   my @result = split(/\s+/, $response);   #/\s+/ matches one or more spaces
   shift @result; ##Throw away +OK response from server

   $pop->shutdown(2);
   close $pop;
   undef $pop;
   undef $response;

   return $result[0];

   }else{
   print "Cannot reach mail server, will try again in 30 seconds.\n";
   return $currentMessages;
   }
}

sub getMessage {
print "open connection to server\n";
my $pop = IO::Socket::INET -> new (Proto => "tcp",
				PeerAddr => $mailServer,
				PeerPort => "110");

if (defined($pop)){
   my $response = <$pop>;
   print $response;
   print $pop "USER ". $mailUser . "\n";
   $response = <$pop>;
   print $response;
   print $pop "PASS ". $mailPass . "\n";
   $response = <$pop>;
   print $response;
   
   print  $pop "TOP " . ($i+1) . " 1\n";
   
   @mail = (); #reset variables used to store message
   $message[0]="";
   $message[1]="";
   $message[2]="";
   
   while (1) {
   	my $result = <$pop>;
	@mail = (@mail, $result);
	if ($result =~ /^From/){
		print "Found From:\n";
		print $result;
		$message[0] =  $result;
	}
	if ($result =~ /^Subject/){
		print "Found Subject:\n";
		print $result;
		$message[1] = $result;
	}
	last if $result =~ /^\.\s*$/;
   }
   $message[2] = "M:".$mail[-3];

   $message[0] =~ s/^[Ff]rom:\s/F:/;
   $message[0] =~ s/[<^].*//;
   $message[1] =~ s/^[Ss]ubject:\s/S:/;
   
   my $messagetext = ($i+1).$message[0].$message[1].$message[2]; 
   $messagetext =~ /.{1,150}/;
   print $messagetext;
   $text = "";

   #I'm going to convert each character to %XX format for
   #safe url encoding.
   while(length($messagetext)){
   	$text.="%".sprintf("%2.2X",ord(substr($messagetext,0,1,"")));
   }
   print $text;
	
   close $pop;
   $pop = \$pop;
   $response = \$response;
   $messagetext = \$messagetext;
}else{
   print "Could not contact mail server to retrieve message\n";
   }
}

sub sendMessage {
###Open a connection to the web server###
my $web = IO::Socket::INET -> new ( Proto => "tcp",
				PeerAddr => $webServer,
				PeerPort => "80");
if (defined($web)){
   ##Send Request###
   print $web "GET " . $webUrl . $text . "\n";
   my $result = <$web>;
   print $result;
   close $web;
   $web = \$web;
}else{
   print "Could not connect to web server.\n";
}
}


