由于PHPMailer,反馈表单挂起



我有一个反馈表单,这个脚本过滤和验证数据,并将数据写入数据库。在最底层,通过include,我与PHPMailer连接了一个脚本,PHPMailer通过gmail-smtp将反馈表单的文本发送到我的邮件中。

如果我注释掉了脚本连接,那么表单会立即或1秒后提交。有了他,他可以等2-3秒。

我通过XMLHttpRequest远程提交表单数据。成功提交后,表单将重置为零,提交按钮将变为非活动状态,并通过弹出通知显示服务器的响应。因此,我成功地按下了发送按钮2-3次,直到脚本工作,相应地,创建了几条记录,并向邮件发送了几封信。这是应该的吗?还是我配置了PHPMailer错误?

让我知道我需要附加哪些数据。这是我的PHPMailer脚本:

<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
require $_SERVER['DOCUMENT_ROOT'] . '/form/PHPMailer/PHPMailer.php';
require $_SERVER['DOCUMENT_ROOT'] . '/form/PHPMailer/Exception.php';
require $_SERVER['DOCUMENT_ROOT'] . '/form/PHPMailer/SMTP.php';
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->isSMTP(); 
$mail->SMTPDebug = 0; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
$mail->Host = gethostbyname("smtp.gmail.com");; // use $mail->Host = gethostbyname('smtp.gmail.com'); // if your network does not support SMTP over IPv6
$mail->Port = 587; // TLS only
$mail->SMTPSecure = 'tls'; // ssl is deprecated
$mail->SMTPAuth = true;
$mail->Username = 'mymail@gmail.com'; // email
$mail->Password = 'mypassword'; // password
$mail->setFrom($email, $name); // From email and name
$mail->addAddress('mymail@gmail.com', 'Admin'); // to email and name
$mail->Subject = $subject;
$mail->msgHTML("Message from: n"."<h3>".$email."</h3>n"."<h1>".$message."</h1>"); //$mail->msgHTML(file_get_contents('contents.html'), __DIR__); //Read an HTML message body from an external file, convert referenced images to embedded,
$mail->AltBody = 'HTML messaging not supported'; // If html emails is not supported by the receiver, show this body
// $mail->addAttachment('images/phpmailer_mini.png'); //Attach an image file
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->send();
// if(!$mail->send()){
//     echo "Mailer Error: " . $mail->ErrorInfo;
// }else{
//     echo "Message sent!";
// }
?>

您在这里做了一些不明智的事情。

$mail->Host = gethostbyname("smtp.gmail.com");

这将Host设置为一个文字IP地址,这反过来意味着您永远不会让它与TLS证书名称匹配。因此,您不得不禁用TLS验证,这从来都不是一件好事。如果你确切地理解你为什么这么做,以及后果是什么,那没关系,但如果不理解,你就不应该这么做。

在这个脚本中没有任何错误检查。我建议使用PHPMailer提供的gmail示例重新开始,这要小心得多。

您已经发现了为什么在web表单处理过程中使用SMTP发送到远程邮件服务器通常是个坏主意:它太慢了,部分原因是设计的。解决这个问题的最好方法是安装一个本地邮件服务器(postfix很好(,并将其配置为到你的gmail帐户的中继——如果你搜索它,你会发现很多例子。完成后,您可以向localhost提交消息,它或多或少是即时的,它将处理排队、节流、反弹等问题。

最新更新