PHPMailer werkt (voorlopig?) niet
Hoi,
Gezien sendmail stokoud is, werd me aangeraden PHPMailer te gebruiken. Ik probeer hier dan ook mee aan de slag te gaan. Het lijkt heel simpel en is gelijkaardig aan sendmail behalve dat het kan gebruik maken van SMTP.
Maar het schoentje knelt..
Zit al uren te zoeken waar mijn fout kan liggen maar ik zie het niet. Kan iemand in onderstaande code de fout zien? Mijn ogen beginnen alvast stilaan te wennen aan de foute code ;)
Html van form in index.html
---------------------------
PHP van sendmail.php
--------------------
Gezien sendmail stokoud is, werd me aangeraden PHPMailer te gebruiken. Ik probeer hier dan ook mee aan de slag te gaan. Het lijkt heel simpel en is gelijkaardig aan sendmail behalve dat het kan gebruik maken van SMTP.
Maar het schoentje knelt..
Zit al uren te zoeken waar mijn fout kan liggen maar ik zie het niet. Kan iemand in onderstaande code de fout zien? Mijn ogen beginnen alvast stilaan te wennen aan de foute code ;)
Html van form in index.html
---------------------------
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<form class="form clearfix" action="sendmail.php" method="POST">
<input type="text" class="span12" id="name" name="name" value="" placeholder="Naam">
<input type="email" class="span12" id="email" name="email" value="" placeholder="Uw e-maildres">
<input type="text" class="span12" id="subject" name="subject" value="" placeholder="Onderwerp">
<textarea class="span12" id="message" name="message" placeholder="Uw vraag of reservatie" rows="6">
</textarea>
<button class="btn btn-large pull-right" type="submit">Verzenden</button>
</form>
<input type="text" class="span12" id="name" name="name" value="" placeholder="Naam">
<input type="email" class="span12" id="email" name="email" value="" placeholder="Uw e-maildres">
<input type="text" class="span12" id="subject" name="subject" value="" placeholder="Onderwerp">
<textarea class="span12" id="message" name="message" placeholder="Uw vraag of reservatie" rows="6">
</textarea>
<button class="btn btn-large pull-right" type="submit">Verzenden</button>
</form>
PHP van sendmail.php
--------------------
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
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
<?php
require 'PHPMailerAutoload.php';
function sendemail($name, $email, $subject, $message)
{
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'mail.mijndomeinnaam.be'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'mijnemailadres'; // SMTP username
$mail->Password = 'mijnpaswoord'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('mijnemailadres', 'Wouter DM'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
}
function validate($name, $email, $subject, $message)
{
$error = '';
if($name == '')
$error = 'Please fill in your name';
if(!filter var($email, FILTER_VALIDATE_EMAIL))
$error = 'Please fill in your email';
if($subject == '')
$error = 'Please fill in a subject';
if($message == '')
$error = 'Please fill in your message';
return $error;
}
$name = '';
$email = '';
$subject = '';
$message = '';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//formulier is verzonden
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$error = validate($name, $email, $subject, $message);
if($error != '')
echo $error;
else
if (sendemail($name, $email, $subject, $message) == true)
header('Location: thankyou.html');
}
?>
require 'PHPMailerAutoload.php';
function sendemail($name, $email, $subject, $message)
{
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'mail.mijndomeinnaam.be'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'mijnemailadres'; // SMTP username
$mail->Password = 'mijnpaswoord'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('mijnemailadres', 'Wouter DM'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
}
function validate($name, $email, $subject, $message)
{
$error = '';
if($name == '')
$error = 'Please fill in your name';
if(!filter var($email, FILTER_VALIDATE_EMAIL))
$error = 'Please fill in your email';
if($subject == '')
$error = 'Please fill in a subject';
if($message == '')
$error = 'Please fill in your message';
return $error;
}
$name = '';
$email = '';
$subject = '';
$message = '';
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
//formulier is verzonden
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$error = validate($name, $email, $subject, $message);
if($error != '')
echo $error;
else
if (sendemail($name, $email, $subject, $message) == true)
header('Location: thankyou.html');
}
?>
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 16/09/2016 17:32:48 door - Ariën -
Als ik de code met de voorbeelden van PHPMailer vergelijk valt het op dat dit ontbreekt :
Klopt, de ->send() functie verstuurt de mail, en geeft een boolean terug of het wel of niet gelukt.
Sendmail is een service die draait op je server / op een mailserver en die het versturen van mails afhandelt. Dat staat los van PHP.
Mogelijk bedoel je de gewone mail() functie van php?
---
verder vind ik de functie hierboven een beetje zonde: je kunt 4 parameters ($name, $email, $subject, $message) meegeven.
Maar dat betekent dus ook dat je je direct beperkt tot die paar stukken info om mee te geven.
Je mist dan opties als CC, BCC, bijlagen etc.
Als je dan een functie maakt om jouw site gegevens direct te verpakken, dan zou ik gaan voor een class die phpmailer extend:
dan kun je in je scripts gewoon gebruiken:
Dus je verliest dan niet de mogelijkheden van PHPMailer omdat je functie eromheen daar geen rekening mee hield. En toch heb je jouw standaard gegevens altijd direct beschikbaar.
Mogelijk bedoel je de gewone mail() functie van php?
---
verder vind ik de functie hierboven een beetje zonde: je kunt 4 parameters ($name, $email, $subject, $message) meegeven.
Maar dat betekent dus ook dat je je direct beperkt tot die paar stukken info om mee te geven.
Je mist dan opties als CC, BCC, bijlagen etc.
Als je dan een functie maakt om jouw site gegevens direct te verpakken, dan zou ik gaan voor een class die phpmailer extend:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class MijnMailer extends PHPMailer
{
function __construct()
{
parent::__construct();
$this->isSMTP(); // Set mailer to use SMTP
$this->Host = 'mail.mijndomeinnaam.be'; // Specify main and backup SMTP servers
$this->SMTPAuth = true; // Enable SMTP authentication
$this->Username = 'mijnemailadres'; // SMTP username
$this->Password = 'mijnpaswoord'; // SMTP password
$this->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$this->Port = 465;
$this->setFrom('mijn naam en adres');
}
}
?>
class MijnMailer extends PHPMailer
{
function __construct()
{
parent::__construct();
$this->isSMTP(); // Set mailer to use SMTP
$this->Host = 'mail.mijndomeinnaam.be'; // Specify main and backup SMTP servers
$this->SMTPAuth = true; // Enable SMTP authentication
$this->Username = 'mijnemailadres'; // SMTP username
$this->Password = 'mijnpaswoord'; // SMTP password
$this->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$this->Port = 465;
$this->setFrom('mijn naam en adres');
}
}
?>
dan kun je in je scripts gewoon gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$mail = new MijnMailer();
$mail->Body = $message;
$mail->addAttachment('somefile.jpg');
$mail->addCC('[email protected]');
$mail->send();
?>
$mail = new MijnMailer();
$mail->Body = $message;
$mail->addAttachment('somefile.jpg');
$mail->addCC('[email protected]');
$mail->send();
?>
Dus je verliest dan niet de mogelijkheden van PHPMailer omdat je functie eromheen daar geen rekening mee hield. En toch heb je jouw standaard gegevens altijd direct beschikbaar.
Afgezien van de mail->send() functie, lukte het versturen van een mailtje door
require 'PHPMailerAutoload.php';
BINNEN de sendemail() functie te plaatsen.
Uiteraard geen garantie dat dat het echte probleem is, maar het werkte wel.
require 'PHPMailerAutoload.php';
BINNEN de sendemail() functie te plaatsen.
Uiteraard geen garantie dat dat het echte probleem is, maar het werkte wel.
Dank je wel voor de reacties
1 ----------------------------
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
------------------------------
Bovenstaande code toevoegen gaf geen resultaat. Ik dacht dat dit de mail niet verstuurde maar enkel voorwaardes zijn om de boodschappen weer te geven?
2 ----------------------------
require 'PHPMailerAutoload.php';
------------------------------
Bovenstaande code binnen de functie sendemail() zetten, leverde eveneens weinig op...
En bij jullie werkte dit allemaal?
@Ivo: Tja, meer heb ik ook niet nodig. Het moet een slank, to-the-point formuliertje blijven. En ja, het is de mail-functie dat ik bedoelde.
Mailtjes versturen en ik blijven geen goede vrienden. Enige suggesties zijn nog steeds welkom.
1 ----------------------------
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
------------------------------
Bovenstaande code toevoegen gaf geen resultaat. Ik dacht dat dit de mail niet verstuurde maar enkel voorwaardes zijn om de boodschappen weer te geven?
2 ----------------------------
require 'PHPMailerAutoload.php';
------------------------------
Bovenstaande code binnen de functie sendemail() zetten, leverde eveneens weinig op...
En bij jullie werkte dit allemaal?
@Ivo: Tja, meer heb ik ook niet nodig. Het moet een slank, to-the-point formuliertje blijven. En ja, het is de mail-functie dat ik bedoelde.
Mailtjes versturen en ik blijven geen goede vrienden. Enige suggesties zijn nog steeds welkom.
Denk dat het dit moet zijn :
kun je vertellen wat er wel gebeurt?
Foutmelding? (na het toevoegen van die controle
if($mail->send() ) {}
wat dus staat voor "als het uitvoeren van de actie Verstuur lukt"
Staat je error reporting aan?
In geval van geen foutmelding: waar leid je uit af dat het fout gaat?
Foutmelding? (na het toevoegen van die controle
if($mail->send() ) {}
wat dus staat voor "als het uitvoeren van de actie Verstuur lukt"
Staat je error reporting aan?
In geval van geen foutmelding: waar leid je uit af dat het fout gaat?
mail->SMTPDebug = 2;
volgens mij is dit wel handig
volgens mij is dit wel handig
>> Gezien sendmail stokoud is, werd me aangeraden PHPMailer te gebruiken. Ik probeer hier dan ook mee aan de slag te gaan. Het lijkt heel simpel en is gelijkaardig aan sendmail behalve dat het kan gebruik maken van SMTP.
Geen verdere opmerkingen dan de volgende, Ariën en Frank noemen je issues prima op:
De leeftijd van sendmail is onzinnig om te noemen. Recentere mailservers hebben ook de sendmail binary ivm compatibility, het is hoe dan ook geen reden om PHPMailer te gebruiken. Dè reden om PHPMailer (of SwiftMailer for that matter) te gebruiken is het gebruik van de juiste mailheaders etc, HTML mail (mime mail dus) dan hoef je daar zelf niet meer over na te denken. Vergeet alleen SPF en DKIM/DomainKeys niet.
Geen verdere opmerkingen dan de volgende, Ariën en Frank noemen je issues prima op:
De leeftijd van sendmail is onzinnig om te noemen. Recentere mailservers hebben ook de sendmail binary ivm compatibility, het is hoe dan ook geen reden om PHPMailer te gebruiken. Dè reden om PHPMailer (of SwiftMailer for that matter) te gebruiken is het gebruik van de juiste mailheaders etc, HTML mail (mime mail dus) dan hoef je daar zelf niet meer over na te denken. Vergeet alleen SPF en DKIM/DomainKeys niet.
Huidige code. Hopelijk heb ik op de juiste manier rekening gehouden met jullie opmerkingen. Maar voorlopig nog geen schot in de zaak.
Als resultaat krijg ik een witte pagina te zien. Dus geen bevestiging of foutmelding.
Toevoeging op 17/09/2016 11:09:36:
Excuseer SMTPDebug staat wel degelijk geactiveerd (// is weg in originele code)
Als resultaat krijg ik een witte pagina te zien. Dus geen bevestiging of foutmelding.
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
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
<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'mail.hostname.be'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'mijnemailadres'; // SMTP username
$mail->Password = 'mijnpaswoord'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('mailadresontvanger', 'naamontvanger'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
?>
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 2; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'mail.hostname.be'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'mijnemailadres'; // SMTP username
$mail->Password = 'mijnpaswoord'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('mailadresontvanger', 'naamontvanger'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
?>
Toevoeging op 17/09/2016 11:09:36:
Excuseer SMTPDebug staat wel degelijk geactiveerd (// is weg in originele code)
Heb je ook de email validatie aangepast?
Met 2 van de 3 suggesties die ik heb gedaan, werkt het.
Met 2 van de 3 suggesties die ik heb gedaan, werkt het.
Validatie heb ik eruit gehaald en aan bootstrap overgelaten.
Toevoeging op 17/09/2016 11:27:59:
@Adoptive: Dus bij jou werkt het? We hebben dezelfde code? Of heb je iets compleet anders?
Toevoeging op 17/09/2016 11:27:59:
@Adoptive: Dus bij jou werkt het? We hebben dezelfde code? Of heb je iets compleet anders?
. Smtp gebruik ik niet, dus dat is comment. Voor de rest werkt het zoals het hieronder is geplakt :
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
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
<?php
function sendemail($name, $email, $subject, $message) {
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
// $mail->isSMTP(); // Set mailer to use SMTP
// $mail->Host = 'mail.kpnplanet.nl'; // Specify main and backup SMTP servers
// $mail->SMTPAuth = false; // Enable SMTP authentication
// $mail->Username = 'mijnemailadres'; // SMTP username
// $mail->Password = 'mijnpaswoord'; // SMTP password
// $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
// $mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('[email protected]', 'Wouter DM'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo . '<br />' . PHP_EOL;
} else {
echo "Message sent!" . '<br />' . PHP_EOL;
}
}
function validate($name, $email, $subject, $message)
{
$error = '';
if($name == '')
$error = 'Please fill in your name';
if ( filter_var($email, FILTER_VALIDATE_EMAIL) === false )
$error = "$email is not a valid email address<br />" . PHP_EOL;
if($subject == '')
$error = 'Please fill in a subject';
if($message == '')
$error = 'Please fill in your message';
return $error;
}
$name = '';
$email = '';
$subject = '';
$message = '';
//if ( $_REQUEST["submit"] ) {
if( $_SERVER['REQUEST_METHOD'] == 'POST') {
//formulier is verzonden
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$error = validate($name, $email, $subject, $message);
if($error != '') {
echo $error;
} else {
sendemail($name, $email, $subject, $message);
//header('Location: thankyou.html');
}
}
?>
function sendemail($name, $email, $subject, $message) {
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
// $mail->isSMTP(); // Set mailer to use SMTP
// $mail->Host = 'mail.kpnplanet.nl'; // Specify main and backup SMTP servers
// $mail->SMTPAuth = false; // Enable SMTP authentication
// $mail->Username = 'mijnemailadres'; // SMTP username
// $mail->Password = 'mijnpaswoord'; // SMTP password
// $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
// $mail->Port = 465; // TCP port to connect to
$mail->setFrom($email, $name);
$mail->addAddress('[email protected]', 'Wouter DM'); // Add a recipient
$mail->addReplyTo($email, $name);
$mail->Subject = $subject;
$mail->Body = $message;
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo . '<br />' . PHP_EOL;
} else {
echo "Message sent!" . '<br />' . PHP_EOL;
}
}
function validate($name, $email, $subject, $message)
{
$error = '';
if($name == '')
$error = 'Please fill in your name';
if ( filter_var($email, FILTER_VALIDATE_EMAIL) === false )
$error = "$email is not a valid email address<br />" . PHP_EOL;
if($subject == '')
$error = 'Please fill in a subject';
if($message == '')
$error = 'Please fill in your message';
return $error;
}
$name = '';
$email = '';
$subject = '';
$message = '';
//if ( $_REQUEST["submit"] ) {
if( $_SERVER['REQUEST_METHOD'] == 'POST') {
//formulier is verzonden
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$error = validate($name, $email, $subject, $message);
if($error != '') {
echo $error;
} else {
sendemail($name, $email, $subject, $message);
//header('Location: thankyou.html');
}
}
?>
Probleem bijna opgelost. Ik krijg wel melding dat de mail is verzonden, ook via smtp.
Maar... ik krijg de mails van het formulier niet binnen in m'n mailbox...
Kan ik hier ergens error-reporting doen? Of heeft iemand een idee waar het schoentje knelt?
Toevoeging op 18/09/2016 00:37:16:
@adoptive: Alvast bedankt voor jouw hulp! Ik heb wel nog de vraag voor u waarom je "PHP_EOL;" vermeldt in de code?
Maar... ik krijg de mails van het formulier niet binnen in m'n mailbox...
Kan ik hier ergens error-reporting doen? Of heeft iemand een idee waar het schoentje knelt?
Toevoeging op 18/09/2016 00:37:16:
@adoptive: Alvast bedankt voor jouw hulp! Ik heb wel nog de vraag voor u waarom je "PHP_EOL;" vermeldt in de code?
Jouw domein van je mailadres op je lijn 19, komt die overeen met de site waar je vandaan stuurt?
probeer het ook eens met een paar andere adressen om de mail aan te sturen.
Je zult de eerste niet zijn die 3 dagen bezig is om uit te vinden dat Gmail of KPN of hosterX vindt dat de mail op spam lijkt en hem dus maar vast tegenhoudt
Je zult de eerste niet zijn die 3 dagen bezig is om uit te vinden dat Gmail of KPN of hosterX vindt dat de mail op spam lijkt en hem dus maar vast tegenhoudt




