contactmail versturen mbv phpMailer
Ik heb een contactformulier dat ik via PHPMailer verstuur.
Ik heb alle bug-meldingen aan staan. Ik heb ook getest dat het formulier meldt wanneer er iets fout is.
Dus volgens mij, heb ik alles goed staan, en nadat ik SEND heb gedaan, krijg ik de melding dat het formulier succesvol verzonden is. Echter, de mail komt niet aan!!!
Ik heb ook spam en zo gechecked, maar daar ook niks.
Mijn code:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
//Set variables
$firstname = $lastname = $email = $contactmessage = "";
$err = array();
$msg = "";
//Make function to test the input data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (empty($_POST['firstname'])) {
$err['firstname'] = "Firstname is required";
//Limit length and strip HTML tags
} else {
$firstname = test_input($_POST['firstname']);
if(!preg_match("/^[a-zA-Z ]*$/",$firstname)) {
$err['firstname'] = 'Only letters and white space allowed!';
}
}
if (empty($_POST['lastname'])) {
$err['lastname'] = "Lastname is required";
//Limit length and strip HTML tags
} else {
$lastname = test_input($_POST['lastname']);
if(!preg_match("/^[a-zA-Z ]*$/",$lastname)) {
$err['lastname'] = 'Only letters and white space allowed!';
}
}
//Make sure the address they provided is valid before trying to use it
if (empty($_POST['email'])) {
$err['email'] = 'Email is required';
} else {
$email = test_input($_POST['email']);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$err['email'] = "Invalid email format";
}
}
//Apply some basic validation and filtering to the message
if (empty($_POST['contactmessage'])) {
$err['contactmessage'] = 'What is your message';
//Limit length and strip HTML tags
} else {
$contactmessage = test_input($_POST['contactmessage']);
}
$name = $firstname.' '.$lastname;
if (count($err) == 0) {
require_once '../../data/data.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 4;
$mail->Host = $host;
$mail->Port = $port;
$mail->SMTPSecure = 'ssl';
$mail->SMTPAuth = true;
$mail->Username = $user;
$mail->Password = $pass;
//It's important not to use the submitter's address as the from address as it's forgery,
//which will cause your messages to fail SPF checks.
//Use an address in your own domain as the from address, put the submitter's address in a reply-to
$mail->setFrom = ($from.', '.$fromName);
$mail->addReplyTo($email, $name);
$mail->addAddress = ($addAddress.', '.$addName);
$mail->Subject = 'Contact request';
$body = 'Name: '.$firstname.' '.$lastname;
$body .= '<br>Email: '.$email;
$body .= '<br>Message: '.$contactmessage;
$mail->Body = $body;
$mail->AltBody = $body;
//include_once '../../data/data.php';
if ($mail->send()) {
$success = "<p style='margin-left:10%;padding-bottom:2%;width:60%'><strong>Thank you for contacting us.<br>The following message is successfully sent:</strong><br>";
$success .= $name."<br>".$email."<br>".$contactmessage."</p>";
}
else {
$fail= 'Mailer Error: ' . $mail->ErrorInfo;
}
}
}
?>
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
//Set variables
$firstname = $lastname = $email = $contactmessage = "";
$err = array();
$msg = "";
//Make function to test the input data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (empty($_POST['firstname'])) {
$err['firstname'] = "Firstname is required";
//Limit length and strip HTML tags
} else {
$firstname = test_input($_POST['firstname']);
if(!preg_match("/^[a-zA-Z ]*$/",$firstname)) {
$err['firstname'] = 'Only letters and white space allowed!';
}
}
if (empty($_POST['lastname'])) {
$err['lastname'] = "Lastname is required";
//Limit length and strip HTML tags
} else {
$lastname = test_input($_POST['lastname']);
if(!preg_match("/^[a-zA-Z ]*$/",$lastname)) {
$err['lastname'] = 'Only letters and white space allowed!';
}
}
//Make sure the address they provided is valid before trying to use it
if (empty($_POST['email'])) {
$err['email'] = 'Email is required';
} else {
$email = test_input($_POST['email']);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$err['email'] = "Invalid email format";
}
}
//Apply some basic validation and filtering to the message
if (empty($_POST['contactmessage'])) {
$err['contactmessage'] = 'What is your message';
//Limit length and strip HTML tags
} else {
$contactmessage = test_input($_POST['contactmessage']);
}
$name = $firstname.' '.$lastname;
if (count($err) == 0) {
require_once '../../data/data.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 4;
$mail->Host = $host;
$mail->Port = $port;
$mail->SMTPSecure = 'ssl';
$mail->SMTPAuth = true;
$mail->Username = $user;
$mail->Password = $pass;
//It's important not to use the submitter's address as the from address as it's forgery,
//which will cause your messages to fail SPF checks.
//Use an address in your own domain as the from address, put the submitter's address in a reply-to
$mail->setFrom = ($from.', '.$fromName);
$mail->addReplyTo($email, $name);
$mail->addAddress = ($addAddress.', '.$addName);
$mail->Subject = 'Contact request';
$body = 'Name: '.$firstname.' '.$lastname;
$body .= '<br>Email: '.$email;
$body .= '<br>Message: '.$contactmessage;
$mail->Body = $body;
$mail->AltBody = $body;
//include_once '../../data/data.php';
if ($mail->send()) {
$success = "<p style='margin-left:10%;padding-bottom:2%;width:60%'><strong>Thank you for contacting us.<br>The following message is successfully sent:</strong><br>";
$success .= $name."<br>".$email."<br>".$contactmessage."</p>";
}
else {
$fail= 'Mailer Error: ' . $mail->ErrorInfo;
}
}
}
?>
Wat is de debug-error die je krijgt?
dat is het hem nou juist, ik krijg helemaal geen error. Ik krijg de melding dat de mail succesvol verstuurd is. Maar aankomen doet ie niet
Want als je geen foutmelding krijgt, en dus lijn 93 niet wordt aangeroepen, dan is de mail bij jouw gewoon verstuurd.
Gewijzigd op 28/10/2019 14:36:50 door - Ariën -
Oké thanks. Zal eens informeren bij de provider
Waarom mogen Willem-Alexander en Máxima jou niet mailen?
De "-" staat niet in je lijstje toegestane tekens, net als letters met accenten.
Er is nog wat voor te zeggen om tekens als < te willen vermijden, maar dit is een vrij botte manier.
---
Waar komen $from en $fromName vandaan?
Zijn die ingevuld? Als ontvangende mailserver zou dat zo maar een reden kunnen zijn om de mail niet te accepteren.
En als de server van jou dan zelf maar wat invult, is dat ook vast niet wat je wilde hebben.
Ik heb uiteindelijk de fout gevonden. Ik heb de data voor user en password in een datafile buiten de domeinroot staan in een datafile. Ik had daar ook de variabele voor de setFrom en de addAddress in staat, maar dat kan kennelijk niet???
Ik heb deze twee nu direct ingevuld in de $mail->setFrom en de $mail->addAddress en nu gaat het wel goed.
Maar ik begrijp niet goed waarom het niet met een variabele werkt.
Op shared hosting omgevingen is dat vaak strikter dan je zou willen.
open base dir restriction is mogelijk de fout melding die je kreeg?
En hou ook in de gaten, of je include rekent vanaf het huidige script, of vanuit het door de browser aangeroepen script en dan juist weer niet door een geinclude script.
Ik vermoed dat er iets niet goed is in de schrijfwijze van de setFrom gegevens.
In de datafile zet ik:
en in het php script komt dan:
Dit heb ik nu dus aangepast naar:
Aangezien in deze laatste geen = voorkomt, vermoed ik dat de wijze van de variabelen invoeren niet juist is. Maar als ik daar het = teken weglaat, krijg ik ook een foutmelding
Gewijzigd op 28/10/2019 16:21:57 door tortuga web
hier stuur je 1 parameter naar setFrom: een string die begint met een email-adres en dan een komma en een naam.
In het 2e geval roep je de functie aan met 2 argumenten (beide argumenten gescheiden door een komma, zoals altijd in php)
Aanroep 1 zal mogelijk ook kunnen als je de string opbouwt met <> om het mailadres, maar dat is minder duidelijk
Toevoeging op 28/10/2019 16:50:31:
oh.
zie nu pas het = teken erbij staan:
setFrom is een function.
probeer het eens met
Toevoeging op 28/10/2019 16:55:31:
:) Ja dus
Of misschien kun je op die manier klasse-variabelen instellen.
Maar die methode wordt dan dus nooit uitgevoerd.
Maar PHPMailer heeft toch ook wel debug-mogelijkheden? Oftewel, je zou de opgestelde mail toch ook wel inhoudelijk kunnen inspecteren voordat je deze de deur uit stuurt?
Succesvolle verzending is -net zoals bij analoge post- geen enkele garantie voor succesvolle ontvangst, dus helemaal aan het einde controleren of je mail ontvangt is nou niet bepaald een goede of handige test om in te zoomen op eventuele fouten die daarvoor ergens optreden.
Gewijzigd op 28/10/2019 17:10:27 door Thomas van den Heuvel
Als $mail->send() false teruggeeft, dan moet de debug worden aangeroepen. En als in dit geval blijkt dat er deze true is, dan ligt de oorzaak bij het 'postkantoor' oftewel de provider van de SMTP-server.
Gewijzigd op 28/10/2019 17:13:14 door - Ariën -
Dan repareer je dit eerst, het heeft immers geen enkele zin om een situatie waarvan je wéét dat deze fout is (verder) te analyseren.
Los eerst de fout op, en kijk dan of het probleem nog speelt.
Aannames doen over wat er aan de hand is als je niet weet wat er aan de hand is werkt zelden in je voordeel.
Pas als je hebt geconstateerd dat alles correct de deur uit is gegaan kun je de (voorzichtige) conclusie trekken dat er verderop, en buiten jouw applicatie, mogelijk dingen misgaan.
Dit is misschien weer een voorbeeld van "het probleem is niet het probleem", het probleem is hier de aanpak van het oplossen van dit probleem. De sensoren detecteren niets, dan wordt het tijd om je ogen te gebruiken en simpelweg eens wat te debuggen door data te dumpen. Volg gewoon het kruimelpad. Al was het maar om vast te stellen dat je zelf alles goed hebt gedaan (en nu is dus al gebleken dat dit niet zo was).
Gewijzigd op 28/10/2019 17:39:25 door Thomas van den Heuvel