【问题标题】:PHP 7.0 STRPOS not functioning as expectedPHP 7.0 STRPOS 未按预期运行
【发布时间】: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");"

标签: php php-7 strpos


【解决方案1】:

最好的解决方案是花时间准确地找出那个空白中的字符。

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

变化:

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

到:

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

【讨论】:

  • 遗憾的是,您没有及时获得赏金,但您的回答很棒,因为如果 Google 更改任何 smtp 错误代码,正则表达式将更加动态!
【解决方案2】:

我的最佳猜测:

您正在输出到 HTML,因此您的 CRLF/LF 可能呈现为空格。我会用&lt;pre&gt;...&lt;/pre&gt; 标签附上你的回声语句,看看是不是这样。 strpos 会失败,因为您正在搜索实际上是 CRLF/LF 的空格字符。

【讨论】:

  • 你试过了吗?将echo $Request; 更改为echo "&lt;pre&gt;".$Request."&lt;/pre&gt;"; 会发生什么?
  • 就可能有助于诊断问题的技术向 OP 提供建议不是答案;他们应该是 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2017-10-23
  • 2014-11-12
  • 1970-01-01
  • 2020-06-28
  • 2012-02-18
  • 2018-01-18
相关资源
最近更新 更多