The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Mail command in UNIX Shilpi UNIX for Dummies Questions & Answers 0 05-15-2008 06:02 AM
Command line/Script to send E-mail with HTML body and binary attachment G-Man AIX 3 04-18-2007 09:30 PM
command line send mail ejbrever UNIX for Dummies Questions & Answers 1 08-29-2006 07:30 PM
One line perl command rsg00usa Shell Programming and Scripting 2 12-14-2005 05:45 PM
perl on the command line.. moxxx68 Shell Programming and Scripting 2 03-30-2005 01:31 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 11-22-2002
jy2728 jy2728 is offline
Registered User
  
 

Join Date: Nov 2002
Posts: 10
E-Mail from command line for UNIX and Perl??

Hi

Is there any way to use UNIX and Perl to automate sending e-mail. I got a dynamic changing file that send out to people in my mailing list and want to experinment to see if Perl and UNIX can send it out for me when the content is change. I found a Perl source code but dont really know how to use it can any one help
CODE for perl:
%mailcfg = (
# List of SMTP servers:
'smtp' => [ qw( localhost ) ],
#'smtp' => [ qw( mail.mydomain.com ) ], # example

'from' => '', # default sender e-mail, used when no From header in mail

'mime' => 1, # use MIME encoding by default

'retries' => 1, # number of retries on smtp connect failure
'delay' => 1, # delay in seconds between retries

'tz' => '', # only to override automatic detection
'port' => 25, # change it if you always use a non-standard port
'debug' => 0 # prints stuff to STDERR
);
require Exporter;
use strict;
use vars qw(
$VERSION
@ISA
@EXPORT
@EXPORT_OK
%mailcfg
$default_smtp_server
$default_smtp_port
$default_sender
$TZ
$use_MIME
$address_rx
$debug
$log
$error
$retry_delay
$connect_retries
);
use Socket;
use Time::Local; # for automatic time zone detection

eval("use MIME::QuotedPrint");
$mailcfg{'mime'} &&= (!$@);

@ISA = qw(Exporter);
@EXPORT = qw(&sendmail);
@EXPORT_OK = qw(
%mailcfg
time_to_date
$default_smtp_server
$default_smtp_port
$default_sender
$TZ
$address_rx
$debug
$log
$error
);
my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\w\x3D\x3F]+';
my $user_rx = $word_rx
.'(?:\.' . $word_rx . ')*' ;
my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';

$address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
; # v. 0.6

sub time_to_date {

my $time = $_[0] || time(); # default to now if no argument

my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @wdays = qw(Sun Mon Tue Wed Thu Fri Sat);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
= localtime($time);

$TZ ||= $mailcfg{'tz'};

if ( $TZ eq "" ) {
# offset in hours
my $offset = sprintf "%.1f", (timegm(localtime) - time) / 3600;
my $minutes = sprintf "%02d", ( $offset - int($offset) ) * 60;
$TZ = sprintf("%+03d", int($offset)) . $minutes;
}
return join(" ",
($wdays[$wday] . ','),
$mday,
$months[$mon],
$year+1900,
sprintf("%02d", $hour) . ":" . sprintf("%02d", $min),
$TZ
);
}
sub sendmail {

$error = '';
$log = "Mail::Sendmail v. $VERSION - " . scalar(localtime()) . "\n";

local $_;
local $/ = "\015\012";

my (%mail, $k,
$smtp, $server, $port, $connected, $localhost,
$message, $fromaddr, $recip, @recipients, $to, $header,
);

sub fail {
# things to do before returning a sendmail failure
print STDERR @_ if $^W;
$error .= join(" ", @_) . "\n";
close S;
return 0;
}

foreach $k (keys %mailcfg) {
if ($k =~ /[A-Z]/) {
$mailcfg{lc($k)} = $mailcfg{$k};
}
}

...
while (@_) {
# arrange keys case
$k = ucfirst lc(shift @_);

if (!$k and $^W) {
warn "Received false mail hash key: \'$k\'. Did you forget to put it in quotes?\n";
}

$k =~ s/\s*:\s*$//o; # kill colon (and possible spaces) at end, we add it later.
$mail{$k} = shift @_;
}

$smtp = $mail{'Smtp'} || $mail{'Server'} || $default_smtp_server;
unshift @{$mailcfg{'smtp'}}, $smtp if ($smtp and $mailcfg{'smtp'}->[0] ne $smtp);

delete $mail{'Smtp'}; delete $mail{'Server'};

$mailcfg{'port'} = $mail{'Port'} || $default_smtp_port || $mailcfg{'port'} || 25;
delete $mail{'Port'};

$mailcfg{'retries'} = $connect_retries if defined($connect_retries);
$mailcfg{'delay'} = $retry_delay if defined($retry_delay);

{
local $^W = 0;
$message = join("", $mail{'Message'}, $mail{'Body'}, $mail{'Text'});
}

delete $mail{'Message'}; delete $mail{'Body'}; delete $mail{'Text'};


$fromaddr = $mail{'From'} || $default_sender || $mailcfg{'from'};
unless ($fromaddr =~ /$address_rx/) {
return fail("Bad or missing From address: \'$fromaddr\'");
}
$fromaddr = $1;

$mail{Date} ||= time_to_date() ;
$log .= "Date: $mail{Date}\n";


$message =~ s/^\./\.\./gom; # handle . as first character
$message =~ s/\r\n/\n/go; # normalize line endings, step 1 of 2 (next step after MIME encoding)

$mail{'Mime-version'} ||= '1.0';
$mail{'Content-type'} ||= 'text/plain; charset="iso-8859-1"';

unless ( $mail{'Content-transfer-encoding'}
|| $mail{'Content-type'} =~ /multipart/io )
{
if ($mailcfg{'mime'}) {
$mail{'Content-transfer-encoding'} = 'quoted-printable';
$message = encode_qp($message);
}
else {
$mail{'Content-transfer-encoding'} = '8bit';
if ($message =~ /[\x80-\xFF]/o) {
$error .= "MIME::QuotedPrint not present!\nSending 8bit characters, hoping it will come across OK.\n";
warn "MIME::QuotedPrint not present!\n",
"Sending 8bit characters, hoping it will come across OK.\n"
if $^W;
}
}
}

$message =~ s/\n/\015\012/go; # normalize line endings, step 2.

# Get recipients
{ # don't warn for undefined values below
local $^W = 0;
$recip = join(", ", $mail{To}, $mail{Cc}, $mail{Bcc});
}

delete $mail{'Bcc'};

@recipients = ();
while ($recip =~ /$address_rx/go) {
push @recipients, $1;
}
unless (@recipients) {
return fail("No recipient!")
}

$localhost = (gethostbyname('localhost'))[0] || 'localhost';

foreach $server ( @{$mailcfg{'smtp'}} ) {
# open socket needs to be inside this foreach loop on Linux,
# otherwise all servers fail if 1st one fails !??! why?
unless ( socket S, AF_INET, SOCK_STREAM, (getprotobyname 'tcp')[2] ) {
return fail("socket failed ($!)")
}

print "- trying $server\n" if $mailcfg{'debug'} > 1;

$server =~ s/\s+//go; # remove spaces just in case of a typo
# extract port if server name like "mail.domain.com:2525"
($server =~ s/.+)$//o) ? $port = $1 : $port = $mailcfg{'port'};
  #2 (permalink)  
Old 11-22-2002
jy2728 jy2728 is offline
Registered User
  
 

Join Date: Nov 2002
Posts: 10
The code is too long won't fit on one thread here is the rest of the code:

$smtp = $server; # save $server for use outside foreach loop

my $smtpaddr = inet_aton $server;
unless ($smtpaddr) {
$error .= "$server not found\n";
next; # next server
}

my $retried = 0; # reset retries for each server
while ( ( not $connected = connect S, pack_sockaddr_in($port, $smtpaddr) )
and ( $retried < $mailcfg{'retries'} )
) {
$retried++;
$error .= "connect to $server failed ($!)\n";
print "- connect to $server failed ($!)\n" if $mailcfg{'debug'} > 1;
print "retrying in $mailcfg{'delay'} seconds...\n";
sleep $mailcfg{'delay'};
}

if ( $connected ) {
print "- connected to $server\n" if $mailcfg{'debug'} > 3;
last;
}
else {
$error .= "connect to $server failed\n";
print "- connect to $server failed, next server...\n" if $mailcfg{'debug'} > 1;
next; # next server
}
}

unless ( $connected ) {
return fail("connect to $smtp failed ($!) no (more) retries!")
};

{
local $^W = 0; # don't warn on undefined variables
# Add info to log variable
$log .= "Server: $smtp Port: $port\n"
. "From: $fromaddr\n"
. "Subject: $mail{Subject}\n"
. "To: ";
}

my($oldfh) = select(S); $| = 1; select($oldfh);

chomp($_ = <S>);
if (/^[45]/ or !$_) {
return fail("Connection error from $smtp on port $port ($_)")
}

print S "HELO $localhost\015\012";
chomp($_ = <S>);
if (/^[45]/ or !$_) {
return fail("HELO error ($_)")
}

print S "mail from: <$fromaddr>\015\012";
chomp($_ = <S>);
if (/^[45]/ or !$_) {
return fail("mail From: error ($_)")
}

foreach $to (@recipients) {
if ($debug) { print STDERR "sending to: <$to>\n"; }
print S "rcpt to: <$to>\015\012";
chomp($_ = <S>);
if (/^[45]/ or !$_) {
$log .= "!Failed: $to\n ";
return fail("Error sending to <$to> ($_)\n");
}
else {
$log .= "$to\n ";
}
}

print S "data\015\012";
chomp($_ = <S>);
if (/^[45]/ or !$_) {
return fail("Cannot send data ($_)");
}

foreach $header (keys %mail) {
$mail{$header} =~ s/\s+$//o; # kill possible trailing garbage
print S "$header: ", $mail{$header}, "\015\012";
};


print S "\015\012",
$message,
"\015\012.\015\012";

chomp($_ = <S>);
if (/^[45]/ or !$_) {
return fail("message transmission failed ($_)");
}

print S "quit\015\012";
$_ = <S>;
close S;

return 1;
}

Can anyone also tell me what is a perl module and how to use it, the site i got the code from keep saying it is a module and need to download it, can unix do the same thing without using perl?
  #3 (permalink)  
Old 11-23-2002
LivinFree's Avatar
LivinFree LivinFree is offline Forum Advisor  
Goober Extraordinaire
  
 

Join Date: Jul 2001
Location: Portland, OR, USA
Posts: 1,584
I don't know much about PERL, but I sincerely hope this is not about to be used for "bulk advertising", or SPAM...
  #4 (permalink)  
Old 11-23-2002
jy2728 jy2728 is offline
Registered User
  
 

Join Date: Nov 2002
Posts: 10
NO!!! This is not for spam, it is a list of games i got that send out to all my friends! I just kept forget to send it all the time so i though it be great if it automatically send out when it update!
  #5 (permalink)  
Old 11-26-2002
LivinFree's Avatar
LivinFree LivinFree is offline Forum Advisor  
Goober Extraordinaire
  
 

Join Date: Jul 2001
Location: Portland, OR, USA
Posts: 1,584
Perhaps write a shell script that runs from cron?
I would do something like this:
Put the file size (or better yet, the md5sum) in a file somewhere
Each time the shell script runs (say twice a day from cron), it checks to make sure the list is the same. If it's the same, the script exits. If it's different, it calls the perl script, then updates it's comparison file...

Should be a fun little project!
Sponsored Links
Closed Thread

Bookmarks

Tags
perl, perl shift, shift, shift perl

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 03:14 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0