Avatar billede Mathias48 Nybegynder
19. juli 2009 - 15:23 Der er 24 kommentarer og
1 løsning

problem med mail()

hej eksperten.

Jeg har nu rodet rigtig lang tid med det ene probelm at den simpelthen ikke vil sende en mail! I det første stykke tid da jeg programmerede på scriptet virkede det fint, men pludselig virker det bare ikke! :S

Her er min kode :

<?php
if(isset($_POST[opret])) {

$tjek = array('brugernavn' => $_POST[brugernavn], 'password' => $_POST[password], 'password_g' => $_POST[password_g], 'email' => $_POST[email]);

if(empty($tjek[brugernavn]) || empty($tjek[password]) || empty($tjek[password_g]) || empty($tjek[email])) {

echo "Et af felterne er tomme";
$fejl = false;
}
       
if($tjek[password] != $tjek[password_g]) {
echo "Dit password og gentag password skal være identiske";
$fejl = false;
}
else {
$fejl = true;
if(ereg("^.+@.+\\..+$", $tjek[email]) && $fejl) {
require("db.php");
$resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '$tjek[email]'");
$number = mysql_num_rows($resultat);//Tæller antaller af resultater
echo mysql_error();
if($number == 0) {
mail("$tjek[email]","emne","Besked","from:email");
if(mail("$tjek[email]","emne","Besked","from:email")) {
echo "Mailen er nu sendt";
}
}
if($number > 0) {
echo "Mailen blev ikke sendt da din mailadresse allerede findes i vores database";
}
                       
else {
echo "Mailen blev ikke sendt";
}
                   
}
               
}
}
else {
echo "du trykkede ikke på opret";
}

?>

Den eneste fejl jeg får er "mailen blev ikke sendt" :S
Jeg kan virkelig ikke finde fejlen!

Mvh. Mathias
Avatar billede mbm2016 Nybegynder
19. juli 2009 - 15:59 #1
Skal du ikke bare udskifte den første if sætning så din kode ser således ud: prøv i hvert fald denne kode:

<?php
if(isset($_POST[opret])) {

$tjek = array('brugernavn' => $_POST[brugernavn], 'password' => $_POST[password], 'password_g' => $_POST[password_g], 'email' => $_POST[email]);

if(empty($tjek[brugernavn]) || empty($tjek[password]) || empty($tjek[password_g]) || empty($tjek[email])) {

echo "Et af felterne er tomme";
$fejl = false;
}
       
if($tjek[password] != $tjek[password_g]) {
echo "Dit password og gentag password skal være identiske";
$fejl = false;
}
else {
$fejl = true;
if(ereg("^.+@.+\\..+$", $tjek[email]) && $fejl) {
require("db.php");
$resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '$tjek[email]'");
$number = mysql_num_rows($resultat);//Tæller antaller af resultater
echo mysql_error();
if($number == 1) {
mail("$tjek[email]","emne","Besked","from:email");
if(mail("$tjek[email]","emne","Besked","from:email")) {
echo "Mailen er nu sendt";
}
}
if($number > 0) {
echo "Mailen blev ikke sendt da din mailadresse allerede findes i vores database";
}
                       
else {
echo "Mailen blev ikke sendt";
}
                   
}
               
}
}
else {
echo "du trykkede ikke på opret";
}

?
Avatar billede nemlig Professor
19. juli 2009 - 15:59 #2
Virker lidt suspekt...
$number vil jeg foreslå, at du kigger nærmere på.

Prøv at debugge ved at sætte

echo $number.'Antal<br>';

ind lige under
echo "Mailen blev ikke sendt";

Noget tyder på, at variablen ikke har nogen værdi.
Avatar billede mbm2016 Nybegynder
19. juli 2009 - 15:59 #3
hov manglede lige et krokodilletegn i enden sådan her:
<?php
if(isset($_POST[opret])) {

$tjek = array('brugernavn' => $_POST[brugernavn], 'password' => $_POST[password], 'password_g' => $_POST[password_g], 'email' => $_POST[email]);

if(empty($tjek[brugernavn]) || empty($tjek[password]) || empty($tjek[password_g]) || empty($tjek[email])) {

echo "Et af felterne er tomme";
$fejl = false;
}
       
if($tjek[password] != $tjek[password_g]) {
echo "Dit password og gentag password skal være identiske";
$fejl = false;
}
else {
$fejl = true;
if(ereg("^.+@.+\\..+$", $tjek[email]) && $fejl) {
require("db.php");
$resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '$tjek[email]'");
$number = mysql_num_rows($resultat);//Tæller antaller af resultater
echo mysql_error();
if($number == 1) {
mail("$tjek[email]","emne","Besked","from:email");
if(mail("$tjek[email]","emne","Besked","from:email")) {
echo "Mailen er nu sendt";
}
}
if($number > 0) {
echo "Mailen blev ikke sendt da din mailadresse allerede findes i vores database";
}
                       
else {
echo "Mailen blev ikke sendt";
}
                   
}
               
}
}
else {
echo "du trykkede ikke på opret";
}

?>
Avatar billede nemlig Professor
19. juli 2009 - 16:05 #4
Hov - din mail() funktion ser forkert ud. Du skal ikke have anførselstegn omkring variabler.
Avatar billede nemlig Professor
19. juli 2009 - 16:09 #5
Og så virker det også forkert med dine if-sætninger.
Prøv at kigge nærmere på $number.

Du tjekker nemlig, om der er nogle rækker i databasen.
Hvis ikke, er det OK, og $number sættes til 0, hvorfor emailen skal sendes.

Du sender altså emailen, når $number = 0. Men lige under tjekker du igen, om $number > 0 og hvis ikke, så giver den fejlteksten "Mailen blev ikke sendt".

Det hænger ikke sammen at emailen skal sendes, hvis værdiene er 0, og den samtidig skal skrive en fejltekst.
Avatar billede mbm2016 Nybegynder
19. juli 2009 - 16:14 #6
Kan godt forstå du ivrigt prøver at få point, der er næsten det samme jeg lige har rettet i koden og givet ham ;)
Avatar billede nemlig Professor
19. juli 2009 - 16:23 #7
mbm2007: Jeg tror vist, at vi snakker om noget forskelligt.

Du sætter $number til 1. Emailen skal netop ikke sendes, hvis $number sættes til 1, idet emailadressen i så fald er registreret i databasen.
Ellers er jeg ikke med på koden.... (og det kan sagtens være).

Jeg nævner også noget om anførselstegn om variablen i mail()-funktionen.

Har svært ved at se, at det har sammenhæng med det, du skriver.
Avatar billede nemlig Professor
19. juli 2009 - 16:27 #8
Og så bidrager jeg ikke i dette forum for at tjene point. Kig blot på mit point-tal. ;)
Jeg har fået masser af hjælp herinde, og "sover lidt bedre om natten", når jeg kan give lidt tilbage igen.
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:28 #9
Tak for de mange svar, grunden til at mailadressen ikke må ligge i databasen er jo fordi at det er en form hvor man skal kunne oprette sig som bruger, og det kommer til at blive sådan at hvis emailen allerede står i databasen at man så har mulighed for at generere et nyt brugernavn og password hvis man har glemt det.

Men jeg har nu prøvet at løbe hele koden igennem igen, men bare hvor at $tjek[email] er min email hos one.com og ellers er alt det samme. Og på one.com der kommer mailen fint frem og browseren skriver at "mailen er nu sendt" men det virker stadig ikke hverken hos gmail eller hotmail.com, jeg vil jo så tro at det har noget med et spam filter at gøre? men hvordan undgår jeg det?
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:32 #10
Det skal lige siges at min nye kode ser således ud:

<?php
if(isset($_POST[opret])) {

    $tjek = array('brugernavn' => $_POST[brugernavn], 'password' => $_POST[password], 'password_g' => $_POST[password_g], 'email' => $_POST[email]);

        if(empty($tjek[brugernavn]) || empty($tjek[password]) || empty($tjek[password_g]) || empty($tjek[email])) {
                echo "Et af felterne er tomme";
                $fejl = false;
        }
       
            if($tjek[password] != $tjek[password_g]) {
                echo "Dit password og gentag password skal være identiske";
                $fejl = false;
            }
            else {
                    require("db.php");
                    $resultat = mysql_query("SELECT * FROM forum_login WHERE `e-mail` = '$tjek[email]'");
                    $number = mysql_num_rows($resultat);//Tæller antaller af resultater
                    echo mysql_error();
                   
                        if($number > 0) {
                            echo "Mailen blev ikke sendt da din mailadresse allerede findes i vores database";
                            $fejl = false;
                        }
                            else {
                                $fejl = true;
                                    if(ereg("^.+@.+\\..+$", $tjek[email]) && $fejl) {
                                        if($number == 0) {
                                            if(mail("$tjek[email]","emne","Besked","from:email")) {
                                                echo "Mailen er nu sendt";
                                            }
                                        }
                                    }
                                                else {
                                                    echo "Mailen blev ikke sendt";
                                                }
                   
                            }
               
                }
}
else {
    header("location: http://www.carbon-crystal.dk/forum/index.php?side=login/opret_bruger.php");
}
?>
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:38 #11
hov det var den gamle

den nye:

<?php
if(isset($_POST[opret])) {

    $tjek = array('brugernavn' => $_POST[brugernavn], 'password' => $_POST[password], 'password_g' => $_POST[password_g], 'email' => $_POST[email]);

        if(empty($tjek[brugernavn]) || empty($tjek[password]) || empty($tjek[password_g]) || empty($tjek[email])) {
                echo "Et af felterne er tomme";
                $fejl = false;
                exit;
        }
       
            if($tjek[password] != $tjek[password_g]) {
                echo "Dit password og gentag password skal v&aelig;re identiske";
                $fejl = false;
                exit;
            }
            else {
                    require("db.php");
                    $resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '$tjek[email]'");
                    $number = mysql_num_rows($resultat);//Tæller antaller af resultater
                    echo mysql_error();
                   
                        if($number > 0) {
                            echo "Mailen blev ikke sendt da din mailadresse allerede findes i vores database";
                            $fejl = false;
                            exit;
                        }
                            else {
                                $fejl = true;
                                    if(ereg("^.+@.+\\..+$", $tjek[email]) && $fejl) {
                                        if($number == 0) {
                                            if(mail("$tjek[email]","emne","Besked","from:email")) {
                                                echo "Mailen er nu sendt";
                                            }
                                        }
                                    }
                                                else {
                                                    echo "Mailen blev ikke sendt";
                                                }
                   
                            }
               
                }
}
else {
    echo "du trykkede ikke på opret";
}
?>

men har stadig problemer med gmail og hotmail?
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:38 #12
problemet er at hvis jeg sender til hotmail eller gmail så skriver den slet ikke noget, hverken at beskeden er sendt eller at den ikke er :S
Avatar billede nemlig Professor
19. juli 2009 - 16:49 #13
Jeg er ikke sikker, men manglende brug af header, kan måske være årsag til, at nogle email-servere afviser emailen.
Jeg bruger selv phpmailer, hvor opsætning af header er en leg.
Og jeg bruger også one.com, og har ikke oplevet disse problemer.

Og det virker lidt underligt på mig, at det virker, når du sætter anførselstegn om din email-variabel("$tjek[email]"):

if(mail("$tjek[email]","emne","Besked","from:email")) {

Og denne sætning virker også forkert på mig, idet du har apostrof rundt om din variabel.

$resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '$tjek[email]'");

Er du sikker på, at det virker korrekt. Prøv at angive en emailadresse, som allerede er i din database.
Så skal den jo gerne fange det, men jeg tvivler.....
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:56 #14
jeg er 100 på at min mysql forespørgelse virker, jeg tjekket efter med echo $number; og det virkede 100 %

Har prøvet at ændre det til

if(mail($tjek[email],"emne","Besked","from:email")) {

virker stadig ikke med hotmail :(

har også prøvet med 3 header, no go
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 16:59 #15
har også prøvet med kun

<?php
if(mail("min_mail@hotmail.com","emne","Besked","from:email")) {
echo "Mailen er nu sendt";
}
?>

det virker heller ikke :S
Avatar billede nemlig Professor
19. juli 2009 - 17:21 #16
Jeg kommer lige til at tænke på, at one.com også har drillet mig på et tidspunkt.
Det var fordi, at "from" var sat til en email-adresse, som ikke er på domænet.
Prøv at sætte en from-emailadresse, som er på det domæne, hvor det script afvikles fra.
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 18:39 #17
Du havde helt ret! Det var from der var noget i vejen med!

Jeg ændrede det til "from:no-replay@domæne" og så virkede det!

mange mange tak!!!

hvis du vil have point så skriv et svar :D:D
Avatar billede nemlig Professor
19. juli 2009 - 18:48 #18
Det var da godt.
Jeg kan stadig ikke forstå, at din SQL-query virker korrekt.
Jeg vil mene, at den altid returnerer 0 linjer, da '$tjek[email]' ikke er en variabel pga. af apostroferne.

Kan du få $number til at være 1, hvis du i dit email-inputfelt angiver en adresse, der er registreret i din DB.
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 21:09 #19
hmmm når jeg har '$tjek[email]' returnerer den 1 som den skal da mailen står i databasen

Det undrede også mig i starten, men hvis jeg bare skrev:
$tjek[email]

så kommer følgende fejl :

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /customers/carbon-crystal.dk/carbon-crystal.dk/httpd.www/forum/login/opret_bruger_step2.php on line 18
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@hotmail.com' at line 1

(det skal lige siges at værdien af $tjek[mail] er min_mail@hotmail.com da følgende kom)
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 21:12 #20
men linje 18 er linjen med "$number = mysql_num_rows($resultat);" hmmm
Avatar billede nemlig Professor
19. juli 2009 - 21:16 #21
Sorry - jeg tror det er mig, som er forkert på den.
Jeg skriver det på denne måde:

$resultat = mysql_query("SELECT * FROM `table` WHERE `e-mail` = '".$tjek['email']."'");
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 21:24 #22
nååå ja det kan man jo også :) men mange tak for hjælpen !
Avatar billede nemlig Professor
19. juli 2009 - 21:41 #23
Når du angiver dine post- og databasevariabler, bør du gøre med $_POST['variabel'] / $row['variabel'].
Det er vist nok sikkerhedsmæssigt bedst.
Avatar billede Mathias48 Nybegynder
19. juli 2009 - 21:44 #24
nååh okay tak !

Jeg har ingen uddannelse med hensyn til programmering så jeg prøver mig jo bare frem ;) men hvorfor er det mest sikkert ved du det?

Jeg suger al viden om programmering jeg kan til mig :)
Avatar billede nemlig Professor
19. juli 2009 - 22:21 #25
Vi er i samme båd...:)

Jeg har lært mit ved at suge til mig. Derfor har jeg heller ikke altid den bedste forklaring.

Prøv fx at læse lidt om sikkerhed og læg mærke til at hver gang, der angives en post- eller sql-variabel, så anvendes der kolon eller apostrofer.

http://www.phpbegynder.dk/artikler.php?id=24&page=1
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