質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

625閲覧

PHP メール機能で会員登録する

hellommm

総合スコア49

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/06/26 19:22

メールアドレスを入力し、そのメールアドレスに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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/26 23:11

迷惑メールフォルダに入っているとかありませんか?returnMailの方には何か返ってきていますか?
m.ts10806

2018/06/27 02:18

ちょこちょこスペルミスがあるので見直していただきたく。プログラミングにおいて1文字の違いが生死を分かつことも多々ありますので。 質問内容から例:ULR→URL xammp→XAMPP
guest

回答2

0

パソコンのウイルス対策ソフト(ファイアウォール)がメール送信をブロックしていないかどうか確認するのと、
php.iniでのdisplay_errorsやerror_reportingを調整してエラーを確実に報告できるようにする(参考事例→PHPでエラーを表示する&表示するエラーを設定する - Qiita)のと、
あとは、エラー表示やエラーログをしっかり点検して調べて対策することくらいしか思いつかないかもだ。

参考:
PHP mail Bcc Cc 添付 - Qiita
なぜかFrom:をヘッダーに加えるところでEUC-JPとか出てきてるけど、
改行コードの処理とか、添付ファイルをMIMEエンコードしてやるところとか、
割と参考になるかもだ。

XAMPPで使っているsendmail用の設定ファイル(sendmail.ini)の設定も
質問文に足すと、いいアドバイスがつくかもしれず。

投稿2018/06/27 01:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

環境はxammpを使っていて、ローカルで試しています。

WindowsPC上にXAMPPを導入してる、という前提で。

転送先に
http://crought.com/blog/%E3%80%90php%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%80%91xampp%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%92%B0%E5%A2%83%E4%B8%8A%E3%81%A7php%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-103/
にあるようにGmailを使っていると、設定次第で弾かれます。
もし、Gmailを使って送信しようとしているのであれば、そのアカウントに届いているメールにブロックを知らせるものがありませんか?
Linuxならmailコマンドで確認する手もありますが、Windowsに導入したXAMPPのsendmailをXAMPPを介さず実行してメール送信が確認できるようであれば切り分けできると思いますが、私は試したことがないのでわかりません。

投稿2018/06/27 00:03

編集2018/06/27 01:53
sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sysjojo

2018/06/27 01:36

> XAMPPのsendmailって直に使えるんですかね? すみません。書き方が悪かったです。 Linuxならmailコマンドでsendmailの動作をXAMPPを介さず確認できるとおもうのですが、Windows上にXAMPPと一緒に導入されているsendmailを直接実行して、メール送信が確認できるのか、がわかりませんでした。それができるのであればsendmailよりも先の問題か、sendmailよりも前の問題かが切り分けできるかな~?と。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問