PHP 7.0 STRPOS 未按预期运行

问题描述 投票:0回答:2

因此,我尝试使用 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 身份验证来识别发送域或提供您的域之一HELO 或 EHLO 命令中的名称。有关详细信息,请访问 https://support.google.com/a/answer/6140680#invalidcred r126sm1314271qke.4 - gsmtp ,550,5.7.1SMTP 服务器错误:MAIL FROM 命令失败详细信息:中继凭据无效 [ XXXXXXX]。您在 G Suite SMTP 中继服务中注册的 IP 地址与发送此电子邮件的帐户的域名不匹配。如果您尝试转发来自未在您的 G Suite 帐户下注册的域或信封为空的域的邮件,则必须将邮件服务器配置为使用 SMTP 身份验证来识别发送域或提供您的域之一HELO 或 EHLO 命令中的名称。如需了解更多信息,请访问 https://support.google.com/a/answer/6140680#invalidcred r126sm1314271qke.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  SOLUTION
  $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 code: 550”行,但在执行

<pre>
标记后,似乎出现了某种新行。您可以在 中看到该行应该更像是“gsmtp”+
<line break>
+“SMTP 代码:550”,但我不确定换行符应该是什么。我尝试了
<br>
\n

php php-7 strpos
2个回答
3
投票

最好的解决方案是花时间准确隔离该空白区域中的字符。

在此之前,您可以使用正则表达式来掩盖其中的任何内容。

更改:

} else if(strpos($Request, "gsmtp SMTP code: 550") !== false) {

至:

} elseif(preg_match("/gsmtp\s+SMTP\s+code:\s+550/",$Request)) {

1
投票

我最好的猜测:

您正在输出到 HTML,因此您的 CRLF/LF 可能会呈现为空格。我将用

<pre>...</pre>
标签将您的 echo 语句括起来,看看情况是否如此。
strpos
会失败,因为您正在搜索实际上是 CRLF/LF 的空格字符。

© www.soinside.com 2019 - 2024. All rights reserved.