【发布时间】:2020-02-07 16:40:44
【问题描述】:
我想在我的网站上有一个简单的电子邮件验证系统。
有人告诉我使用 PHPMailer 来执行此操作,但发送实际电子邮件似乎总是失败,我无法弄清楚许多配置可能性实际上在做什么。
这是我得到的错误:
2019-10-10 09:05:53 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP l19sm817499edb.50 - gsmtp
2019-10-10 09:05:53 CLIENT -> SERVER: EHLO localhost
2019-10-10 09:05:53 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [2a02:aa10:e27d:d780:d905:c422:7d5d:365d]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2019-10-10 09:05:53 CLIENT -> SERVER: STARTTLS
2019-10-10 09:05:53 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2019-10-10 09:05:53 CLIENT -> SERVER: EHLO localhost
2019-10-10 09:05:53 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [2a02:aa10:e27d:d780:d905:c422:7d5d:365d]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2019-10-10 09:05:53 CLIENT -> SERVER: AUTH LOGIN
2019-10-10 09:05:53 SERVER -> CLIENT: 334 VXNlcm5hbWU6
2019-10-10 09:05:53 CLIENT -> SERVER: <credentials hidden>
2019-10-10 09:05:53 SERVER -> CLIENT: 334 UGFzc3dvcmQ6
2019-10-10 09:05:53 CLIENT -> SERVER: <credentials hidden>
2019-10-10 09:05:53 SERVER -> CLIENT: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/?p=BadCredentials l19sm817499edb.50 - gsmtp
2019-10-10 09:05:53 SMTP ERROR: Password command failed: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/?p=BadCredentials l19sm817499edb.50 - gsmtp
SMTP Error: Could not authenticate.
2019-10-10 09:05:53 CLIENT -> SERVER: QUIT
2019-10-10 09:05:53 SERVER -> CLIENT: 221 2.0.0 closing connection l19sm817499edb.50 - gsmtp
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Message has been sent
如果我尝试使用 localhost 执行此操作,则会出现此错误。我正在将 XAMPP 与 Apache 和 MySql 一起使用,但我还没有安装“Mercury”,因为我并不真正了解这一切是如何工作的。
最后我希望在这里在线托管:OpenStringStudios 所以我不明白“水星”在这方面与任何事情有什么关系。
这是我正在使用的 php 代码:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// echo "Hello World!";
if (isset($_POST['submit'])) {
$con = new mysqli('localhost', 'root', '', 'osscom_users_test');
$name = $con->real_escape_string($_POST['name']);
$email = $con->real_escape_string($_POST['email']);
$pass = $con->real_escape_string($_POST['pass']);
// test if the username is already taken
// one email addresses can have multiple users
$token = 'qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM0123456789';
$token = str_shuffle($token);
$token = substr($token, 0, 10);
$hashedPass = password_hash($pass, PASSWORD_BCRYPT);
$con->query("INSERT INTO test_users (NAME, EMAIL, PASSWORD, VERIFIED, TOKEN)
VALUES ('$name', '$email', '$hashedPass', '0', '$token');
");
include_once "PHPMailer/PHPMailer.php";
include_once "PHPMailer/Exception.php";
include_once "PHPMailer/SMTP.php";
try {
// Server settings
$mail = new PHPMailer();
$mail->SMTPDebug = SMTP::DEBUG_SERVER; // Enable verbose debug output
$mail->isSMTP(); // Send using SMTP
$mail->Host = 'smtp.gmail.com'; // Set the SMTP server to send through
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'root'; // SMTP username
$mail->Password = ''; // SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->setFrom('openstring.studios@gmail.com', 'OpenString Team');
$mail->addAddress($email, $name);
$mail->isHTML(true);
$mail->Subject = "Welcome To The OpenString Membership, Please Verify Your Account";
$mail->Body = "
<h1>Welcome To The OpenString Membership</h1>
Thanks for joining, please click the link below to verify your account.<br>
Name: $name<br>
<a href='localhost/session/activation?email=$email&token=$token'>Click Here To Activate Your Account.</a>
<p>
Legal Statements:
By clicking this link you agree to all our terms of services.
</p>
";
$mail->send();
echo 'Message has been sent';
} catch(Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrofInfo}";
}
// Redirect('account', false);
}
function Redirect($url, $permanent = false) {
if (headers_sent() === false) {
header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
}
exit();
}
?>
我真的不明白如何解决这个问题。对我来说特别重要的是它既可以在我的本地主机上工作,也可以在它托管在 domain.com 上时工作。
【问题讨论】:
-
Gmail 身份验证问题(包括这个问题)在the troubleshooting guide 中有相当广泛的介绍。我还建议您验证您的输入,不要只是逃避它们。
-
你是什么意思.. 我需要向 PHPMailer 验证它?我不明白你在说什么..
-
不只是一般 - 例如,您在将电子邮件地址插入数据库之前对其应用转义,这很好并且可以防止 SQL 注入,但您没有检查它实际上是首先是有效的电子邮件地址。当您以后使用它时,这种东西是创建持久性 XSS 漏洞的好方法。简而言之:首先不要让不良数据进入您的系统。
-
啊,现在我明白你的意思了。表单验证已经在 Javascript 中完成。如果表单没有正确填写,您实际上无法继续。有什么理由我应该使用 PHP 而不是 javascript 进行表单验证?还是应该验证所有输入两次??
-
是的,您可以验证客户端,但您也必须始终在服务器端进行验证。基于 javascript 的保护很容易绕过 - 例如,您可以很容易地使用 curl 生成虚假提交。
标签: php xampp localhost phpmailer