##########################################################################
# Simple subroutine to send mail from any perl script
# FREE!!!
# usage: include in your script line (put this script in your
# perl\lib or working dir)
# require "mail.pl"
# This sub uses associative array MAIL which MUST be defined in your
program
# Keys of MAIL to be specified (keys in lowercase !!!):
# %MAIL =
# ( 'from', 'phil@somewhere.in.usa', # Sender's e-mail
# 'to', 'eric@somewhere.in.uk', # Receiver's e-mail
# 'subject', 'Testing mail from perl script', # Subject of e-mail
# 'date', 'Mon, 14 Apr 1997 11:34:49', # Date of mail,
# # localtime(time)
def.
# 'debug', '1', # 0 - no debug
# 'sender name', 'Phil Collins', # Senders name
# 'receiver name', 'Eric Clapton', # Name of receiver
# 'server', 'mail.server.there', # IP or name of mail
server
# 'port', '25', # port of SMTP, 25
default
# 'status', '', # status of message,
can be blank
# 'message', "Hi, Eric\nThis is test\nof mail.pl"); # Message (strings,
# # separated
by \n)
#
# Errors of sending mail will be in $MAIL{'errors'}
# ---- Main program ----
# require "mail.pl"
# %MAIL =
# ('from', ......, 'to, ...... ... ...);
# $MAIL{'message'} = join("\n", "Hi, ...", "test from perl", "bye");
# if (&mail())
# { print "Success!\n"; }
# else
# { print "Failure, errors:\n",$MAIL{'errors'}; }
# ---- End of main program -----
#
# Script is not very smart...yet... ;-)
##########################################################################
# Script by Gintaras Gruzdys, gincius@soften.ktu.lt
# Version 2.0, code name HELO ;-)
##########################################################################
# Now script send 'HELO your.computer.name', at begining.
# You can find error '550 Unrecognized command' in $MAIL{'errors'},
# but script don't care, if server doesn't support HELO.
##########################################################################
# Sub to get IP and name of computer, parameter - computer's name
# returns array ('ip.of.your.computer', 'name.of.computer')
sub ___get_ip_addr
{ local($computer_name) = @_;
local($name, $aliases, $addrtype, $length, @addrs) =
gethostbyname($computer_name);
($addrs[0], $name);
}
# Sub to listen a socket for a specific response of
# remote computer, eg. line 220 ok :-)
sub ___wait_for {
local($str) = @_;
local($s) = "";
local($cc) = "";
local($err) = 0; # Errors reading socket
$line_end = pack("C", 10);
while ($err < 5000)
{
do { $err++; next; } if (sysread(S, $cc, 1, 0) != 1);
$err = 0;
print $cc if ($MAIL{'debug'} && $cc ne $line_end);
do { $s .= $cc; next; } if ($cc ne $line_end);
if ($s =~ /^(\d+)\s+(.*)/)
{ if ($1 != $str)
{ $MAIL{'errors'} .=
"Mail server error: waiting $str, get $1,",
" full response:\n$s\n";
return 0; }
else
{ return 1; }
}
$s = "";
}
0;
}
# Main sub for sending mail
sub mail
{ $MAIL{'debug'} = 0 unless (defined($MAIL{'debug'}));
local($AF_INET, $SOCK_STREAM) = (2, 1);
$MAIL{'port'} = 25 unless (defined($MAIL{'port'}) &&
$MAIL{'port'} =~ /^\d+$/);
if (!defined($MAIL{'server'}))
{ $MAIL{'server'} = (___get_ip_addr('localhost'))[0];
$server = $MAIL{'server'}; }
else
{ $server = $MAIL{'server'};
if ($MAIL{'server'} !~ /^\d+\.\d+\.\d+\.\d+/)
{ $MAIL{'server'} = (___get_ip_addr($MAIL{'server'}))[0];
do { $MAIL{'errors'} .=
"MAIL: Can't obtain IP of server $server\n";
return 0; } unless $MAIL{'server'};
}
else
{ $MAIL{'server'} = pack("C" x 4, split(/\./, $MAIL{'server'}));
}
}
print "\nConnecting to mail server $server...\n" if $MAIL{'debug'};
local($sockaddr) = ('S n a4 x8');
local($name,$aliases,$proto) = getprotobyname('tcp');
local($name,$aliases,$port) = getservbyname($MAIL{'port'},'tcp');
local($this) = pack($sockaddr, $AF_INET, 0,
(&___get_ip_addr($ENV{'computername'}))[0]);
local($that) = pack($sockaddr, $AF_INET, $MAIL{'port'}, $MAIL{'server'});
# Make the socket filehandle.
if (socket(S, $AF_INET, $SOCK_STREAM, $proto))
{ print "socket ok\n" if $MAIL{'debug'}; }
else
{ $MAIL{'errors'} .= "Socket error:$!\n"; return 0; }
# Give the socket an address
if (bind(S, $this))
{ print "bind ok\n" if $MAIL{'debug'}; }
else
{ $MAIL{'errors'} .= "Bind error:$!\n"; return 0; }
# Call up the server.
if (connect(S, $that))
{ print "connect ok\n" if $MAIL{'debug'}; }
else
{ $MAIL{'errors'} .= "Connect error:$!\n"; return 0; }
select(S); $| = 1; select(STDOUT);
local($n) = pack("CC", 13, 10);
return 0 unless (&___wait_for('220'));
#### HELO
print "HELO ",(&___get_ip_addr($ENV{'computername'}))[1],"$n"
if $MAIL{'debug'};
print S "HELO ",(&___get_ip_addr($ENV{'computername'}))[1],"$n";
&___wait_for('250'); # Not critical error...
##### End HELO
print 'mail from: <', $MAIL{'from'}, "\>$n" if $MAIL{'debug'};
print S 'mail from: <', $MAIL{'from'}, "\>$n";
return 0 unless (&___wait_for('250'));
print 'rcpt to: <', $MAIL{'to'}, "\>$n" if $MAIL{'debug'};
print S 'rcpt to: <', $MAIL{'to'}, "\>$n" ;
return 0 unless (&___wait_for('250'));
print "data$n" if $MAIL{'debug'};
print S "data$n";
$MAIL{'message'} =~ s/\n/$n/g;
return 0 unless (&___wait_for('354'));
$MAIL{'date'} = localtime(time) unless (defined($MAIL{'date'}));
print "from: \"", $MAIL{'sender name'}, "\" <",$MAIL{'from'},"\>$n" if
$MAIL{'debug'};
print S "from: \"", $MAIL{'sender name'}, "\" <",$MAIL{'from'},"\>$n";
print "to: \"", $MAIL{'receiver name'}, "\" <",$MAIL{'to'},"\>$n" if
$MAIL{'debug'};
print S "to: \"", $MAIL{'receiver name'}, "\" <",$MAIL{'to'},"\>$n";
print "subject: ", $MAIL{'subject'}, "$n" if $MAIL{'debug'};
print S "subject: ", $MAIL{'subject'}, "$n";
print "date: ", $MAIL{'date'}, "$n" if $MAIL{'debug'};
print S "date: ", $MAIL{'date'}, "$n";
print "Status: ", $MAIL{'status'}, "$n" if $MAIL{'debug'};
print S "Status: ", $MAIL{'status'}, "$n";
print $MAIL{'message'}, "$n.$n" if $MAIL{'debug'};
print S $MAIL{'message'}, "$n.$n";
return 0 unless (&___wait_for('250'));
print "quit\n" if $MAIL{'debug'};
print S "quit\n";
return 0 unless (&___wait_for('221'));
close(S);
1;
} # End of mail
1;
               (
geocities.com/siliconvalley/park)                   (
geocities.com/siliconvalley)