ホームページ  >  記事  >  バックエンド開発  >  PHP ユーザー登録メールの確認とアクティベーション アカウントの例_PHP チュートリアル

PHP ユーザー登録メールの確認とアクティベーション アカウントの例_PHP チュートリアル

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

現在、ほとんどの Web サイトでは、ユーザーが電子メールで登録する必要があり、ユーザーは、リンクをクリックすることでアカウントを有効にすることができます。

機能要件

PHP プログラムの開発: ユーザーは Web サイトに登録し、ユーザーが登録した後 (ユーザー情報がデータベースに書き込まれます)、アカウントを有効にするためにメールにログインする必要があります。有効化されたアカウントのないユーザー情報は 24 時間後に自動的に削除されることが規定されています。実装 有効化リンクの有効期限が切れた後、ユーザーはこの情報を使用して Web サイトに登録することもできます

データシートを準備します

ユーザー情報テーブルの [電子メール] フィールドは非常に重要であり、ユーザーの確認やパスワードの取得に使用でき、Web サイト パーティーでも電子メール マーケティングのためのユーザー情報を収集するために使用できます。ユーザー情報テーブル t_user:

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

`t_user` が存在しない場合はテーブルを作成 (
`id` int(11) NOT NULL AUTO_INCREMENT、
`username` varchar(30) NOT NULL コメント 'username'、
`パスワード` varchar(32) NOT NULL コメント 'パスワード'、
`email` varchar(30) NOT NULL コメント 'email'、
`token` varchar(50) NOT NULL コメント 'アカウントアクティベーションコード'、
`token_exptime` int(10) NOT NULL コメント 'アクティベーション コードの有効期間'、
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'ステータス、0-非アクティブ、1-アクティブ',
`regtime` int(10) NOT NULL コメント '登録時刻'、
主キー (`id`)
) ENGINE=MyISAM デフォルト CHARSET=utf8;

HTML

ページに登録フォームを配置すると、ユーザーはユーザー名、パスワード、電子メールなどの登録情報を入力できます。

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

ユーザー名:

パスワード:

電子メール:





ユーザー入力にはフロントエンド検証が必要です。フォーム検証機能については、このサイトの記事「フォーム検証プラグインの適用例」を参照することをお勧めします。この記事ではフロントエンド検証を省略します。さらに、ユーザーがパスワードを繰り返し入力する入力ボックスは、怠惰のためスキップされるようにする必要があります。
register.php

ユーザーは、処理のために登録情報を register.php に送信します。 register.php は、データの書き込みと電子メールの送信という 2 つの主要な機能を完了する必要があります。

まず、必要な 2 つのファイル、connect.php と smtp.class.php が含まれています。これらの 2 つのファイルは、外部で提供されるダウンロード パッケージに含まれています。

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


include_once("connect.php");//データベースに接続します
include_once("smtp.class.php");//メール送信クラス

次に、ユーザーが送信した情報をフィルターし、ユーザー名が存在するかどうかを確認する必要があります (フロントエンドでも確認できます)。

$username = ストリップスラッシュ(trim($_POST['username'])); $query = mysql_query("select id from t_user where username='$username'"); $num = mysql_num_rows($query); if($num==1){
echo 'ユーザー名はすでに存在します。別のユーザー名に変更してください'; 出る
}



次に、ユーザーのパスワードを暗号化し、アクティベーション識別コードを作成します。

コードは次のとおりです

コードをコピー$password = md5(trim($_POST['password'])) //パスワードを暗号化します $email = trim($_POST['email']) //メール $regtime = 時間();
$token = md5($username.$password.$regtime) //アクティベーション用の識別コードを作成します

$token_exptime = time()+60*60*24;//有効期限は 24 時間後です

$sql = "`t_user` (`username`,`password`,`email`,`token`,`token_exptime`,`regtime`) に挿入
値 ('$username','$password','$email','$token','$token_exptime','$regtime')";

mysql_query($sql);



上記のコードでは、$token は構築されたアクティベーション識別コードであり、ユーザー名、パスワード、現在時刻で構成され、md5 によって暗号化されています。 $token_exptime は、アクティベーション リンク URL の有効期限を設定するために使用されます。この例では、ユーザーはこの期間内にアカウントをアクティベートできます。最後に、これらのフィールドがデータ テーブル t_user に挿入されます。

データが正常に挿入されたら、電子メール送信クラスを呼び出して、ユーザーがクリックしたときに、構築されたアクティベーション識別コードをアクティベーション リンクとして完全な URL に送信することに注意してください。詳細コード:

みんなで共有できる、非常に使いやすく強力なメール送信クラスもあります。PHPMailer を使用して、添付ファイル付きのメールを送信し、HTML コンテンツをサポートします。これを直接使用できます。
アクティブ.php

何も問題がなければ、アカウント登録時に入力した電子メールに helloweba からの電子メールが届きます。この時点で、アクティベーション リンクを直接クリックして、active.php に処理させることができます。

active.php は、送信されたリンク情報を受け取り、アクティベーション識別コードであるパラメーター verify の値を取得します。クエリを実行し、データ テーブル内のユーザー情報と比較します。該当するデータ セットが存在する場合は、有効期限内であることを意味する、対応するユーザー テーブルのステータス フィールドを 1 に設定します。これでアクティベーション機能が完了します。

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

if(mysql_insert_id()){
$smtpserver = "" //SMTP サーバー (例: smtp.163.com
) $smtpserverport = 25; //SMTP サーバー ポート、通常は 25
$smtpusermail = "" //SMTP サーバーのユーザーのメール アドレス (xxx@163.com など)
; $smtpuser = "" //SMTP サーバーのユーザー アカウント xxx@163.com
; $smtppass = "" //SMTP サーバーのユーザーパスワード
; $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass) //メールクラスをインスタンス化します
$emailtype = "HTML" //メールの種類、テキスト: ウェブページ: HTML
; $smtpemailto = $email; //メールを受信します。この場合は登録ユーザーのメールです
$smtpemailfrom = $smtpusermail //メールの送信側 (xxx@163.com など)
$emailsubject = "ユーザー アカウントのアクティベーション";//メールの件名
//メール本文の内容
$emailbody = "Dear".$username.":
当社のサイトに新しいアカウントをご登録いただきありがとうございます。
リンクをクリックしてアカウントを有効にしてください。

'_blank'>/demo/register/active.php?verify=".$token."
上記のリンクをクリックできない場合は、ブラウザのアドレス バーにコピーしてアクセスしてください。リンクは 24 時間以内に有効になります。 ";
//メールを送信
$rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype
); If($rs==1){
$msg = 'おめでとうございます。登録は成功しました!
メールアドレスにログインして、アカウントを有効にしてください。 ';
}その他{
$msg = }
}
エコー $msg;

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

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

$verify = ストリップスラッシュ(trim($_GET['verify'])); $今の時間 = 時間();
$query = mysql_query("select id,token_exptime from t_user where status='0' および
`トークン`='$verify'");
$row = mysql_fetch_array($query); if($row){
If($nowtime>$row['token_exptime']){ //24 時間
$msg = 'アクティベーション期間が期限切れになりました。アカ​​ウントにログインしてアクティベーションメールを再送信してください。'; }その他{
mysql_query("update t_user set status=1 where id=".$row['id']); if(mysql_affected_rows($link)!=1) die(0); $msg = 'アクティベーションに成功しました! ';
}
}その他{
$msg = 'エラー。'; }
エコー $msg;



アクティベーションが成功した後、トークンフィールドがもう役に立たないことがわかりました。それをクリアできます。次に、ユーザーがパスワードを取得する機能について説明しますが、これもメール認証が必要ですので、しばらくお待ちください。

最後にメールアドレス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->sock = false;
}

/* メイン関数 */

function 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: $from<" .

$header .= "件名: " . $subject .

$header .= $Additional_headers;

$header .= "日付: " . date("r") .

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

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

$header .= " . date("YmdHis", $sec) "." ."

$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 をエコーし​​ます。 「
   ;";
  }
 }
}
?>

接続データ库接続类

代码如下 复制幣

$host="ローカルホスト";
$db_user="";//用户名
$db_pass="";//秘密
$db_name="デモ";//数据库
$timezone="アジア/上海";

$link=mysql_connect($host,$db_user,$db_pass);
mysql_select_db($db_name,$link);
mysql_query("SET names UTF8");

header("Content-Type: text/html; charset=utf-8");
date_default_timezone_set($timezone); //北京時間
?>

www.bkjia.com本当http://www.bkjia.com/PHPjc/632757.html技術記事現在、ほとんどの Web サイトでは、ユーザーが電子メールで登録する必要があり、ユーザーはリンクをクリックしてアカウントを有効にすることができます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。