Mailfunktion in Perl erklären? :-)

Hallo,

ich habe leider keine Ahnung von Perl, aber da PHP ja leider bei diesen Servertimeout hat kann man dort leider nicht an viele E-Mail Adressen einen Newsletter verschicken. Deshalb würde ich das verschicken nun gerne über Perl realieseren. Ein Skript habe ich dazu ja schon gefunden, bei dem behauptet wird, dass es bis zu 100,000 emailadressen getestet wurde und es dort eben nicht diesen timeout gibt.


das skript lautet: und ist von http://www.webscriptworld.com

#!/usr/bin/perl

read(STDIN, $buffer, $ENV{‚CONTENT_LENGTH‘});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(„C“, hex($1))/eg;
if ($INPUT{$name}) { $INPUT{$name} = $INPUT{$name}.",".$value; }
else { $INPUT{$name} = $value; }
}

$pid = fork();
print „Content-type: text/html \n\n fork failed: $!“ unless defined $pid;

if ($pid) {

print „Content-type: text/html \n\n“;

print "List Administration

Send Status

Success!
The message was sent.

";
exit(0);
}
else {

close (STDOUT);
open(LIST,"$INPUT{‚address_file‘}");
@addresses=;
close(LIST);

foreach $line(@addresses) {
chomp($line);

open(MAIL, „|$INPUT{‚mail_prog‘} -t“) || &error(„Could not send out emails“);
print MAIL „To: $line \n“;
print MAIL „From: $INPUT{‚listname‘} \n“;
print MAIL „Subject: $INPUT{‚subject‘}\n“;
if ($INPUT{‚html‘}) {
print MAIL „MIME-Version: 1.0\n“;
print MAIL „Content-Type: text/html;\n“;
print MAIL „Content-Transfer-Encoding: 7bit\n\n“;
}
print MAIL „$INPUT{‚body‘}“;
print MAIL „\n\n“;
if ($INPUT{‚unsubchk‘}) {
print MAIL „===========================================================\n“;
print MAIL „You have received this email because you subscribed to the $INPUT{‚listname‘} Mailing Service. To unsubscribe simply visit the link below.\n“;
print MAIL „$INPUT{‚url‘}/unsub.phtml?list=$INPUT{‚list‘}&email=$line\n“;
}
print MAIL „\n\n“;
close (MAIL);
}
}

mein frage nun:

  • was passiert denn, wenn eine mailadresse nicht zustellbar ist? ist es auch möglich das irgenwie eine txt-datei zu schreiben?
  • wie bekommt man veriablen von php in das perlscript?

vielen vielen dank, wenn sich jemand die mühe machen würde mir zu helfen :smile:) … flayoo

Generell zu diesem Script: Es ist schlecht programmiert, unsicher und nicht sonderlich fehlertolerant …

#!/usr/bin/perl

:

open(LIST,"$INPUT{‚address_file‘}");
@addresses=;
close(LIST);

foreach $line(@addresses) {

:

sehr unfreundlich wenn tatsächlich 100.000 Adressen drinstehen :wink: - im Klartext: Es wird relativ viel Speicher verschwendet
besser:

open(LIST,"$INPUT{'address\_file'}");
foreach $line() {
 :
 # Mails senden (s.u.)
 :
}
close(LIST);

chomp($line);

open(MAIL, „|$INPUT{‚mail_prog‘} -t“) || &error(„Could not
send out emails“);
print MAIL „To: $line \n“;
print MAIL „From: $INPUT{‚listname‘}
\n“;
print MAIL „Subject: $INPUT{‚subject‘}\n“;
if ($INPUT{‚html‘}) {
print MAIL „MIME-Version: 1.0\n“;
print MAIL „Content-Type: text/html;\n“;
print MAIL „Content-Transfer-Encoding: 7bit\n\n“;
}

Ob das Script die 100.000 Mails raussenden kann hängt u.a. davon ab wieviel Rechenzeit Dein Webserver einem Script zubilligt. Oft werden Scripts nach einer gewisser Zeit oder nach einem gewissen rechenzeitanteil rausgekegelt - sprich zwangsweise beendet.

Abhilfe: Portionsweise senden. 1-1000, 1001-2000, …
100.000 Mails ist ein Haufen Zeug … nur wenige Provider halten da still … mit Recht übrigens …

  • was passiert denn, wenn eine mailadresse nicht zustellbar
    ist? ist es auch möglich das irgenwie eine txt-datei zu
    schreiben?

Die Mail kommt an den i.d.R. mit einer Fehlermeldung des zugehörigen Mailservers zum Absender zurück - hier: $INPUT{‚listname‘} - allerdings asynchron - also Minuten, Stunden, Tage später.

  • wie bekommt man veriablen von php in das perlscript?

per Parameterübergabe
perl script.pl parameter1 … parametern

Klaus

Re: Mailfunktion in Perl erklären?? :smile:
Hallo Flayoo,

zunächst möchte ich mich Klaus’ Ausführungen anschliessen.
Ein Timeout für Skripte ist bei vielen Providern üblich.

Zweitens hoffe ich, dass Du das Readme gelesen hast, und dass du dein Skript nicht in einem öffentlich zugänglichen Verzeichnis liegen lässt.
Wenn Hacker in deinem Namen Spam Mails senden, bist du der Gelackmeierte.

Drittens grüble ich gerade, warum das Skript hier forkt;
vielleicht fällt einem anderen Perler was dazu ein?
Folgendes Skriptbeispiel ganz stark gekürzt:


das skript lautet: und ist von http://www.webscriptworld.com

$pid = fork();
if ($pid) {
print „Content-type: text/html \n\n“;

Success!
The message was
sent.
else {
foreach $line(@addresses) {
open(MAIL, „|$INPUT{‚mail_prog‘} -t“) || &error(„Could not
send out emails“);

usw.

Wäre es nicht sinnvoller so:
Erst schreiben „Sending…“
Dann tatsächlich senden und
ERST DANACH schreiben „Gesendet.“
Schön linear und ohne Experimente.

Nochmal zum Thema Zigtausend Empfänger:
Wenn Du PHP kannst, aber Perl nicht, dann schreibe am besten den php-Teil so um, dass er nicht die ganze Liste auf einmal ans Perl übergibt.
Ein weiterer Nachteil der langen Liste ist ja auch, dass das vorliegende Skript dich bei einem Abbruch noch nicht einmal informieren würde, wieviele Mails schon gesendet wurden bis dahin.

Ingo