簡體   English   中英

電子郵件確認鏈接在PHP中不起作用

[英]Email confirmation link not working in PHP

我正在使用帶有電子郵件確認的自定義頁面模板。 一切正常,除非單擊電子郵件中的鏈接,否則顯示“找不到頁面”。

PHP腳本有什么問題?

這是代碼段:

ob_start();
$email= '';

if(isset($_POST['submit'])){
if(!($_POST['subscriptions']=="")){
    $email= isset($_POST['subscriptions']) ? $_POST['subscriptions'] : '';

function encryptLink($stringValue){
    $key = "12345";
    $qryStr = "subscriptions=".$stringValue;
    $query = base64_encode(urlencode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $qryStr, MCRYPT_MODE_CBC, md5(md5($key)))));
    $link = 'www.example.com/testEnvironment/confirmation/'.$query;

    return $link;
    }
    $string = $email;
    $pagelink = encryptLink($string);

    //Email Details
    $mail_to = $email;
    $from_mail = "dummyemail@example.com";
    $from_name = "";
    $reply_to = "";
    $subject = "Confirmation";
    $message_body =
'Hey,

<span style="overflow-wrap: break-word; word-wrap: break-word;">'.$pagelink.'</span>';

    //Generate a boundary
    $boundary = md5(uniqid(time()));

    //Email Header
    $header = "From: ".$from_mail." \r\n";
    $header .= "Reply-To: ".$reply_to."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed;\r\n";
    $header .= " boundary=\"".$boundary."\"";

    //Multipart wraps the Email Content
    $message_body .= "\r\n\r\n";
    $message_body  .= "--".$boundary."\r\n";
    $message_body  .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";
    $message_body .= "Content-Transfer-Encoding: 7bit\r\n";
    $message_body  .= "\r\n";
    $message_body .= "$message_body\r\n";
    $message_body .= "--".$boundary."\r\n";

        //Send email
        if (mail($mail_to, $subject, $message_body, $header)){
            echo "Sent";
        } else {
            echo "Error";
        }
    }
}

確認頁面PHP代碼段:

$key = "12345";

$queryString = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), urldecode(base64_decode($_SERVER['QUERY_STRING'])), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

parse_str($queryString);

if(!empty($stringValue)){
  echo $stringValue;
} else{
  exit("Invalid parameters passed");
}

我認為問題在於您正在使用服務器未准備好的鏈接-base64編碼的字符串似乎是所生成的url中的頁面或目錄,並且由於它是隨機的,因此不存在-因此需要重寫規則並PHP中的相關邏輯。

在htaccess文件中,也許是這樣的規則:

RewriteEngine On
RewriteBase /testEnvironment/   
RewriteRule ^confirmation/([a-zA-Z0-9_-]+)$ confirmation/index.php?data=$1 [NC,L]
/* this will need to be adjusted to your url - is it simply confirmation.php or other? */

注意data

<?php
    if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){

        $data=$_GET['data'];
        $key = "12345";


        $queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "\0");


        /* there is no return value from parse_str() so you would need to manually retrieve the variables to find `subscriptions` */
        parse_str( $queryString );


        /* does this show anything ? */
        print_r( $queryString );


        /*
        if(!empty( $stringValue )){
          print_r( $stringValue );
        } else{
          exit("Invalid parameters passed");
        }
        */          
    }
?>


My test environment
-------------------

## .htaccess ##
RewriteEngine On
RewriteBase /
RewriteRule ^stackconfirm/([a-zA-Z0-9_-]+)(/)?$ /test/stackconfirm.php?data=$1 [NC,L]



/* PHP script to generate email and confirmation link*/

function encryptLink( $stringValue ){
    $key = "12345";
    $qryStr = "subscriptions=".$stringValue;
    $query = base64_encode( urlencode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5( $key ), $qryStr, MCRYPT_MODE_CBC, md5( md5( $key ) ) ) ) );

    /* for my test I changed this portion to match url structure on test server */
    $link = '/stackconfirm/'.$query;
    return $link;
}


$link=encryptLink('bobby.dazzler@razzledazzle.com');
echo "<a href='$link'>Click here to confirm membership</a>";



stackconfirm.php
----------------

<?php
    if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['data'] ) ){

        $data=$_GET['data'];
        $key = "12345";

        $queryString = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $key ), urldecode( base64_decode( $data ) ), MCRYPT_MODE_CBC, md5( md5( $key ) ) ), "\0");

        echo '<pre>', $data, PHP_EOL, print_r( $queryString,true ), '</pre>';
    }
?>


Result
------
subscriptions=bobby.dazzler@razzledazzle.com

您正在直接將密鑰與確認URL串聯在一起。 因為該鏈接不存在,它將始終導致404錯誤頁面。 相反,您可以通過get請求獲取查詢,並在確認腳本中按以下方式進行處理。

$link = 'www.example.com/confirmation/?key='.$query;

在確認腳本中,通過get方法獲取查詢,如下所示。

$key=$_GET['key'];

讓原始密鑰存儲為$original_key=12345; 現在檢查傳遞的密鑰是否與原始密鑰相似

if($key==$original_key)
{
//confirm e-mail
}
else
{
//invalid key
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM