我正在使用PHPMailer向用户发送忘记密码的电子邮件,当用户将电子邮件提交到页面下方的代码时,需要几分钟才能加载!我不希望电子邮件立即发送,但有没有办法让它在重定向用户的同时仍然发送电子邮件?
我对php很新,所以我可能会错过一些简单的东西。
这是我的代码:
<?php
define('DB_NAME', '#######');
define('DB_USER', '#######');
define('DB_PASSWORD', '#######');
define('DB_HOST', 'localhost');
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if (!$conn) {
die('Could not connect: ' . mysqli_connect_error());
}
$recovery = $_POST['recovery'];
$sql = "SELECT forgotpass FROM members WHERE username = '$recovery'";
$result=mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
{
echo "Please wait... ";
$mailto = $recovery;
$mailSub = "Here's your password!";
$mailMsg = $row['forgotpass'];
require 'PHPMailer-master/PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail ->IsSmtp();
$mail ->SMTPDebug = 0;
$mail ->SMTPAuth = true;
$mail ->SMTPSecure = 'ssl';
$mail ->Host = "bemoresocial.co.uk";
$mail ->Port = 465; // or 587
$mail ->IsHTML(true);
$mail ->Username = "info@bemoresocial.co.uk";
$mail ->Password = "#########";
$mail ->SetFrom("info@bemoresocial.co.uk");
$mail ->Subject = $mailSub;
$mail ->Body = $mailMsg;
$mail ->AddAddress($mailto);
if(!$mail->Send())
{
echo "Something went wrong :(";
}
else
{
header('Location: ./success.php');
}
}
mysqli_close($conn);
答案 0 :(得分:1)
SMTP可能很慢,通常是故意的;它实际上不适合在页面提交处理期间向远程服务器发送电子邮件,因为PHP通常用于。
解决此问题的最佳方法是安装Postfix等本地邮件服务器。向其提交邮件(使用SMTP到localhost)将非常快,然后邮件服务器可以处理较慢的向前传递。这实际上是一个排队系统,但比使用beanstalkd,redis或rabbitmq之类的东西更容易构建自己的队列。
在你的代码中,while循环中的require
如果多次循环会导致致命错误,因为你将需要重复使用相同的类文件。要有效地发送给多个收件人,请重用PHPMailer实例 - 您不需要每次在循环中从头开始 - 如果您可以使用keepalive,这也会更快 - 请参阅the mailing list example provided with PHPMailer了解如何这样做。
虽然它不是您所看到的问题的一部分,但我可以看到您的代码基于一个过时的示例,并且您使用旧版本的PHPMailer - 升级到6.0。
答案 1 :(得分:0)
我在运行PHP Mailer时非常慢,遇到了同样的问题,例如3分钟使用网站托管SMTP服务器发送15封电子邮件。
我要做的是在几秒钟内完成切换到gmail smtp。执行此操作时,您需要转到Google并生成应用密码Sign In Using App Password。因此,请在代码中使用普通电子邮件地址和生成的密码(请注意,普通密码仍可用于普通电子邮件访问),并使用tls安全性。
当我将程序从测试转移到生产时,电子邮件失败。我发现我必须去Google并登录,一切都可以再次使用。
还请注意,如果您打开SMTPDebug = 2;它将向您显示每个步骤及其完成时间。
include ('class.PHPMailer.php');
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
//Server settings
$mail->SMTPDebug = 0; // 0=no output, 1=Commands, 2=Data & Commands, 3=2+connection status 4=Low-Level data output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'mickeymouse@gmail.com'; // SMTP username
$mail->Password = 'aaaabbbbccccdddd'; // SMTP password (used google Generated app password)
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
// Recipients
$i = 0; $address="";
foreach($recipients as $i => $address)
{
$mail->addAddress($address);
}
$mail->addReplyTo('mickeymouse@gmail.com', 'Mickey');
$mail->isHTML(true);
$mail->setFrom('mickeymouse@gmail.com', 'Mickey');// Set email format to HTML
$mail->Subject = $subject;
$mail->Body = $body;
$mail->send();
$message = 'Message has been sent';
}
catch (Exception $e) {
$message = 'Message could not be sent.'."<br>".
'Mailer Error: ' . $mail->ErrorInfo;
}