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
---------------------------
<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>



PHP van sendmail.php
--------------------

<?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');
}


?>

Als ik de code met de voorbeelden van PHPMailer vergelijk valt het op dat dit ontbreekt :

if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
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:


<?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');
}
}

?>

dan kun je in je scripts gewoon gebruiken:

<?php

$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.
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.

Denk dat het dit moet zijn :

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === true)
$error = 'Please fill in your email';
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?

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>

In geval van geen foutmelding: waar leid je uit af dat het fout gaat?
mail->SMTPDebug = 2;

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.
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.

<?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';
}
?>

[size=xsmall]Toevoeging op 17/09/2016 11:09:36:[/size]

Excuseer SMTPDebug staat wel degelijk geactiveerd (// is weg in originele code)

Reageren