代码之家  ›  专栏  ›  技术社区  ›  Sean Mitchell

PHP 7.0 STRPOS未按预期运行

  •  -1
  • Sean Mitchell  · 技术社区  · 7 年前

    所以我想用 STRPO 为了测试变量中是否存在字符串,但在我所有使if语句工作的尝试中,都没有成功,所以我开始输出字符串,并试图找到 STRPO 发现了它,但它不是,尽管它很明显在那里!在这种情况下,我将在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套件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套件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  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”,但在完成标记后,似乎出现了某种新的行。您可以在 output 该行应该更像“gsmtp”++“SMTP代码:550”,但我不确定应该是什么换行符。我试过了
    和\n。

    2 回复  |  直到 7 年前
        1
  •  3
  •   mickmackusa Tom Green    7 年前

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

    在你这么做之前,你可以用正则表达式来掩盖里面的任何东西。

    更改:

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

    收件人:

    } elseif(preg_match("/gsmtp\s+SMTP\s+code:\s+550/",$Request)) {
    
        2
  •  1
  •   Peter Li    7 年前

    我的最佳猜测:

    您正在输出到HTML,因此您的CRLF/LF可能是以空格的形式呈现的。我会附上你的回音声明 <pre>...</pre> 标记以查看是否是这种情况。 strpos 将失败,因为您正在搜索实际上是CRLF/LF的空格字符。