Edit: I forgot I’d created the SendMail();
function myself, which is why the explanation doesn’t mention at first what it does.
I’m having some trouble with PHPMailer (https://github.com/PHPMailer/PHPMailer) when attempting to send two emails, one directly after the other.
The script is almost completely ‘out of the box’, with only a few modifications such as a foreach
loop to allow for multiple addresses, and everything still works perfectly.
However, if I attempt to call more than one instance of SendMail();
I get the error message:
Fatal error: Cannot override final method Exception::__clone() in .... online 0
Previously I was using the in-built mail();
function, which allowed me to use it as many times as I liked in quick succession , but it doesn’t appear to be that simple with PHPmailer:
$to = me@me.com; $to2 = me2@me2.com'; $headers = 'php headers etc'; $subject = 'generic subject'; $message = 'generic message'; mail($to, $subject, $message, $headers); mail($to2, $subject, $message, $headers);
The above would result in two identical emails being sent to different people, however I can’t easily replicate this functionality with PHPmailer.
Is there a way of stacking these requests so that I can send successive emails without it failing? Forcing the script to wait until the first email has been sent would also be acceptable, although not preferential.
As I mentioned I know it works when only one instance is called, but I don’t seem to be able to re-use the function.
I haven’t included the source code, although it is all available on the link provided above.
Thanks in advance
Edit as requested
// First Email $to = array( 'test@test.com', 'test2@test.com',); $subject = "Subject"; $message = $message_start.$message_ONE.$message_end; sendMail(); // Second Email $to = array( 'test@test.com', 'test2@test.com',); $subject = "Subject"; $message = $message_start.$message_TWO.$message_end; sendMail();
The above is how I want this to work, as it would work with mail();
. The first email will work fine, the second will not.
SendMail() code
This is from the PHPmailer website, and is what is defined as SendMail();
. The only difference from the example is the loop for AddAddress
, and the inclusion of $to
as a global variable.
$mail = new PHPMailer(); $mail->IsSMTP(); // set mailer to use SMTP $mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = "jswan"; // SMTP username $mail->Password = "secret"; // SMTP password $mail->From = "from@example.com"; $mail->FromName = "Mailer"; foreach($to as $to_add){ $mail->AddAddress($to_add); // name is optional } $mail->AddReplyTo("info@example.com", "Information"); $mail->WordWrap = 50; // set word wrap to 50 characters $mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments $mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name $mail->IsHTML(true); // set email format to HTML $mail->Subject = "Here is the subject"; $mail->Body = "This is the HTML message body <b>in bold!</b>"; $mail->AltBody = "This is the body in plain text for non-HTML mail clients"; if(!$mail->Send()) { echo "Message could not be sent. <p>"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } echo "Message has been sent";
Advertisement
Answer
You haven’t posted this code that lets me make this a complete conclusion, but from the Exception and the way you’ve defined an overriding class inside a function, you probably have class.phpmailer.php
loading every time like this:
require('class.phpmailer.php');
or
include('class.phpmailer.php');
You should change that line to
require_once('class.phpmailer.php');
The reason you need to change it to require_once
is so that PHP will not load the class file the second time when you try to create the new/second PHPMailer
class. Otherwise, the line class PHPMailer
throws the __clone()
exception.