[perl]Gegevens uit database filteren

Pagina: 1
Acties:

  • ChrisSirhc
  • Registratie: December 2001
  • Niet online
Ik heb een database waar ik alle e-mail adressen uit wil
filteren. Volgens mij moet dat mogelijk zijn; ik weet
alleen niet hoe.

De database ziet er zo uit:
test@test.nl;;;;http://www.test.nl;;;;nederlands;;;;k2ij366.dial.kabelfoon.nl;;;;Mon Oct 2 15:20:12 MEST 2000
test@test.nl;;;;http://www.test.nl;;;;nederlands;;;;k2ij366.dial.kabelfoon.nl;;;;Mon Oct 2 15:20:12 MEST 2000
test@test.nl;;;;http://www.test.nl;;;;nederlands;;;;k2ij366.dial.kabelfoon.nl;;;;Mon Oct 2 15:20:12 MEST 2000

Alleen dan met steeds andere gegevens :)
email;;;;url;;;;taal;;;;ip;;;;datum

Hier zou toch vrij eenvoudig een scriptje voor gemaakt
kunnen worden dat de e-mail adressen eruit filtert?

Het huidige script is als volgt:

#!/usr/local/bin/perl
###############################
# Define Script Variables #
###############################
($admin='test@test.nl'); #Change this to your email address
($datafile='list.dat'); #This is the file that holds the addresses, Should be chmod 777
($sendmail='/usr/lib/sendmail'); #This is the path to sendmail
($messagepage='message.htm'); #This is the Message Template page
($adminpassword='test'); #Change this to your admin password
($addedmessage='U bent succesvol toegevoegd!'); #Change this to your Welcome Message
###############################
&parse;
&direct; #This tells the program what to do.
exit;


###############################
# Sub Routines for the Script #
###############################

sub direct{
($query=$ENV{'QUERY_STRING'});
if($query eq "Add"){
if($address eq "No"){
($message="Ongeldig e-mail adres, $address!\n");
&messagepage;
exit;
}
&lookforaddress;
if($found eq "Yes"){
($message="De URL: $url is al toegevoegd.\n");
}
else{
&addaddress;
($message="Bedankt, je website: $url is toegevoegd. \n");
}
&messagepage;
}
elsif($query eq "Delete"){
if($address eq "No"){
($message="Ongeldig e-mail adres!\n");
&messagepage;
exit;
}
&lookforaddress;
if($found eq "Yes"){
($message="De URL: $url kan niet verwijderd door u, stuur een e-mail naar de beheerder.\n");
}
else{
($message="De URL: $url staat niet in de database!\n");
}
&messagepage;
}
elsif($query eq "Send"){
if($password ne $adminpassword){
($message='Admin. Password is Incorrect!');
&messagepage;
exit; #if password is wrong then exit
}
&sendthismail;
($message='Mail Sent!');
&messagepage;
}
else{
($message='Nothing to Do!');
&messagepage;
}
}

#sub parse{
sub parse{
&parseit(*input);
($address=$input{'address'});
($letter=$input{'letter'});
($password=$input{'password'});
($subject=$input{'subject'});
($url=$input{'url'});
($realm=$input{'realm'});
($host=$ENV{'REMOTE_HOST'});
($ip=$ENV{'REMOTE_ADDR'});
($date=`date`);
chomp($date);
if($address =~ m/@/){
#it's ok
}
else{
($address="No");
}
}


#sub sendmail
sub sendthismail{
open(DATA, "<$datafile");
@data=<DATA>;
close(DATA);
foreach(@data){
($address, $url, $realm, $host, $date)=split(';;;;', $_);
open(MAIL, "|$sendmail -t $address");
print MAIL "To: $address\n";
print MAIL "From: $admin\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "Beste internetter,\n";
print MAIL "\n";
print MAIL $letter;
close(MAIL);
sleep(1);
}
}

#sub deleteaddress
sub deleteaddress{
open(DATA, "<$datafile");
@data=<DATA>;
close(DATA);
foreach(@data){
($addressfile, $rest)=split(';;;;', $_);
if($addressfile eq $address){
$_="";
}
}
open(DELETED, ">$datafile");
print DELETED @data;
close(DELETED);
}

#sub addaddress
sub addaddress{
open(ADD, ">>$datafile");
print ADD "$address;;;;$url;;;;$realm;;;;$host;;;;$date\n";
close(ADD);
open(MAIL, "|$sendmail -t $address");
print MAIL "To: $address\n";
print MAIL "From: $admin\n";
print MAIL "Subject: Toevoeging \n";
print MAIL "\n";
print MAIL "Beste internetter,\n";
print MAIL "\n";
print MAIL $addedmessage;
print MAIL "\n";
print MAIL "\nAdded By:\nHost: $host\nI.P.: $ip\nDate: $date\n";
print MAIL "\n";
close(MAIL);
}


#sub lookforaddress
sub lookforaddress{
open(DATA, "<$datafile");
while(<DATA>){
($address2,$url2,$realm2,$host2,$date2)=split(';;;;', $_);
if($url2 eq $url){
($found = "Yes");
close(DATA);
}
}
close(DATA);
}

#Sub messagepage
sub messagepage{
&head;
open(PAGE, "<$messagepage");
while(<PAGE>){
$_ =~ s/<!--Message Here-->/$message/i;
print $_;
}
close(PAGE);
}


#Sub head
sub head{
print "Content-Type: text/html\n\n";
print "\n";
}

sub parseit {
local (*in) = @_ if @_;
local ($i, $key, $val);
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
@in = split(/[&;]/,$in);
foreach $i (0 .. $#in) {
$in[$i] =~ s/\+/ /g;
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
$in{$key} .= $val;
$in{$key} =~ s/\*|\$|\<|\>|\#|\%//gi;
}
return scalar(@in);
}

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Regexp's. Kan je ook al je code hier weghalen, heeft er weinig tot niets mee te maken :)

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
#sub lookforaddress
sub lookforaddress{
open(DATA, "<$datafile");
while(<DATA>){
($address2,$url2,$realm2,$host2,$date2)=split(';;;;', $_);
if($url2 eq $url){
($found = "Yes");
close(DATA);
}
}
close(DATA);
}
?>

hier zoekt ie op de url..

zoiets zou toch ook moeten werken voor de e-mail!?!?

You are the all-dancing, all-singing crap of the world - Jack


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Jah, zoiets jah.

let op, hij staat aan het begin van de regel, dus je moet kijken of je een ; tegenkomt en hetgene wat ervoor zit is het email.

  • ChrisSirhc
  • Registratie: December 2001
  • Niet online
Oke, dat is wel zo, maar dan nog is er geen output.
Hij vindt wel e-mail adressen, maar die krijg je dan
niet te zien.

  • tomato
  • Registratie: November 1999
  • Niet online
Ja duh zet er een print tussen ofzo :?

Dit is nog altijd een programmeerforum, niet een script-request forum ofzo...

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 13 december 2001 18:01 schreef ChrisSirhc het volgende:
Oke, dat is wel zo, maar dan nog is er geen output.
Hij vindt wel e-mail adressen, maar die krijg je dan
niet te zien.
Tja, hoe moet ik je hier nu mee helpen?
Aan scriptrequests doen we hier trouwens niet want het is overduidelijk dat je dit niet zelf geschreven hebt.


ik haat rotte tomaten :( ;)

  • tomato
  • Registratie: November 1999
  • Niet online
Nielsz: ik haat rotte tomaten :( ;)
*KUCH*

:P

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 13 december 2001 18:07 schreef tomato het volgende:

[..]

*KUCH*

:P
8-) :P

  • ChrisSirhc
  • Registratie: December 2001
  • Niet online
Ik heb hem inderdaad niet helemaal zelf gemaakt. Is
bovendien al weer een tijdje geleden, en ik heb in de
tussentijd niks gedaan aan scripting. Ben een beetje
de kneepjes kwijt, vandaar dat ik hoopte dat hier
iemand is die wel weet hoe dit makkelijk op te lossen is.

  • PolarWolf
  • Registratie: November 2001
  • Laatst online: 26-05 15:23

PolarWolf

Debian, of course.

Op donderdag 13 december 2001 18:22 schreef ChrisSirhc het volgende:
Ik heb hem inderdaad niet helemaal zelf gemaakt. Is
bovendien al weer een tijdje geleden, en ik heb in de
tussentijd niks gedaan aan scripting. Ben een beetje
de kneepjes kwijt, vandaar dat ik hoopte dat hier
iemand is die wel weet hoe dit makkelijk op te lossen is.
Uit perlfunc split:
Example:

open(PASSWD, '/etc/passwd');
while (<PASSWD>) {
($login, $passwd, $uid, $gid,
$gcos, $home, $shell) = split(/:/);
#...
}
Dus:
#sub sendmail
sub sendthismail{
open(DATA, "<$datafile");
while(<DATA>) {
($address, $url, $realm, $host, $date, @rest)=split(/;/, $_);
open(MAIL, "|$sendmail -t $address");
print MAIL "To: $address\n";
print MAIL "From: $admin\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "Beste internetter,\n";
print MAIL "\n";
print MAIL $letter;
close(MAIL);
sleep 1;
}
close DATA;
}
zal waarschijnlijk wel werken.
Geldt ook voor alle andere splitjes.

De discussie scripting vs. programming is veel te lastig om zo even in een threadje te voeren.
Sterker nog, ik ben er niet helemaal van overtuigd of er eigenlijk wel een verschil is...

/* EDIT
Oh shit...record verkeerd gelezen.
De field separator *is* ';;;;'.
Welke geit heeft dit bedacht?
Anyway, discard above comments, zou gewoon moeten werken.
Suggestie: Afhankelijk van wat je scrippie precies does is het misschien handiger om het zo te scrijven dat er een eenduidige methode van openen is...nu heeft elke sub z'n eigen methode van file afhandeling.
*/

Undernet #linux, Undernet #ipsec


  • ChrisSirhc
  • Registratie: December 2001
  • Niet online
Oke, alles goed en wel, maar hoe los ik dit nu op?

Verwijderd

ik denk dat dit wel moet gaan lukken:
code:
1
2
3
4
5
6
7
open(HTML,"$config_ddir/$line.cgi");
@lijntjes = <HTML>;
close(HTML);

foreach $lijntje(@lijntjes) {
@line = split /\;\;\;\;/, $lijntje;
}

Je kunt nu in de foreach het emailadres aanroepen met:
$line[0]
mail me maar als het nog nie lukt.

Fox
Pagina: 1