我正在使用PHPMailer 5.2 但是每次我尝试发送邮件时,它都会发送两次。所以接收者两次收到一封邮件。我没有在主班上做任何改变。请帮助我。
class Mail{
static function send($data){
$mail = new PHPMailer;
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = MAIL_HOST; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = MAIL_USERNAME; // SMTP username
$mail->Password = MAIL_PASSWORD; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = MAIL_PORT; // TCP port to connect to
$mail->SingleTo = true;
$mail->setFrom(MAIL_FROM_ID, MAIL_FROM_NAME);
$mail->addAddress($data['email'], $data['name']); // Add a recipient
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
if(!$mail->send()) {
return false;
} else {
return true;
}
}
}
我使用此代码发送mail =>
class Index extends Controller{
public function index(){
$data['email'] = 'kunalkhanx@gmail.com';
$data['name'] = 'Kunal Khan';
$data['subject'] = 'Hello Mr. Kunal Khan';
$data['body'] = '<h1>Welcome in frsh Bazar</h1>';
Mail::send($data);
}
}
答案 0 :(得分:0)
您可能会收到重复项,因为SingleTo与SMTP传输不兼容。 SingleTo仅适用于“sendmail”或“mail”传输,而不适用于SMTP。如果将SingleTo与SMTP一起使用,则只会忽略此参数而不会出现任何错误或警告,并且您可能会获得重复项。但这非常不可取,因为$ data ['email']参数中只有一个收件人地址。试着评论一下SingleTo系列,看看它是否会有所不同。
SMTP协议的设计方式是,您无法向多个不同的收件人发送一封邮件,每个收件人在“收件人:”字段中只有自己的地址。要使每个收件人在TO:中只有其名称,必须再次传输整个邮件。这解释了为什么SingleTo与SMTP不兼容。
根据PHPMailer库的作者,计划在PHPMailer 6.0的发行版中弃用SingleTo,并在7.0中删除。作者已经解释说,最好控制向更高级别的多个收件人发送,因为PHPMailer不是邮件列表发件人。他们告诉我们不鼓励使用PHP mail()函数,因为它非常难以安全使用; SMTP更快,更安全,并提供更多控制和反馈。由于SMTP与SingleTo不兼容,PHPMailer的作者将删除SingleTo,而不是SMTP。
另一个,最可能的原因可能是你的代码被调用了两次,而PHPMailer正确地完成了所有操作。要检查这一点,请在函数中添加简单的日志记录,这样每次调用函数时都会写入日志字符串。因此,您可以计算您的函数被调用的次数:两次或一次。
如果您可以访问服务器上的php错误日志,只需将error_log()添加到send()函数的开头,例如
error_log($data['email']);
因此,您将从日志中看到该函数实际被调用了多少次。只是不要忘记从代码中删除error_log行。如果您无权访问错误日志文件,请使用file_put_contents:
file_put_contents($filepath, date("r", time())." ". $data['email'].PHP_EOL, FILE_APPEND);
在调用它之前,将$ filepath设置为您有权访问的文件的路径名。