PHPMailer werkt (voorlopig?) niet
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 -
Klopt, de ->send() functie verstuurt de mail, en geeft een boolean terug of het wel of niet gelukt.
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.
require 'PHPMailerAutoload.php';
BINNEN de sendemail() functie te plaatsen.
Uiteraard geen garantie dat dat het echte probleem is, maar het werkte wel.
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.
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?
volgens mij is dit wel handig
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.
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)
Met 2 van de 3 suggesties die ik heb gedaan, werkt het.
Toevoeging op 17/09/2016 11:27:59:
@Adoptive: Dus bij jou werkt het? We hebben dezelfde code? Of heb je iets compleet anders?
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');
}
}
?>
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?
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