Avatar billede hobbittend Novice
26. januar 2015 - 14:34 Der er 11 kommentarer og
1 løsning

Mail() sender men modtages kun af 1/4

Hej.

Jeg forsøger at lave et script, der med et klik sender en mail til alle brugerne i min database.

Det virker tilsyneladende, og jeg modtager mailen på én adresse (samme server som afsender). Men de 3 andre jeg tester på (1: tdc-server, 2: gmail  3: samme mail og server som afsender (one.com)) modtager ingenting.

Nogen der kan hjælpe?


koden:




for ($i = 1; $i <= $f; $i++)
{
    $sql = mysql_query('SELECT u_email FROM '. USER_TABLE . ' ORDER BY u_id LIMIT '. $i . ',' . $i) or die(mysql_error        ());

    $email = mysql_result($sql, "0");
    echo $email ."<br />";
    $headers = 'From: Empires Web Game <empires@freerun-net.dk' . "\r\n" .
    'Reply-To: empires@freerun-net.dk' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    mail($email, $message_subject, $message_body, $headers);   
}
echo "Mail sent to " . $numrecipients . " recipients.<br /><br />";
}
Avatar billede nyhuus Nybegynder
26. januar 2015 - 14:47 #1
Har du opsat SPF rekord for dit domæne, så din "mail server" er tilladt at sende på domænet.

Det er ikke alle der kigger lige meget på SPF rekorden, men nogle gør - det kan være derfor den ikke når helt frem over alt.


http://www.openspf.org/SPF_Record_Syntax
Avatar billede htm Nybegynder
26. januar 2015 - 14:58 #2
Din query er nok også lidt utilsigtet. Du skal huske på at ved LIMIT så er det første argument start række, hvor 0 vil være den første række. Den næste er antallet af rækker. Og i dit eksempel skal du nok kun have en email ud af gangen, så sæt nummer to argument i din LIMIT fast til 1.
Avatar billede hobbittend Novice
26. januar 2015 - 15:29 #3
@Nyhuusdk:

Det har jeg umiddelbart aldrig hørt om, så det kan sagtens være derfor. Jeg er helt blank på hvad jeg skal gøre her..


@htm:
Er du sikker på at andet argument ikke er slutrækken?
Jeg bruger den et andet sted til at udtrække og skrive navn, score mv. på en et scoreboard, og begge steder returnerer den kun én værdi.
jeg har sat en "  echo $email ."<br />";" ind, og den lister de 4 mails i databasen op og intet andet.
Avatar billede nyhuus Nybegynder
26. januar 2015 - 15:37 #4
hobbittend:

Et simplet eksmepl på en SPF rekord kan se ud således:

v=spf1 mx:epalz.eu ip4:217.116.232.206 ~all

Det betyder at serveren med ip adressen 217.116.232.206 har ret til at sende mails på vegne af domænet epalz.eu

Dette skal du tilføje som en DNS (TXT) rekord.

Jeg kan se du bruger One.com som navne servere, så du skal ind i deres DNS kontrolpanel og tilføje den.

I deres support står der at det er muligt ved dem: http://www.one.com/en/support/faq/which-dns-records-are-available#txt

Prøv evt at kontakt deres support, hvis du ikke selv kan finde ud af at tilføje SPF rekorden, under TXT
Avatar billede htm Nybegynder
26. januar 2015 - 15:39 #5
I følge MySQLs dokumentation er det start, antal : http://dev.mysql.com/doc/refman/5.7/en/select.html

Men lister den email-adresserne er det sikkert noget med spam-filter / SPF record som nyhuisdk nævner. Du plejer bare at modtage en mail retur på fra adressen hvis en mail bliver afvist pga SPF.
Avatar billede hobbittend Novice
26. januar 2015 - 16:39 #6
Opdatering (mens jeg husker hvad jeg har gjort ;) ):

Jeg har nu tilføjet følgende linje under begge mine domæner:

v=spf1 mx:freerun-net.dk ip4:46.30.212.60 ~all

Det giver mig følgende advarsel men lader mig stadig tilføje:

Hvis din streng ser således ud: v=spf1 include:spf.protection.example.com -all
bør den ændres til at se således ud:
v=spf1 include:spf.protection.example.com include:_custspf.one.com -all



Til andre med problemet:
Sådan tilføjet man SPF records under TXT

http://www.one.com/da/support/guide/administrer-dine-dns-indstillinger#txt


Det virker foreløbigt ikke, men ændringer kan tage op til 90 minutter at træde i kraft..

opdatering følger....
Avatar billede nemlig Professor
26. januar 2015 - 18:21 #7
Jeg selv bruger phpmailer(), når jeg skal sende mails. Hos one.com sender jeg  gennem deres smtp-server og oplever stort set ingen problemer.
Avatar billede moddi100 Seniormester
26. januar 2015 - 19:36 #8
2 ting:

1) Som nemlig antyder, så bør du ikke anvende mail() funktionen når du udsende mange mails ad gangen. Det er fint til en enkel, men skal det på nogen måde kunne skalere, bør du anvende et library som phpmailer eller måske swiftmailer (ikke personlig erfaring med).
Anvend derudover også gerne deres smtp del. En anelse sværre at sætte op, men med markant bedre resultater

2) Din kode bør optimeres, så du ikke sende den samme forespørgsel til databasen flere gange. Hent i stedet for alle rækkerne ud på én gang, og gennemløb dem så:



// Hent alle rækker ud på samme tid, limit = $f rækker

$sql = mysql_query('SELECT u_email FROM '. USER_TABLE . ' ORDER BY u_id LIMIT '. $f) or die(mysql_error());

// Gennemløb alle rækkerne og udsend e-mail
while(list($email) = mysql_fetch_row($sql))
{
    echo $email ."<br />";
    $headers = 'From: Empires Web Game <empires@freerun-net.dk' . "\r\n" .
    'Reply-To: empires@freerun-net.dk' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    mail($email, $message_subject, $message_body, $headers);   
}
Avatar billede hobbittend Novice
27. januar 2015 - 09:39 #9
Det har tilsyneladende virket at tilføje SPF records under TXT.

Jeg modtager på 5 ud af 5 nu :)

Enig med Moddi100s punkt 2 =)
Af en eller anden grund har jeg hver gang haft problemer med at få hentet hele rækken ud.
Det virker dog fint med din metode :)

Mange tak.

mr. nyhuus må lige smide et svar for point :)
Avatar billede hobbittend Novice
27. januar 2015 - 09:41 #10
Mens der er liv i den her tråd, er der så nogen der kan hjælpe mig med at lave en knap der sletter en bruger fra databasen, ud fra den mail man indtaster i et felt.

jeg får det her tilbage:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '@mailinator.com' at line 1


Mailen jeg indtaster er empires@mailinator.com




Koden er:

$delete_target = htmlspecialchars(getFormVar('delete'));
$sql = mysql_query('DELETE  FROM '. USER_TABLE . ' WHERE u_email =' . $delete_target    ) or die(mysql_error());
mysql_query($sql);



Hvorfor ignorerer den det der kommer før @
Avatar billede nyhuus Nybegynder
27. januar 2015 - 09:45 #11
Godt det kom til at virke! :)
Avatar billede moddi100 Seniormester
27. januar 2015 - 15:43 #12
Opret det som et nyt spørgsmål, så tager vi den derfra
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

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