メールアドレスを入力し、そのメールアドレスにurlを送り、そのULRからログインすると本登録ができるというプログラムを作っております。
先日このプログラムを実行するとメールがうまく自分の携帯に届いたのですが、今日改めて実行してみるとメールが届かなくなりました。gmailの方に送ってみても一向に届きません。
環境はxammpを使っていて、ローカルで試しています。エラーも出ないし、コードも先日と変わっていないので何故届かなくなってしまったのか分かりません。
もし分かる方がいればよろしくお願い致します。
以下コード
mail_send.php
php
1<?php 2session_start(); 3 4header("Content-type: text/html; charset=utf-8"); 5 6//クロスサイトリクエストフォージェリ(CSRF)対策 7$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 8$token = $_SESSION['token']; 9 10//クリックジャッキング対策 11header('X-FRAME-OPTIONS: SAMEORIGIN'); 12 13?> 14 15<!DOCTYPE html> 16<html> 17<head> 18<title>メール登録画面</title> 19<meta charset="utf-8"> 20</head> 21<body> 22 <hr> 23 メール登録画面 24 <hr> 25<form action="mail_check.php" method="post"> 26 27<p>メールアドレス:<input type="text" name="mailadd" required="required" maxlength='100'></p> 28<!-- トークン送信--> 29<input type="hidden" name="token" value="<?=$token?>"> 30<input type="submit" value="登録する"> 31 32</form> 33 34</body> 35</html> 36
mail_check.php
php
1<?php 2session_start(); 3 4header("Content-type: text/html; charset=utf-8"); 5 6//クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定 7if ($_POST['token'] != $_SESSION['token']){ 8 echo "不正アクセスの可能性あり"; 9 exit(); 10} 11 12//クリックジャッキング対策 13header('X-FRAME-OPTIONS: SAMEORIGIN'); 14 15//データベース接続 16require_once("logindb.php"); 17$pdo = db_connect(); 18 19//エラーメッセージの初期化 20$errors = array(); 21 22//post空の時戻る 23if(empty($_POST)) { 24 header("Location: mail_send.php"); 25 exit(); 26}else{ 27 //POSTされたデータを変数に入れる 28 $mail = filter_input(INPUT_POST, 'mailadd'); 29 30 //メール入力判定 31 if ($mail == ''){ 32 $errors['mail'] = "メールが入力されていません。"; 33 }else{ 34 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){ 35 $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; 36 } 37 38 } 39} 40 41if (count($errors) === 0){ 42 43 //トークン生成GET[] 44 $urltoken = hash('sha256',uniqid(rand(),1)); 45 $url = "http://◯◯◯.co.jp/registration_form.php"."?urltoken=".$urltoken; 46 47 //ここでデータベースに登録する 48 try{ 49 50 $sql = "INSERT INTO pre_login (urltoken,pre_mail,date) VALUES (:urltoken,:pre_mail,now())"; 51 $statement = $pdo->prepare($sql); 52 //プレースホルダへ実際の値を設定する 53 $statement->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); 54 $statement->bindValue(':pre_mail', $mail, PDO::PARAM_STR); 55 $statement->execute(); 56 57 //データベース接続切断 58 $pdo = null; 59 60 }catch (PDOException $e){ 61 print('Error:'.$e->getMessage()); 62 die(); 63 } 64 65 //メールの宛先 66 $mailTo = $mail; 67 68 //Return-Pathに指定するメールアドレス 69 $returnMail = 'web@sample.com'; 70 71 $name = "サンプルです"; 72 $mail = 'web@sample.com'; 73 $subject = "【サンプル】会員登録用URL"; 74 75$body = <<< EOM 7624時間以内に下記のURLからご登録下さい。 77{$url} 78EOM; 79 80 mb_language('ja'); 81 mb_internal_encoding('UTF-8'); 82 83 //Fromヘッダーを作成 84 $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>'; 85 86 if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) { 87 88 //セッション変数を全て解除 89 $_SESSION = array(); 90 91 //クッキーの削除 92 if (isset($_COOKIE["PHPSESSID"])) { 93 setcookie("PHPSESSID", '', time() - 1800, '/'); 94 } 95 96 //セッションを破棄する 97 session_destroy(); 98 99 $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。"; 100 101 } else { 102 $errors['mail_error'] = "メールの送信に失敗しました。"; 103 } 104} 105 106?> 107 108<!DOCTYPE html> 109<html> 110 <head> 111 <title>メール確認画面</title> 112 <meta charset="utf-8"> 113 </head> 114 <body> 115 <h1>メール確認画面</h1> 116 117 <?php if (count($errors) === 0): ?> 118 119 <p><?=$message?></p> 120 121 <p>↓このURLが記載されたメールが届きます。</p> 122 <a href="<?=$url?>"><?=$url?></a> 123 124 <?php elseif(count($errors) > 0): ?> 125 126 <?php 127 foreach($errors as $value){ 128 echo "<p>".$value."</p>"; 129 } 130 ?> 131 132 <input type="button" value="戻る" onClick="history.back()"> 133 134 <?php endif; ?> 135 136 </body> 137</html> 138