Fagzal blogja

Csatornák : MIND    USA - személyes  (31)   Perl 5  (3)   Random  (4)  
Triviális hírlevél küldő
2007, Június 1., 14 óra

Gyakori feladat: van egy címlistánk, ugyanazt az e-mailt ki kell küldenünk mindegyik címre. Egy meglehetősen primitív megoldást adnék erre lentebb.

A program első paramétereként a címlistát várja (txt file, soremelésekkel lezárva, egy e-mail egy sor), másodiknak a kiküldendő e-mail file-ját. A kiküldendő file első sora a feladó e-mail címe, második a levél tárgya, harmadiktól maga a levél.

ISO-8859-2 kódkészletet feltételezünk mint a subject-re, mind a levél törzsére!

Primitiv hírlevél küldő
use strict;
use MIME::Lite;
use Slurp;
use Regexp::Common qw/Email::Address/;
use MIME::Words qw/encode_mimeword/;

# buffer nem
$|=1;

# elso parameter: e-maileket tartalmazo file
die("$ARGV[0] not found\n"unless (-f $ARGV[0]);
# masodik parameret: txt file, amit kikuldunk
die("$ARGV[1] not found\n"unless (-f $ARGV[1]);
# file tartalma: from, subject, body
my ($from,$subject$body) = 
   (slurp($ARGV[1]) =~ /(.*?)\n(.*?)\n(.*)$/s);

print "Subject: $subject\nFrom: $from\n";
# ISO-8859-2 -t feltetelezunk, ezert kodolnunk kell!
$subject = encode_mimeword($subject'Q''ISO-8859-2');

# emailek beolvasasa, soronkent szetbontasa, majd be a tombbe
my (@emails) = split(/\n/, slurp($ARGV[0]));

# kiirjuk az alapadatokat es varakozunk egy kicsit
print scalar @emails" darab e-mail cimre kuldjuk...\n";
foreach my $i (0..5) { print 5-$i"\r"sleep(1); }

# tenyleges levelkuldo ciklus
foreach my $line (@emails) {
   # e-mail cim ellenorzes, biztos ami biztos
        if ($line !~ /($RE{Email}{Address})/) {
                print "\nHibas cim: $line";
                next;
        }
        print "\nTo: $1";
   # mehet egy mail
        my $mail = MIME::Lite->new(
                'From'          => $from,
                'Subject'       => $subject,
                'To'            => $1,
                'Data'          => $body
        );
   $mail->attr('content-type.charset' => 'ISO-8859-2');
   $mail->send();
}
print "\nKesz.\n";


Az encode_mimeword-öt használjuk a subject megfelelő kodolására (ez nem tökéletes így, de erről majd valamikor máskor), levélküldésre a MIME::Lite-ot.

Ez a program így ahogy van működik, de használni "as-is" annyira nem ajánlom . Ha valaki ténylegesen üzembe szeretné helyezni, javaslom:
- bemeneti paraméterek jobb ellenőrzését, hibaüzenetekkel
- beolvasott file-ok (főleg az e-mail file) ellenőrzését, bolondbiztosabb feldolgozását
- szöveg kódolásának ellenőrzése
- teszt beépítése (kiküldés egy címre)
- tényleges mailküldő résznél hibaellenőrzés (legalább egy "eval" blokk)
- "nohup"-os, background-os futtatást
- stdout log-olását, hogy legyen valami nyomunk, ha küldés közben valamiért elhalálozik a script

A bolondbiztossá tétel egy ilyen feladatnál igen fontos: több ezer címre hibásan e-mailt küldeni meglehetős leégést eredményezet...
 

A bejegyzés közvetlen címe : http://fagzal.kepeslap.com/blog/b93
A bejegyzés nem kommentezhető


Át a galériára!»

1. Triviális hírlevél küldő
   2007, Június 1., 14h
2. Első ujjgyakorlat: thumbnail-ek készítése
   2007, Május 31., 15h
3. Perl blog - ez miez?
   2007, Május 29., 23h
További bejegyzések
1.-  11.-   21.-   31.-  

Archivum
rss newsfeed icon

Több képeslapküldő!
Cím: Vibrátorverseny
: 1533
: