ホームページ >バックエンド開発 >PHPチュートリアル >PHPメンバーパスワード取得機能実装例紹介_PHPチュートリアル

PHPメンバーパスワード取得機能実装例紹介_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:44:05912ブラウズ

あなたのウェブサイトに会員制システムがある場合、ユーザーがパスワードを忘れた場合に、メールまたは携帯電話番号から直接パスワードを取得できる自動パスワード取得機能が必要です。電子メールでパスワードを取得する方法を紹介します。

設定のアイデア

1. ユーザーは登録時に電子メールを提供する必要があります。その目的は、この電子メールを使用してパスワードを取得することです。

2. ユーザーがパスワードまたはユーザー名を忘れた場合は、ログイン ページの [パスワードを取得] ハイパーリンクをクリックしてフォームを開き、登録に使用したメール アドレスを入力して送信します。

3. システムはメールボックスを通じてデータベースからユーザー情報を検索し、ユーザーのパスワードを一時パスワード (例: 12345678) に更新します。

4. システムは、Jmail 機能を使用して、ユーザーの情報をユーザーのメールボックスに送信します (内容には、ユーザー名、一時パスワード、およびユーザーに一時パスワードの変更を促すメッセージが含まれます)。

5. ユーザーは一時パスワードを使用してログインできます。


HTML

パスワード取得ページに、登録に使用した電子メール アドレスを入力することをユーザーに要求するページを配置し、インタラクションを処理するフロントエンド JS を送信します。

jQuery
コードは次のとおりです コードをコピー

登録したメール アドレスを入力してパスワードを取得してください:



ユーザーがメール アドレスを入力して送信をクリックすると、jQuery はまずメールの形式が正しいかどうかを確認し、正しい場合は、sendmail.php に Ajax リクエストを送信します。が存在し、メールを送信すると、対応する処理が返されます。結果はフロントページに表示されます。jQuery コードを参照してください:

コードは次のとおりです$(関数(){
コードをコピー
$("#sub_btn").click(function(){

var email = $("#email").val(); var preg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*// メールアドレスに一致
; If(email=='' || !preg.test(email)){
$("#chkmsg").html("正しいメールアドレスを入力してください!"); }その他{
$("#sub_btn").attr("無効","無効").val('送信中..').css("カーソル","デフォルト"); $.post("sendmail.php",{mail:email},function(msg){
If(msg=="noreg"){
$( "#chkmsg")。html( "このメールアドレスはまだ登録されていません!"); $("#sub_btn").removeAttr("無効").val('submit').css("カーソル","ポインター"); }その他{
$(".demo").html("

"+msg+"

");                                                                                       }); }
}); })



上記で使用されている jQuery コードは、フロントエンドの対話型操作を完了するのに非常に便利で簡潔です。ある程度の jQuery の基礎がある場合、上記のコードは一目瞭然であり、多くの説明は必要ありません。

もちろん、ページに jQuery ライブラリ ファイルをロードすることを忘れないでください。www.bKjia.c0m からダウンロードしたデモが 80% の確率で使用できないのは、jQuery のロード パスが原因であるとよく質問される学生がいます。または他のファイルが間違っているため、必要なファイルが読み込まれていません。
PHP

sendmail.php は、電子メールがシステムのユーザー テーブルに存在するかどうかを確認する必要があります。存在する場合は、ユーザー情報を読み取り、md5 を使用してユーザー ID、ユーザー名、パスワードを暗号化し、パスワードを取得するための検証コードとして特別な文字列を生成します。次に URL を構築します。同時に、URL リンクの適時性を制御するために、ユーザーがパスワード取得アクションを送信したときに操作時間を記録し、最後に電子メール送信クラスを呼び出してユーザーのメールボックスに電子メールを送信します。 class smtp.class.php がパッケージ化されていますのでダウンロードしてください。

コードは次のとおりです コードをコピー

include_once("connect.php");//データベースに接続します

$email = ストリップスラッシュ(trim($_POST['mail']));
$sql = "`t_user` から ID、ユーザー名、パスワードを選択します (`email`='$email')"; $query = mysql_query($sql); $num = mysql_num_rows($query); if($num==0){//このメール アドレスはまだ登録されていません。
「ノレグ」をエコーし​​ます。 出る
}その他{
$row = mysql_fetch_array($query); $getpasstime = 時間(); $uid = $row['id']
$token = md5($uid.$row['username'].$row['password']);//結合された検証コード
$url = "/demo/resetpass/reset.php?email=".$email."
&token=".$token;//URL を構築する
$time = date('Y-m-d H:i'); $result = sendmail($time,$email,$url); If($result==1){//メールは正常に送信されました
$msg = 'システムはメールボックスにメールを送信しました
メールボックスにログインして、パスワードを間に合うようにリセットしてください。 ';
//更新データ送信時間
mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '"); }その他{
$msg = $result; }
$msg をエコーし​​ます。 }

//メールを送信
関数 sendmail($time,$email,$url){
include_once("smtp.class.php")
$smtpserver = "" //SMTP サーバー (smtp.163.com など)
; $smtpserverport = 25 //SMTP サーバー ポート
; $smtpusermail = "" //SMTP サーバーのユーザーのメール アドレス
; $smtpuser = "" //SMTP サーバーのユーザー アカウント
; $smtppass = "" //SMTPサーバーのユーザーパスワード
; $smtp = 新しい Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass); //ここで true は認証が使用されることを意味し、それ以外の場合は認証が使用されません
$emailtype = "HTML" //メールの種類、テキスト: ウェブページ: HTML
; $smtpemailto = $メール
$smtpemailfrom = $smtpusermail
$emailsubject = "www.bKjia.c0m - パスワードを取得"; $emailbody = "".$email." 様:
".$time." にパスワード取得リクエストを送信しました。パスワードをリセットするには、下のリンクをクリックしてください
(ボタンは24時間有効です)。
".$url."";
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype
);
$rs を返します。 }



この時点で、helloweba からパスワード取得メールが届きます。メール内容に URL リンクがあるので、www.bKjia.c0m のreset.php へのリンクをクリックしてください。

最後に、データテーブル t_user 構造体をアタッチします。
コードは次のとおりです コードをコピー

include_once("connect.php");//データベースに接続します

$token = ストリップスラッシュ(トリム($_GET['トークン'])); $email = ストリップスラッシュ(trim($_GET['email'])); $sql = "select * from `t_user` where email='$email'";
$query = mysql_query($sql); $row = mysql_fetch_array($query); if($row){
$mt = md5($row['id'].$row['ユーザー名'].$row['パスワード']); If($mt==$token){
If(time()-$row['getpasstime']>24*60*60){
$msg = 'このリンクは期限切れです。 ';
}その他{
//パスワードをリセット...
$ Msg = 'パスワードをリセットして、パスワードのリセット フォームを表示してください。 & lt; これは単なるデモンストレーションです。 ';
}
}その他{
$msg = '無効なリンク'; }
}その他{
$msg = 'リンクが間違っています! ';
}
エコー $msg;




reset.php は、まずパラメータ email と token を受け取り、次に email に基づいてデータテーブル t_user に電子メールが存在するかどうかをクエリし、存在する場合はユーザーの情報を取得し、トークンと同じ方法でトークン値を構築します。 sendmail.php の組み合わせを使用して、URL によって渡されたトークンを比較します。現在の時刻と電子メールの送信時刻の差が 24 時間以上ある場合は、「リンクの有効期限が切れています!」というメッセージが表示されます。 、これはリンクが有効であり、パスワードのリセットページにリダイレクトされることを意味します。最後に、ユーザーが自分で新しいパスワードを設定しました。

概要: この記事の登録メール認証とメール経由のパスワード取得を通じて、Web サイト開発におけるメール送信の用途とその重要性がわかりました。もちろん、現在では SMS 認証アプリケーションも人気があり、これには関連する SMS インターフェイスのドッキングが必要です。

コードは次のとおりです

コードをコピー

`id` int(11) NOT NULL auto_increment、 `パスワード` varchar(32) NOT NULL、 `email` varchar(50) NOT NULL、 `getpasstime` int(10) NOT NULL、
テーブル `t_user` を作成します ( `ユーザー名` varchar(30) NOT NULL、
主キー (`id`)

) ENGINE=MyISAM デフォルト CHARSET=utf8;



smtp.class.php类文件

代码如下 复制幣

クラスSMTP{

/* パブリック変数 */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* プライベート変数 */
 var $sock;

/* 建設業者 */

関数 smtp($relay_host = "", $smtp_port = 25, $auth = false, $user, $pass) {
  $this->debug = false;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; // fsockopen() で使用されます

$this->auth = $auth; //認証

$this->user = $user;

$this->pass = $pass;

$this->host_name = "localhost"; //HELOコマンドで使用されます
  $this->log_file = "";

$this->靴下 = false;
 }

/* メイン関数 */

関数 sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $Additional_headers = "") {
  $mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace("(^|(rn))(.)", "1.3", $body);

$header .= "MIME バージョン:1.0rn";

if ($mailtype == "HTML") {
   $header .= "Content-Type:text/htmlrn";
  }

$header .= "宛先: " . $to 。 「ん」;

if ($cc != "") {
   $header .= "Cc: " . $cc 。 「ん」;
  }

$header .= "差出人: $from<" 。 $から。 ">rn";

$header .= "件名: " . $subject 。 「ん」;

$header .= $Additional_headers;

$header .= "日付: " . date("r") 。 「ん」;

$header .= "X-Mailer:By Redhat (PHP/" . phpversion() . ")rn";

list ($msec, $sec) =explode(" ", microtime());

$header .= "メッセージ ID: <" 。 date("YmdHis", $sec) 。 「。」 。 ($msec * 1000000) 。 「。」 。 $mail_from 。 ">rn";

$TO =explode(",", $this->strip_comment($to));

if ($cc != "") {
   $TO = array_merge($TO,explode(",", $this->strip_comment($cc)));
  }

if ($bcc != "") {
   $TO = array_merge($TO,explode(",", $this->strip_comment($bcc)));
  }

$sent = true;

foreach ($TO として $rcpt_to) {
   $rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {
    $this->log_write("エラー: " . $rcpt_to . "n" にメールを送信できません");

$sent = false;

続き;
   }

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
    $this->log_write("メールは <" . $rcpt_to . ">n" に送信されました);
   } その他 {
    $this->log_write("エラー: <" . $rcpt_to . ">n" にメールを送信できません");

$sent = false;
   }

fclose($this->靴下);

$this->log_write("リモートホストnから切断されました");
  }

$sent を返す;
 }

/* プライベート関数 */

関数 smtp_send($helo, $from, $to, $header, $body = "") {
  if (!$this->smtp_putcmd("HELO", $helo)) {
   return $this->smtp_error("HELO コマンドを送信中");
  }
  // 認証
  if ($this->auth) {
   if (!$this->smtp_putcmd("認証ログイン",base64_encode($this->user))) {
    return $this->smtp_error("HELO コマンドを送信中");
   }

if (!$this->smtp_putcmd("", Base64_encode($this->pass))) {
    return $this->smtp_error("HELO コマンドを送信中");
   }
  }

if (!$this->smtp_putcmd("MAIL", "FROM:<" . $from . ">")) {
   return $this->smtp_error("sending MAIL FROM command");
  }

if (!$this->smtp_putcmd("RCPT", "TO:<" . $to . ">")) {
   return $this->smtp_error("RCPT TO コマンドを送信中");
  }

if (!$this->smtp_putcmd("DATA")) {
   return $this->smtp_error("DATA コマンドを送信中");
  }

if (!$this->smtp_message($header, $body)) {
   return $this->smtp_error("メッセージ送信中");
  }

if (!$this->smtp_eom()) {
   return $this->smtp_error("を送信中。 [EOM]");
  }

if (!$this->smtp_putcmd("QUIT")) {
   return $this->smtp_error("QUIT コマンドを送信中");
  }

true を返す;
 }

関数 smtp_sockopen($address) {
  if ($this->relay_host == "") {
   return $this->smtp_sockopen_mx($address);
  } その他 {
   return $this->smtp_sockopen_relay();
  }
 }

関数 smtp_sockopen_relay() {
  $this->log_write(" . $this->relay_host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok​​())) {
   $this->log_write("エラー: リレー ホストに接続できません " . $this->relay_host . "n");

$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");

false を返す;
  }

$this->log_write("リレー ホストに接続しました " . $this->relay_host . "n");

true を返す;
  ;
 }

関数 smtp_sockopen_mx($address) {
  $domain = ereg_replace("^.+@([^@]+)$", "1", $address);

if (!@ getmxrr($domain, $MXHOSTS)) {
   $this->log_write("エラー: MX を解決できません "" . $domain . ""n");

false を返す;
  }

foreach ($MXHOSTS として $host) {
   $this->log_write(" . $host . ":" . $this->smtp_port . "n");

$this->sock = @ fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok​​())) {
    $this->log_write("警告: mx ホストに接続できません " . $host . "n");

$this->log_write("エラー: " . $errstr . " (" . $errno . ")n");

続き;
   }

$this->log_write("mx ホストに接続しました " . $host . "n");

true を返す;
  }

$this->log_write("エラー: どの mx ホストにも接続できません (" . implode(", ", $MXHOSTS) . ")n");

false を返す;
 }

関数 smtp_message($header, $body) {
  fputs($this->sock, $header . "rn" . $body);

$this->smtp_debug("> " . str_replace("rn", "n" . "> ", $header . "n> " . $body . "n> "));

true を返す;
 }

関数 smtp_eom() {
  fputs($this->sock, "rn.rn");

$this->smtp_debug(".[EOM]n");

return $this->smtp_ok​​();
 }

関数 smtp_ok​​() {
  $response = str_replace("rn", "", fgets($this->sock, 512));

$this->smtp_debug($response . "n");

if (!ereg("^[23]", $response)) {
   fputs($this->sock, "QUITrn");

fgets($this->sock, 512);

$this->log_write("エラー: リモート ホストが "" . $response . ""n");

false を返す;
  }

true を返す;
 }

関数 smtp_putcmd($cmd, $arg = "") {
  if ($arg != "") {
   if ($cmd == "")
    $cmd = $arg;

その他
    $cmd = $cmd 。 「」。 $arg;
  }

fputs($this->sock, $cmd . "rn");

$this->smtp_debug("> " . $cmd . "n");

return $this->smtp_ok​​();
 }

関数 smtp_error($string) {
  $this->log_write("エラー: " . $string . ".n" 中にエラーが発生しました");

false を返す;
 }

関数 log_write($message) {
  $this->smtp_debug($message);

if ($this->log_file == "") {
   true を返します;
  }

$message = date("M d H:i:s ") 。 get_current_user() 。 「[」。 getmypid() 。 "]: " 。 $メッセージ;

if (!@ file_exists($this->log_file) || !($fp = @ fopen($this->log_file, "a")) {
   $this->smtp_debug("警告: ログ ファイルを開けません "" . $this->log_file . ""n");

false を返す;
   ;
  }

群れ($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);

true を返す;
 }

関数strip_comment($address) {
  $comment = "([^()]*)";

while (ereg($comment, $address)) {
   $address = ereg_replace($comment, "", $address);
  }

$address を返す;
 }

関数 get_address($address) {
  $address = ereg_replace("([ trn])+", "", $address);

$address = ereg_replace("^.*<(.+)>.*$", "1", $address);

$address を返す;
 }

関数 smtp_debug($message) {
  if ($this->debug) {
   $message をエコーし​​ます。 「
   ;";
  }
 }
}
?>

最後にはデータベース接続タイプがあり、ここでは大規模なサイトに関連するデータベース接続タイプの mysql が介在しません。

http://www.bkjia.com/PHPjc/633135.html

本当http://www.bkjia.com/PHPjc/633135.html技術記事もし行われたウェブサイトが会员システムであれば、必ず自動的に秘密コードを返す機能が必要です。つまり、秘密コードを忘れている場合、秘密コードを忘れてしまった場合は、邮箱または携帯電話の番号を介して直接秘密コードを返すことができます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。