PHP 7.0 STRPOS无法按预期运行

时间:2018-01-20 16:45:00

标签: php php-7 strpos

所以,我试图使用 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#invalidcred r126sm1314271qke.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#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  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):我真的为延迟道歉,在最坏的情况下,我将以赏金再次延长。但是,你们是对的!当我第一次遇到错误时,我输出了它并且只是复制了#34; gsmtp SMTP代码:550&#34;,但是在执行标记后,似乎有某种新的行。您可以在output中看到该行应该更像是&#34; gsmtp&#34; + +&#34; SMTP代码:550&#34;,但我不确定换行应该是什么。我试过了和\ n。

2 个答案:

答案 0 :(得分:3)

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

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

更改:

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

为:

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

答案 1 :(得分:1)

我最好的猜测:

您正在输出HTML,因此您的CRLF / LF可能会呈现为空格。我会用<pre>...</pre>标签附上你的echo语句,看看是不是这样。 strpos会失败,因为你正在搜索一个实际上是CRLF / LF的空格字符。