由于 PHPMailer,反馈表挂起

Feedback form hangs due to PHPMailer

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

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

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

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

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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 验证,这绝不是一件好事。如果你清楚地知道你为什么要这样做,以及后果是什么,那很好,但如果没有,你就不应该这样做。

此脚本中没有任何错误检查。我建议使用 the gmail example provided with PHPMailer 重新开始,这样会更加小心。

您已经发现为什么在 Web 表单处理期间使用 SMTP 发送到远程邮件服务器通常不是一个好主意:它太慢了,部分是设计使然。解决此问题的最佳方法是安装一个本地邮件服务器(postfix 很好)并将其配置为您的 gmail 帐户的中继——如果您搜索它,您会找到大量示例。完成后,您可以向 localhost 提交消息,它或多或少是即时的,并且会处理排队、限制、退回等问题。