![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
||||
|
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'}; |
|
||||
|
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? ![]() |
| Sponsored Links | ||
|
|
![]() |
| Bookmarks |
| Tags |
| perl, perl shift, shift, shift perl |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|