Avatar billede terra Nybegynder
03. september 2003 - 20:45 Der er 26 kommentarer og
2 løsninger

Sende emai til en $brugernummer fra en database

Jeg skal sette opp et cgi som søger i en enkel database efter brugernummer som skrives ind i form_skriv_ind_nummer.html.
Databasen skal ha kun to felt: nummer og email. Hvis den finder bruger så sender den en print "tekst" til email som står i databasen.
Skal bruge $mailprog = '/sendmail' der.

Kan jeg lave denne databasen som en *.txt fil som cgi kan lese/hente emailadressen ifra?
Er det noen som kan hjelpe?

MVH Terra
Avatar billede dinox Nybegynder
03. september 2003 - 22:52 #1
Hvis du ikke skal redigere ret meget i din database, så kan du godt. Jeg ville selv gøre det i mysql, men hvis du ikke gider sætte dig ind i mysql, så kan du godt gøre det i en txt-fil.

Så kan du fx. gemme dataen sådan:
1,blah@blah.com
2,blah@hotmail.com
3,someone@hotmail.com
... og så videre, med ny linie efter hver adresse.

I dit script kan du så: åbne filen, læse den ind i et array, lave en foreach $line(@file), split'e ved kommaet (,), og så checke om det før kommaet er lig med det tal du har tastet ind i form'en, og hvis det er, så sende dit brev til email adressen.

Du kommer så til at kører hele databasen igennem hver gang du skal sende en mail, men det går så hurtigt at det lægger du ikke mærke til.

Håber du kan bruge det til noget, ellers spørg.
Avatar billede mfalck Praktikant
04. september 2003 - 09:20 #2
jeg vil give dinox ret - det kan blive besværligt at vedlige holde; perl har lidt problemer med at rette i filer, så skal man genskrive filen.

Alternativet er hvis du stadig vil bruge en tekst-fil at benytte dig af XML. Der findes perlmoduler til håndtering af disse.
Avatar billede terra Nybegynder
04. september 2003 - 17:22 #3
dinox -> Tak for din svar, mfalck -> velkommen
Jeg ska ta den txt varianten og prøve på, da den skal ikke oppdateres ved bruk av Perl.
Kan jere hjelpe meg i gang med den CGI søgebiten i txt filen?
Den skal søge i:

test_bruger.txt med

547,blah@blah.com
828,blah@hotmail.com

og ha input fra FORM med:
INPUT name=brugernummer

Terra
Avatar billede mfalck Praktikant
04. september 2003 - 22:21 #4
æh tak for velkomsten .. tror jeg :-)

mener du noget i stil med:


use FileHandle;

my $fh = new FileHandle ("< test_bruger.txt");
my @ary;
my $email;
while (<$fh>) {
  @ary=split /,/;
  $email = $ary[1];
  sendemail($email);


}
Avatar billede terra Nybegynder
05. september 2003 - 00:22 #5
mfalck -> Jep! ... men ...
jeg endret din

sendemail($email); til
print($email);

for at tjekke, og den giver meg:

blah@blah.com
blah@hotmail.com

det samme hva jeg skriver ind i formen.
Den skal skrive kun en email for brugernummer=(input fra formen)
og if false print'nummer er forkert';
Avatar billede dinox Nybegynder
05. september 2003 - 00:49 #6
Er lidt træt nu, men prøv dette:

use CGI ":all";
use FileHandle;

my $formnum = param('nummer');  #for at få dit nummer fra html-formen. Jeg regner med at nummer-field'et i formen hedder "nummer"

my $fh = new FileHandle ("< test_bruger.txt");
my @ary;

while (<$fh>) {
  @ary=split /,/;  # her splitter du, så $ary[0] er det før kommaet, og $ary[1] er det efter kommaet, altså adresserne
  if($ary[0]==$formnum){  # du manglede bare denne IF-sætning
    open(NEWSLETTER, "|/usr/sbin/sendmail -t") or die "Sendmail Offline: $!\n";
    print NEWSLETTER "From: YourName <yourname\@emailadress.dk>\n";
    print NEWSLETTER "To: <$ary[1]>\n";
    print NEWSLETTER "Subject: Flere nyheder!! \n";
    print NEWSLETTER "Og her skriver du dit indhold";
    close (NEWSLETTER) or warn "sendmail didn't close nicely";
    }
}
Avatar billede mfalck Praktikant
05. september 2003 - 08:26 #7
ja sorry - "sendemail" skulle forstås som en funktion som sender email til brugeren.
Avatar billede terra Nybegynder
07. september 2003 - 00:17 #8
mfalck -> Vi er veldig nær her :)
Jeg har problem med 'if else' der.
Den skriver også for hver =! $ary, se ned ->:

use CGI ":all";
use FileHandle;

my $formnum = param('nummer');  #for at få dit nummer fra html-formen. Jeg regner med at nummer-field'et i formen hedder "nummer"

my $fh = new FileHandle ("< test_bruger.txt");
my @ary;

while (<$fh>) {
  @ary=split /,/;  # her splitter du, så $ary[0] er det før kommaet, og $ary[1] er det efter kommaet, altså adresserne
  if($ary[0]==$formnum){  # du manglede bare denne IF-sætning
print  "<$ary[1]>" }
#    open(NEWSLETTER, "|/usr/sbin/sendmail -t") or die "Sendmail Offline: $!\n";
#    print NEWSLETTER "From: YourName <yourname\@emailadress.dk>\n";
#    print NEWSLETTER "To: <$ary[1]>\n";
#    print NEWSLETTER "Subject: Flere nyheder!! \n";
#    print NEWSLETTER "Og her skriver du dit indhold";
#    close (NEWSLETTER) or warn "sendmail didn't close nicely";
else { print  "forkert kode ! " } # kan ikke ha den her, den leser hver @ary
}

# Any ideas?
Avatar billede dinox Nybegynder
07. september 2003 - 14:06 #9
Prøv at erstatte fra while og ned efter, med dette nedenfor:(du har glemt et par semikolonner.)

while (<$fh>){
  @ary=split /,/;
  if($ary[0]==$formnum){
    print  "$ary[1]";
    }
  else{
    print  "forkert kode ! ";
    }
}
Avatar billede terra Nybegynder
07. september 2003 - 14:52 #10
dinox -> mange tak for hjelpen, men ... hvis
##
else{
    print  "forkert kode ! ";
##
ligger i while (<$fh>) sow
... den printer for hver linie fra -> test_bruger.txt

jeg får som output:
forkert kode ! blah@hotmail.com
hvis koden er korrekt
eller:
forkert kode ! forkert kode !
hvis den er forkert.
Avatar billede dinox Nybegynder
07. september 2003 - 15:00 #11
Jamen, hvorfor fjerner du så ikke bare "else"??

hvis det er meget vigtigt for dig så kan du gøre sådan:
my $success;
while (<$fh>){
  @ary=split /,/;
  if($ary[0]==$formnum){
    $success="den fundne email adresse er: $ary[1]";
    }
}
unless($success){
$success="Der kunne desværre ikke findes nogen adresse på dette nummer!";
}

print"$success";
Avatar billede terra Nybegynder
07. september 2003 - 22:08 #12
dinox -> Denne biten fungerer meget bra nu :)

Jeg har satt opp 'MAIL' biten og her har et lite problem med:
##
print NEWSLETTER "To: <$ary[1]>\n"; # den blir forkert
##
problemmet ligger i '\' før @.
Output blir her:
To: <blah@hotmail.com
> # med '>' nede

når jeg bruger:
print NEWSLETTER "To: <mig\@mig.com>\n"; # alt går bra

Hvordan kan jeg sette ind '\' i $ary[1] før @
Avatar billede mfalck Praktikant
07. september 2003 - 22:09 #13
du kan sætte en

chomp

ind - det fjerner \n
Avatar billede mfalck Praktikant
07. september 2003 - 22:09 #14
eller

chop
Avatar billede terra Nybegynder
07. september 2003 - 22:31 #15
Hmm ... det var ikke '\' men
<$ary[1]> blir til:

<blah@hotmail.com
> # med '>' nede

mfalck ->
chop " <$ary[1]>"; ? eller?
Avatar billede mfalck Praktikant
07. september 2003 - 22:36 #16
måske

$mailadr = chomp $ary[1];

print NEWSLETTER "To: <$mailadr>\n"
Avatar billede mfalck Praktikant
07. september 2003 - 22:37 #17
Avatar billede terra Nybegynder
07. september 2003 - 22:46 #18
mfalck ->

$mailadr = chomp $ary[1]; # chomp there
print NEWSLETTER "To: <$mailadr>\n"

Output:
<1>

$mailadr = chop $ary[1]; # chop there
print NEWSLETTER "To: <$mailadr>\n"

Output:
<
>
Avatar billede mfalck Praktikant
07. september 2003 - 23:26 #19
$mailadr = chomp ($ary[1]); # chomp there
Avatar billede terra Nybegynder
08. september 2003 - 17:07 #20
mfalck ->

$mailadr = chomp ($ary[1]); # chomp there
print NEWSLETTER "To: <$mailadr>\n"

Output:
To: <1>

Den blir forkert ...
Avatar billede mfalck Praktikant
08. september 2003 - 17:28 #21
hmm ..mystisk;

prøv lige

$tmp = $ary[1];
$mailadr = chomp $tmp;
print NEWSLETTER "To: <$mailadr>\n";
Avatar billede terra Nybegynder
08. september 2003 - 17:58 #22
Det det samme -> To: <1>

Problemmet liger i den siste ">"
<$ary[1]> blir til:

<blah@hotmail.com
> # med '>' nede

Hvis jeg skriver:
<$ary[1] blir det ikke linieskift, output:
<blah@hotmail.com # utem ">" men ... den sender ikke mail
Avatar billede terra Nybegynder
08. september 2003 - 17:59 #23
utem = uten :)
Det det = det
Avatar billede mfalck Praktikant
08. september 2003 - 22:08 #24
aaah - jeg testede lige lidt selv .. hvis man tildeler chomp $var så bliver det antallet af tegn den har slettet.

chomp $ary[1]; # chomp there
print NEWSLETTER "To: <$ary[1]>\n";
Avatar billede terra Nybegynder
08. september 2003 - 22:51 #25
Jiiipiii!! :D
Avatar billede terra Nybegynder
08. september 2003 - 22:59 #26
Terra skrur opp points to 130 og deler ud
Avatar billede mfalck Praktikant
08. september 2003 - 23:09 #27
jeg bukker og takker :-)
Avatar billede terra Nybegynder
08. september 2003 - 23:11 #28
Takk for hjelpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester