Fagzal blogja

Csatornák : MIND    USA - személyes  (31)   Perl 5  (3)   Random  (4)  
http://fagzal.kepeslap.com/blog/t84
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ő

A feladat: egy adott képfile átméretezése úgy, hogy a létrejövő kép egy előre megadott méretű téglalapba beférjen, és ne torzuljon (tartsa meg a méretarányait). Lehetőleg a script minél több formátumot ismerjen.

Mellébeszélés helyett lássuk egyből a kódot!

Thumbnail Generator

use strict;      
use Image::Magick;   

# szelesseg, magassag definicio, file-ok megadasa
my ($width$height$infile$outfile) = (160,160'./kep.jpg'
   './ujkep.png');

# object letrehozasa, kep beolvasasa
my $im = Image::Magick->new;
my $read = $im->Read($infile);
$read && die($read);

# EREDETI szelesseg, magassag beolvasasa
my ($w$h) = $im->Get('width','height');
print "Beolvasva: $infile. Meret: $w x $h\n";

# Aranyok megallapitasa, uj meret kiszamitasa
my ($neww$newh);
if ($w/$h > $width/$height) {
   $neww = $width;
   $newh = int($h * ($neww/$w));
else {
   $newh = $height;
   $neww = int($w * ($newh/$h));
}
print "Az uj meret: $neww x $newh\n";

# Tenyleges atmeretezes, kimentes
$im->Resize('width' => $neww'height' => $newh);
$im->Write($outfile);
print "Kesz.\n";


Ez a kód meglehetősen "kiherélt", mindössze a minimális dolgokat tudja. A felhasznált képmanipuláló modul az ImageMagick, amely véleményem szerint az egyik legjobb képmanipuláló csomag (egy C library-ról van szó, amihez a Perl modul csak egy binding).
A képet beolvassuk, méretarányai szerint kiszámoljuk a thumbnail méretét, majd kicsinyítünk. Akkor is átméretezünk, ha "nem kell", vagyis ha a forráskép eleve kisebb, mint a megadott téglalap - házi feladat, hogy ez ne így legyen .

Ja, és igen: az ImageMagick igazából egyetlen utasítással is tud thumbnail-t készíteni, de ezzel most ne törődjünk
 

A bejegyzés közvetlen címe : http://fagzal.kepeslap.com/blog/b92
Hozzászólások száma:2


Át a galériára!»

Perl 5
bejegyzések
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

Archivum
rss newsfeed icon

Több képeslapküldő!
Cím: édes...
: 394
: 2006-12-11 10:49:26
Cím: cuki...
: 419
: 2006-12-11 10:43:53
Cím: édes...
: 474
: 2006-12-11 10:49:52
Cím: cuki...
: 501
: 2006-12-11 10:43:36
Cím: cuki...
: 600
: 2006-12-11 10:44:43
Cím: édes...
: 283
: 2006-12-11 10:50:16
Cím: cuki...
: 625
: 2006-12-11 10:43:20
Cím: Szeretettel...
: 461
: 2006-12-11 10:54:40
Cím: cuki...
: 541
: 2006-12-11 10:44:24
Cím: Szeretettel...
: 432
: 2006-12-11 10:22:23
Cím: Szeretettel...
: 594
: 2006-12-11 10:22:53
Cím: édes...
: 407
: 2006-12-11 10:50:37