【发布时间】:2018-06-29 17:29:50
【问题描述】:
所以,我试图使用 strpos 来测试一个字符串是否存在于一个变量中,但是在我尝试使 if 语句工作的所有尝试中,它都没有成功,所以我开始输出字符串并试图找到 strpos 检测到它的点,但它不是虽然它显然在那里!在这种情况下,我在 SMTP 错误输出中搜索 Gmail SMTP 错误代码。
我知道如何修复错误,但我希望我的系统能够解析 smtp 错误并将它们报告给我的用户。 ..
PHP 代码:
$Request = RequestPasswordReset($_POST["email"]);
echo $Request;
echo "<br>Position of Error Code: " . strpos($Request, "gsmtp SMTP code: 550");
die();
if($Request === "SUCCESS") {
DisplayError("Password Reset Successful", "We have sent a email that contains a link to reset your password.", "/account/resetpassword.php");
} else if($Request === "USER_NOT_FOUND") {
DisplayError("Password Reset Request Failed", "The specified email is not tied to any accounts in our system.", "/account/resetpassword.php");
} else if(strpos($Request, "gsmtp SMTP code: 550") !== false) {
DisplayError("Password Reset Request Failed", "The mail was blocked by our relay due to IPs being not whitelisted.", "/account/resetpassword.php");
} else {
DisplayError("Password Reset Request Failed", "The request failed for an unknown reason.", "/account/resetpassword.php");
}
文本输出:
它确实重复了自己,我重复了两次$Request,它完全重复了以下两次
以下发件人地址失败:XXXXXXX : MAIL FROM 命令失败,中继 [XXXXXXX] 的凭据无效。您在 G Suite SMTP 中继服务中注册的 IP 地址与发送此电子邮件的帐户的域不匹配。如果您尝试中继来自未在您的 G Suite 帐户下注册的域或具有空信封的域的邮件,则必须将您的邮件服务器配置为使用 SMTP AUTH 来识别发送域或显示您的域之一HELO 或 EHLO 命令中的名称。有关详细信息,请访问https://support.google.com/a/answer/6140680#invalidcredr126sm1314271qke.4 - gsmtp ,550,5.7.1SMTP 服务器错误:MAIL FROM 命令失败详细信息:中继 [XXXXXXX] 的凭据无效。您在 G Suite SMTP 中继服务中注册的 IP 地址与发送此电子邮件的帐户的域不匹配。如果您尝试中继来自未在您的 G Suite 帐户下注册的域或具有空信封的域的邮件,则必须将您的邮件服务器配置为使用 SMTP AUTH 来识别发送域或显示您的域之一HELO 或 EHLO 命令中的名称。欲了解更多信息,请访问https://support.google.com/a/answer/6140680#invalidcredr126sm1314271qke.4 - gsmtp SMTP 代码:550 附加 SMTP 信息:5.7.1
错误代码位置:
(编辑)重置密码请求功能:
function RequestPasswordReset($Email) {
// Try to Get User
$User = GetUser_Email($Email);
// Does user exist?
if($User === "NOT_FOUND") {
return "USER_NOT_FOUND";
}
// Generate Link To Send with Email
$Link = GeneratePasswordResetLink();
$SendEmail = SendPasswordReset($User["Email"], $User["FirstName"] . $User["LastName"], $Link);
if($SendEmail !== "SUCCESS") {
return $SendEmail;
} else {
// WHAT IF MYSQL FAILS????? ~~~~~~~~~~~~~~~ NEED SOLOUTION
$PDO_Connection = CreateMySQLConnection();
$PDO_CMD = $PDO_Connection -> prepare("UPDATE accounts SET ResetPassword=? WHERE Email=?");
$PDO_CMD -> execute(array($Link, $User["Email"]));
return "SUCCESS";
}
}
(编辑)发送密码重置功能:
$User = GetUser_ResetID($resetID);
$mail = CreateSMTPConnection();
$mail->AddAddress($targetAddress, $targetName); // Add a recipient
$mail->IsHTML(true); // Set email format to HTML
$mail->Subject = 'LitenUp Password Reset';
$mail->Body = str_replace("https://mylitenup.net/account/resetpassword.php?ID=", ("https://mylitenup.net/account/resetpassword.php?ID=" . $resetID), file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/php/mailer/documents/resetpassword.html"));
$mail->AltBody = 'Reset Your Password: https://mylitenup.net/account/resetpassword.php?ID=' . $resetID;
$mail->XMailer = 'LitenUp Mailer';
$mail->XPriority = '1';
try{
$mail->send();
return "SUCCESS";
} catch (phpmailerException $e) {
return $e->errorMessage();
} catch (\Exception $e) {
return $e->getMessage();
}
(编辑):我尝试了mb_strpos,但它不起作用,所以如果这可行,为什么它不适合我?我做了mb_strpos($Request, "gsmtp SMTP code: 550");,但执行后它会回显请求,但Position of Error Code: 行没有得到回显。
(更新 1):对于延迟,我真的很抱歉,在最坏的情况下,我会以赏金再次扩展它。然而,你们是对的!当我第一次遇到错误时,我将其输出并复制了“gsmtp SMTP 代码:550”这一行,但在完成标记之后,似乎出现了某种新行。您可以在 中看到该行应该更像“gsmtp”++“SMTP 代码:550”,但我不确定换行符应该是什么。我试过
和 \n。
【问题讨论】:
-
非常抱歉我没有将文本输出格式化为 Stack Overflow 代码,但是每次尝试都变成了一行。
-
这可能是多字节字符集问题吗?试试
mb_strpos() -
@RiggsFolly 我会试试的,但为什么会有问题呢?
-
只有我能想到的,因为代码看起来应该可以工作
-
@RiggsFolly 刚刚尝试过,现在“错误代码的位置:”行完全消失了!有没有我想念的图书馆?代码当前为“ echo”
错误代码的位置:“ .mb_strpos($Request, "gsmtp SMTP code: 550");"