I have a script that generates a Certificate upon form submit, as well as sends the generated certificate to the recipients email address. When i enter the details into the HTML form, and submit the form, it fails and comes up with an error saying PHPMailer unable to access the file. But when i click on REFRESH on the browser window, it then succeeds and sends the certificate via email..
My PHPMailer code is below:
<?php include 'settings.php'; //include settings
//Import PHPMailer classes into the global namespace
//These must be at the top of your script, not inside a function
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use PHPMailerPHPMailerException;
//Load Composer's autoloader
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/SMTP.php';
require 'PHPMailer-master/src/Exception.php';
if (isset($_POST['generate'])) {
$name = ucwords($_POST['name']);
$customerref = ($_POST['customerref']);
$date = ($_POST['date']);
$customeremail = ($POST['customeremail']);
//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);
try {
//Server settings
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'mail.smtp2go.com'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = 'refurbsa.com'; //SMTP username
$mail->Password = 'Y2F6ejMxbGFseTUw'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
$mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
//Recipients
$mail->setFrom('info@electronic-cemetery.com', 'Electronic Cemetery'); // this is the sender's Email address
$mail->addAddress($_POST['customeremail']); //Add a recipient
$mail->addReplyTo('info@electronic-cemetery.com', 'Electronic Cemetery');
$mail->AddAttachment (dirname(__FILE__)."/CSD-Certificates/saved-certs/destruction-cert($customerref-$date).png"); //Adds an attachment from a path on the filesystem
//Content
$mail->isHTML(true); //Set email format to HTML
$mail->Subject = 'Your E-Waste Disposal Certificate';
$mail->Body = "Good day $name,<br><br>
Thank you very much for making use of our services. Your collection has been processed and I have attached your destruction certificate to this email.
<br><br>
If you were happy with our service then it would be very much appreciated if you would spare a moment to give us your review <a href='https://www.facebook.com/eastcoastewaste/reviews'>HERE</a>
<br><br>
We look forward to assisting you with all your e-Waste needs in the future.
<br><br>
Wishing you a wonderful day further!
<br><br>
The Electronic Cemetery Team";
$mail->send();
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
}
?>
The HTML Form to input the data is below:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<div class="form-group col-sm-12">
<input type="text" name="name" class="form-control" id="name" placeholder="Enter Name Here...">
</div>
<div class="form-group col-sm-12">
<input type="text" name="weight" class="form-control" id="weight" placeholder="Enter Weight Here...">
</div>
<div class="form-group col-sm-12">
<input type="date" name="date" class="form-control" id="date" placeholder="Enter Date Here...">
</div>
<div class="form-group col-sm-12">
<input type="email" name="customeremail" class="form-control" id="customeremail" placeholder="Enter Email Address Here...">
</div>
<div class="form-group col-sm-12">
<input type="text" name="customerref" class="form-control" id="customerref" placeholder="Enter Customer Reference Here...">
</div>
<button type="submit" name="generate" class="btn btn-primary">Generate Certificate and Send to Customer</button>
</form>
And finally the script to generate the certificate:
<?php
if (isset($_POST['generate'])) {
$name = ($_POST['name']);
$name_len = strlen($_POST['name']);
$date = ($_POST['date']);
$customeremail = ($_POST['customeremail']);
$customerref = ($_POST['customerref']);
$weight = ucwords($_POST['weight']);
if ($weight) {
$font_size_weight = 50;
}
if ($name == "" || $weight == "" || $date == "" || $customeremail == "" || $customerref == "") {
echo
"
<div class='alert alert-danger col-sm-6' role='alert'>
Not all form fields have been filled in. Pleaes try again.
</div>
";
}else{
echo
"
<div class='alert alert-success col-sm-6' role='alert'>
Congratulations! The certificate for $name has been generated and sent to $customeremail.</b>
</div>
";
//designed certificate picture
$image = "CSD-Certificates/certi.png";
$createimage = imagecreatefrompng($image);
//this is going to be created once the generate button is clicked
$output = "CSD-Certificates/saved-certs/destruction-cert($customerref-$date).png";
//then we make use of the imagecolorallocate inbuilt php function which i used to set color to the text we are displaying on the image in RGB format
$white = imagecolorallocate($createimage, 254, 254, 254);
$black = imagecolorallocate($createimage, 0, 0, 0);
//Then we make use of the angle since we will also make use of it when calling the imagettftext function below
$rotation = 0;
//we then set the x and y axis to fix the position of our text name
$origin_x = 1600;
$origin_y=700;
//we then set the x and y axis to fix the position of our text weight
$origin1_x = 2300;
$origin1_y=900;
//we then set the x and y axis to fix the position of our text date 1
$origin2_x = 1850;
$origin2_y=900;
//we then set the x and y axis to fix the position of our text date at the bottom
$origin3_x = 2200;
$origin3_y=1980;
//we then set the x and y axis to fix the position of our text date at the bottom
$origin4_x = 2200;
$origin4_y=2180;
//we then set the differnet size range based on the lenght of the text which we have declared when we called values from the form
if($name_len<=7){
$font_size = 50;
$origin_x = 1600;
}
elseif($name_len<=12){
$font_size = 40;
}
elseif($name_len<=15){
$font_size = 40;
}
elseif($name_len<=20){
$font_size = 40;
}
elseif($name_len<=22){
$font_size = 40;
}
elseif($name_len<=33){
$font_size=40;
}
else {
$font_size =50;
}
$certificate_text = $name;
//font directory for name
$drFont = "CSD-Certificates/TitilliumWeb-Regular.ttf";
//function to display name on certificate picture
$text1 = imagettftext($createimage, $font_size, $rotation, $origin_x, $origin_y, $white,$drFont, $certificate_text);
//function to display weight name on certificate picture
$text2 = imagettftext($createimage, $font_size_weight, $rotation, $origin1_x+2, $origin1_y, $white, $drFont, $weight);
//function to display Date on certificate picture
$text3 = imagettftext($createimage, $font_size, $rotation, $origin2_x, $origin2_y, $white, $drFont, $date);
//function to display Date on certificate picture at the very bottom
$text4 = imagettftext($createimage, $font_size, $rotation, $origin3_x, $origin3_y, $white, $drFont, $date);
//function to display Date on certificate picture at the very bottom
$text5 = imagettftext($createimage, $font_size, $rotation, $origin4_x, $origin4_y, $white, $drFont, $customerref);
imagepng($createimage,$output,3);
?>
QUESTION:
Why does the PHPMailer only succeed with attaching the file after i have refreshed the page after it first fails?
Advertisement
Answer
I figured it out,
All i had to do was move the PHPMailer script BELOW the scrip that generates and saves the certificate and it worked. So obviously i was calling the mail function before the certificate was saved. so PHPMailer wasn’t able to find the file.