Mail problemen
Ik heb een website en die levert mij problemen op met de php mail functie. Iedere keer wanneer ik het een en ander opnieuw instel werkt het prima, echter alleen voor een paar dagen. Daarna krijg ik wel een succes bericht maar de mail wordt niet verstuurd. Als ik dan de betreffende pagina's van de server haal en vervolgens opnieuw upload werkt het weer een paar dagen en daarna weer niet. Ik heb met geen enkele andere website dit soort problemen. Deze website draait op een KPN server: cp.kpn.com. Ik heb geen idee of iemand dit herkent en/of mij kan vertellen hoe ik dit op kan lossen? Wellicht dat in een extern mail programma moet gebruiken? Elke suggestie is meer dan welkom
Dit kan van alles zijn.
Enkele suggesties:
- Je mail word als spam gezien, of word misbruikt als spambak, waardoor het word geblokkeerd?
- Je hebt een limiet op het versturen van mail?
- Je website is/word gehackt?
Kortom, zonder relevante code word het wat lastig om je goed te helpen.
Je zou eens kunnen kijken naar phpmailer of swiftmailer i.p.v. de mailfunctie van PHP.
Obelix en Idefix op 11/06/2017 12:02:20:
Je zou eens kunnen kijken naar phpmailer of swiftmailer i.p.v. de mailfunctie van PHP.
.. met het voordeel vat phpMailer goed kan debuggen wat er fout gaat. Dit geldt dan alleen bij SMTP in gebruik.
Maar zou het geen beter plan zijn om eerst te kijken naar waarom het om de zoveel dagen het niet meer werkt?
Een script wat werkt verandert niet zomaar "opeens".
Daar moet een achterliggend probleem zitten.
Dat zou ik eerst oplossen alvorens het weer allemaal werkend te maken.
Zit er een verschil tussen de file op de server en zoals je hem hebt geupload? Maw: verandert de file in de loop der tijd?
Dat lijkt me een serieus probleem.
Dat moet niet kunnen.
En anderzijds: als de scripts gelijk zijn, moet dat geen invloed hebben. Een php-script heeft geen max-houdbaarheidsduur.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
$ontvangers = array(
"[email protected]",
"[email protected]"
);
$aan = implode(',', $ontvangers);
$berijfs_naam = 'Canton Chinees Specialiteiten Restaurant';
$bedrijfs_email = '[email protected]';
$onderwerp = filter_input(INPUT_POST, 'onderwerp', FILTER_SANITIZE_STRING);
$naam = filter_input(INPUT_POST, 'naam', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
$telefoon = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);
$personen = filter_input(INPUT_POST, 'personen', FILTER_SANITIZE_STRING);
$daydropdown = Trim(stripslashes($_POST['dagdropdown']));
$monthdropdown = Trim(stripslashes($_POST['monthdropdown']));
$yeardropdown = Trim(stripslashes($_POST['yeardropdown']));
$hourdropdown = Trim(stripslashes($_POST['hourdropdown']));
$minutedropdown = Trim(stripslashes($_POST['minutedropdown']));
$wensen = filter_input(INPUT_POST, 'wensen', FILTER_SANITIZE_STRING);
$bericht = "";
$bericht .= "<b>Online reservering gemaakt door:</b> ";
$bericht .= "<br><br><br>";
$bericht .= "<b>Naam:</b> ";
$bericht .= $naam;
$bericht .= "<br><br>";
$bericht .= "<b>Email:</b> ";
$bericht .= $email;
$bericht .= "<br><br>";
$bericht .= "<b>Telefoon:</b> ";
$bericht .= $telefoon;
$bericht .= "<br><br>";
$bericht .= "<b>Aantal personen:</b> ";
$bericht .= $personen;
$bericht .= "<br><br>";
$bericht .= "<b>Datum:</b> ";
$bericht .= $daydropdown;
$bericht .= " ";
$bericht .= $maand;
$bericht .= " ";
$bericht .= $yeardropdown;
$bericht .= "<br><br>";
$bericht .= "<b>Tijd:</b> ";
$bericht .= $hourdropdown;
$bericht .= ":";
$bericht .= $minutedropdown . " uur";
$bericht .= "<br><br>";
$bericht .= "<b>Speciale wensen:</b>";
$bericht .= "<br><br>";
$bericht .= $wensen;
$headers = 'From: ' . $berijfs_naam . ' <' . $bedrijfs_email . '>' . "\r\n" .
'Reply-To: ' . $naam . ' <' . $email . '>' . "\r\n" .
'Return-Path: Mail-Error <' . $bedrijfs_email . '>' . "\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
'X-Priority: 1 (Highest)' . "\r\n" .
'X-MSMail-Priority: High' . "\r\n" .
'Importance: High' . "\r\n" .
'MIME-Version: 1.0' . "\r\n" .
'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$verzenden = @mail ($aan, $onderwerp, $bericht, $headers);
?>
$ontvangers = array(
"[email protected]",
"[email protected]"
);
$aan = implode(',', $ontvangers);
$berijfs_naam = 'Canton Chinees Specialiteiten Restaurant';
$bedrijfs_email = '[email protected]';
$onderwerp = filter_input(INPUT_POST, 'onderwerp', FILTER_SANITIZE_STRING);
$naam = filter_input(INPUT_POST, 'naam', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
$telefoon = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);
$personen = filter_input(INPUT_POST, 'personen', FILTER_SANITIZE_STRING);
$daydropdown = Trim(stripslashes($_POST['dagdropdown']));
$monthdropdown = Trim(stripslashes($_POST['monthdropdown']));
$yeardropdown = Trim(stripslashes($_POST['yeardropdown']));
$hourdropdown = Trim(stripslashes($_POST['hourdropdown']));
$minutedropdown = Trim(stripslashes($_POST['minutedropdown']));
$wensen = filter_input(INPUT_POST, 'wensen', FILTER_SANITIZE_STRING);
$bericht = "";
$bericht .= "<b>Online reservering gemaakt door:</b> ";
$bericht .= "<br><br><br>";
$bericht .= "<b>Naam:</b> ";
$bericht .= $naam;
$bericht .= "<br><br>";
$bericht .= "<b>Email:</b> ";
$bericht .= $email;
$bericht .= "<br><br>";
$bericht .= "<b>Telefoon:</b> ";
$bericht .= $telefoon;
$bericht .= "<br><br>";
$bericht .= "<b>Aantal personen:</b> ";
$bericht .= $personen;
$bericht .= "<br><br>";
$bericht .= "<b>Datum:</b> ";
$bericht .= $daydropdown;
$bericht .= " ";
$bericht .= $maand;
$bericht .= " ";
$bericht .= $yeardropdown;
$bericht .= "<br><br>";
$bericht .= "<b>Tijd:</b> ";
$bericht .= $hourdropdown;
$bericht .= ":";
$bericht .= $minutedropdown . " uur";
$bericht .= "<br><br>";
$bericht .= "<b>Speciale wensen:</b>";
$bericht .= "<br><br>";
$bericht .= $wensen;
$headers = 'From: ' . $berijfs_naam . ' <' . $bedrijfs_email . '>' . "\r\n" .
'Reply-To: ' . $naam . ' <' . $email . '>' . "\r\n" .
'Return-Path: Mail-Error <' . $bedrijfs_email . '>' . "\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
'X-Priority: 1 (Highest)' . "\r\n" .
'X-MSMail-Priority: High' . "\r\n" .
'Importance: High' . "\r\n" .
'MIME-Version: 1.0' . "\r\n" .
'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$verzenden = @mail ($aan, $onderwerp, $bericht, $headers);
?>
En als je nu eens GEEN foutmeldingen met de @ onderdrukt?
Maar inderdaad, waaruit blijkt dat er iets misgaat?
Het succesvol verzenden (de return-waarde van mail(), gevangen in $verzenden - doe je ook ergens iets met de waarde van deze variabele?) is geen garantie voor ontvangen. En onderweg kan er ook van alles misgaan (queue wordt niet leeggehaald, spamfilter, inbox vol etc.).
Vanuit PHP "verstuurde" berichten (met mail()) komen meestal elders in een wachtrij terecht. Deze moet weer uitgelezen worden zodat mail (verder) verstuurd wordt. In het verleden had ik serieus een provider die zei dat het niet hun probleem was dat de queue niet werd leeggehaald :p.
Misschien is het een kwestie van dit proces een schop geven, of de frequentie waarmee deze wachtrij leeggehaald wordt verhogen. Tegelijkertijd zou je eens naar de broncode van (output van) de mail kunnen kijken hoe deze er uitziet, en of deze eventueel een spamscore heeft. En dan nagaan hoe deze score omlaag gehaald kan worden.
Of eens na gaan denken hoe deze reserveringsfunctionaliteit verder geïntegreerd kan worden in een systeem/website. Een systeem via e-mail lijkt mij nogal riskant omdat:
- er blijkbaar geen garantie voor ontvangst is (wat nogal genante situaties kan creëren als iemand in de veronderstelling is dat deze gereserveerd heeft, waar dit verhaal mogelijk mee begon :p)
- er (verder) geen historie is van een reservering als deze nooit aankomt
De setting die stripslashes mogelijk nodig maakt, bestaat toch al sinds php 5.4 niet meer. En volgens mij was hij al eerder standaard OFF.
Is zou op die regels ook liever filteren alsof het een string is.
Danwel: in de opbouw van de email htmlspecialchars() gebruiken.
Weghalen van mogelijke (of onmogelijke) slashes levert geen voordeel, maar weghalen van <script>eviljavascript()</script> uit je maandkeuze wel.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public function reservering_verzendenAction()
{
$ontvangers = array(
"[email protected]"
);
setlocale(LC_TIME, 'nl_NL');
setlocale(LC_TIME, 'nld_nld'); // Windows
setlocale(LC_TIME, 'nl_NL', 'nld_nld');
$aan = implode(',', $ontvangers);
$berijfs_naam = 'Canton Amsterdam';
$bedrijfs_email = '[email protected]';
$onderwerp = filter_input(INPUT_POST, 'onderwerp', FILTER_SANITIZE_STRING);
$naam = filter_input(INPUT_POST, 'naam', FILTER_SANITIZE_STRING);
$e_mail = filter_input(INPUT_POST, 'e_mail', FILTER_SANITIZE_STRING);
$telefoon = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);
$personen = filter_input(INPUT_POST, 'personen', FILTER_SANITIZE_STRING);
$datum = filter_input(INPUT_POST, 'datum', FILTER_SANITIZE_STRING);
$tijd = filter_input(INPUT_POST, 'tijd', FILTER_SANITIZE_STRING);
$wensen = filter_input(INPUT_POST, 'wensen', FILTER_SANITIZE_STRING);
$bericht = new View('partials/reservering_mail.php', compact('naam', 'e_mail', 'telefoon',
'personen', 'datum', 'tijd', 'wensen'));
$headers = 'From: ' . $berijfs_naam . ' <' . $bedrijfs_email . '>' . "\r\n" .
'Reply-To: ' . $naam . ' <' . $e_mail . '>' . "\r\n" .
'Return-Path: Mail-Error <' . $bedrijfs_email . '>' . "\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
'X-Priority: 1 (Highest)' . "\r\n" .
'X-MSMail-Priority: High' . "\r\n" .
'Importance: High' . "\r\n" .
'MIME-Version: 1.0' . "\r\n" .
'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$verzenden = mail ($aan, $onderwerp, $bericht->render(), $headers);
if ( $verzenden == TRUE )
{
$reservering_succes = new View('partials/reservering_succes.php', compact('naam'));
echo $reservering_succes->render();
}
}
{
$ontvangers = array(
"[email protected]"
);
setlocale(LC_TIME, 'nl_NL');
setlocale(LC_TIME, 'nld_nld'); // Windows
setlocale(LC_TIME, 'nl_NL', 'nld_nld');
$aan = implode(',', $ontvangers);
$berijfs_naam = 'Canton Amsterdam';
$bedrijfs_email = '[email protected]';
$onderwerp = filter_input(INPUT_POST, 'onderwerp', FILTER_SANITIZE_STRING);
$naam = filter_input(INPUT_POST, 'naam', FILTER_SANITIZE_STRING);
$e_mail = filter_input(INPUT_POST, 'e_mail', FILTER_SANITIZE_STRING);
$telefoon = filter_input(INPUT_POST, 'telefoon', FILTER_SANITIZE_STRING);
$personen = filter_input(INPUT_POST, 'personen', FILTER_SANITIZE_STRING);
$datum = filter_input(INPUT_POST, 'datum', FILTER_SANITIZE_STRING);
$tijd = filter_input(INPUT_POST, 'tijd', FILTER_SANITIZE_STRING);
$wensen = filter_input(INPUT_POST, 'wensen', FILTER_SANITIZE_STRING);
$bericht = new View('partials/reservering_mail.php', compact('naam', 'e_mail', 'telefoon',
'personen', 'datum', 'tijd', 'wensen'));
$headers = 'From: ' . $berijfs_naam . ' <' . $bedrijfs_email . '>' . "\r\n" .
'Reply-To: ' . $naam . ' <' . $e_mail . '>' . "\r\n" .
'Return-Path: Mail-Error <' . $bedrijfs_email . '>' . "\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
'X-Priority: 1 (Highest)' . "\r\n" .
'X-MSMail-Priority: High' . "\r\n" .
'Importance: High' . "\r\n" .
'MIME-Version: 1.0' . "\r\n" .
'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$verzenden = mail ($aan, $onderwerp, $bericht->render(), $headers);
if ( $verzenden == TRUE )
{
$reservering_succes = new View('partials/reservering_succes.php', compact('naam'));
echo $reservering_succes->render();
}
}
Zou ik wellicht, zoals Obelix en Idefix al voorstelde, een extern mail programma moeten gebruiken?
Alvast bedankt
De standaard mail() functie van PHP is verder gewoon lastig te debuggen, en zeer gevoelig voor headers. Een kleine onvolkomenheid in de headers zorgt er al voor dat de boel niet verstuurd wordt.
Ikzelf raad aan om PHPmailer te gebruiken. Deze class is helemaal gebaseerd op de RFC's voor het versturen van mails. Verder is het mailen hiermee ook zeer makkelijk te doen en is het erg schaalbaar. Je kan zelf ook direct met SMTP's servers communiceren om direct een mail af te leveren buiten de interne mailserver om. Dit is ook een aanrader. Vooral op shared-hosts die vaak door vele gebruikers ongevraagd gebruikt kan worden als spambron.
Ik zou zeker eens naar deze class kijken.
Gewijzigd op 27/06/2017 21:41:38 door - Ariën -
Code (php)
1
2
2
$bericht = new View('partials/reservering_mail.php', compact('naam', 'e_mail', 'telefoon',
'personen', 'datum', 'tijd', 'wensen'));
'personen', 'datum', 'tijd', 'wensen'));
Is iets dergelijks ook mogelijk bij PHPMailer
Die inhoud van je view roep je via je class-instance op, en geeft dus een string. Een 'body' is ook een string.
Dus trek je conclusies ;-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
require_once "private/lib/PHPMailer/PHPMailerAutoload.php";
$mail = new PHPMailer;
$mail->setFrom('[email protected]', 'Canton Chinees Specialiteiten Restaurant');
$mail->addAddress('[email protected]', 'Donald Boers');
$mail->Subject = 'PHPMailer Message';
$mail->Body = 'Test.';
if(!$mail->send()) {
echo 'Bericht is niet verzonden.';
echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
echo 'Bericht is verzonden.';
}
[/code]
Lijkt me niets fout aan toch? Enige probleem is dat als ik de pagina test ik wel de succes boodschap krijg, maar het bericht dus niet wordt verzonden. Zou het dan toch aan KPN liggen, daar wordt de site gehost
require_once "private/lib/PHPMailer/PHPMailerAutoload.php";
$mail = new PHPMailer;
$mail->setFrom('[email protected]', 'Canton Chinees Specialiteiten Restaurant');
$mail->addAddress('[email protected]', 'Donald Boers');
$mail->Subject = 'PHPMailer Message';
$mail->Body = 'Test.';
if(!$mail->send()) {
echo 'Bericht is niet verzonden.';
echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
echo 'Bericht is verzonden.';
}
[/code]
Lijkt me niets fout aan toch? Enige probleem is dat als ik de pagina test ik wel de succes boodschap krijg, maar het bericht dus niet wordt verzonden. Zou het dan toch aan KPN liggen, daar wordt de site gehost
Probeer eens via SMTP en zet je SMTPdebug eens vol aan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SERVER -> CLIENT: 220 plwww03.localdomain ESMTP Postfix
CLIENT -> SERVER: EHLO www.cantonamsterdam.nl
SERVER -> CLIENT: 250-plwww03.localdomain250-PIPELINING250-SIZE 10240000250-VRFY250-ETRN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
CLIENT -> SERVER: MAIL FROM:<[email protected]>
SERVER -> CLIENT: 250 2.1.0 Ok
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: DATA
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
CLIENT -> SERVER: Date: Wed, 28 Jun 2017 12:06:54 +0200
CLIENT -> SERVER: To: Donald Boers <[email protected]>
CLIENT -> SERVER: From: Canton Chinees Specialiteiten Restaurant <[email protected]>
CLIENT -> SERVER: Subject: PHPMailer Message
CLIENT -> SERVER: Message-ID: <[email protected]>
CLIENT -> SERVER: X-Mailer: PHPMailer 5.2.13 (https://github.com/PHPMailer/PHPMailer)
CLIENT -> SERVER: MIME-Version: 1.0
CLIENT -> SERVER: Content-Type: text/plain; charset=iso-8859-1
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
CLIENT -> SERVER:
CLIENT -> SERVER: Test.
CLIENT -> SERVER:
CLIENT -> SERVER: .
SERVER -> CLIENT: 250 2.0.0 Ok: queued as 618552054B
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 221 2.0.0 Bye
Message has been sent.
CLIENT -> SERVER: EHLO www.cantonamsterdam.nl
SERVER -> CLIENT: 250-plwww03.localdomain250-PIPELINING250-SIZE 10240000250-VRFY250-ETRN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
CLIENT -> SERVER: MAIL FROM:<[email protected]>
SERVER -> CLIENT: 250 2.1.0 Ok
CLIENT -> SERVER: RCPT TO:<[email protected]>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: DATA
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
CLIENT -> SERVER: Date: Wed, 28 Jun 2017 12:06:54 +0200
CLIENT -> SERVER: To: Donald Boers <[email protected]>
CLIENT -> SERVER: From: Canton Chinees Specialiteiten Restaurant <[email protected]>
CLIENT -> SERVER: Subject: PHPMailer Message
CLIENT -> SERVER: Message-ID: <[email protected]>
CLIENT -> SERVER: X-Mailer: PHPMailer 5.2.13 (https://github.com/PHPMailer/PHPMailer)
CLIENT -> SERVER: MIME-Version: 1.0
CLIENT -> SERVER: Content-Type: text/plain; charset=iso-8859-1
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
CLIENT -> SERVER:
CLIENT -> SERVER: Test.
CLIENT -> SERVER:
CLIENT -> SERVER: .
SERVER -> CLIENT: 250 2.0.0 Ok: queued as 618552054B
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 221 2.0.0 Bye
Message has been sent.
Heb alleen geen idee waar ik naar moet kijken.
Bij Gmail weet ik dat ze anders in de Spam-box binnenkomen, en Hotmail weigert ze helemaal.
Gewijzigd op 28/06/2017 13:15:54 door - Ariën -
Heb een beetje op het KPN forum rondgekeken. Toen kwam ik een vraag tegen die een beetje het zelfde was als die van mij. Iemand rade de OP aan om
te veranderen in
Maakt dit bij jou weten enig verschil uit?
Wat is de reden dat spf.protection.outlook.com gebruikt wordt? Waarom stel je niet een record samen dat *voor jou* zin heeft? Waarschijnlijk is iets als v=spf1 a mx -all al genoeg.
Toevoeging op 28/06/2017 16:18:48:
Hallo Ben. Heb het aangepast naar jou voorbeeld, maar dat werkt ook niet. Heb wel eens gehoor van mensen die een externe mail service gebruikte. Heb echter geen idee waar ik voor moet zoeken en hoe dat werkt. Elke suggestie is meer dan welkom