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

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

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

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

1回答

1226閲覧

PHPでメール送信を行う際にsession情報が消えてしまいます。

orchis_mary

総合スコア10

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

2クリップ

投稿2019/08/05 13:20

編集2019/08/07 01:47

前提・実現したいこと

xSERVERやherokuでもsession情報が入っているメールを送信したいです。

ポートフォリオ作成中で、PHPでgmailでのメール送信を書いてます。
index.phpから内容入力→
confirm.phpで内容確認→
complete.phpでメール送信

の流れで送信しようとしています。

発生している問題・エラーメッセージ

仮想環境は問題なく、session情報がメール内容に記載され、
送信先(自分)のgmail届きます。
xSERVERでは、complete.phpで送信先(自分)にgmailが届きますが、session情報が無く、
空の情報になってしまいます。
また、herokuでは、confirm.phpまでは問題ないのですが、complete.php(メール送信用のphp)
に移動するとHTTP ERROR 500エラーを起こします。

該当のソースコード

index.php

php

1<?php 2session_start(); 3$errors = $_SESSION['errors']; 4unset($_SESSION['errors']); 5$name = $_SESSION['name']; 6unset($_SESSION['name']); 7$email = $_SESSION['email']; 8unset($_SESSION['email']); 9$content = $_SESSION['content']; 10unset($_SESSION['content']); 11?> 12<!DOCTYPE html> 13<html> 14<head~/head> 15<body> 16<form action="php/confirm.php" method="post" class="contact_form" id="contact_form"> 17<div class="wrap"> 18<input class="contact__name-form" id="name" type="text" placeholder="お名前" name="name" value="<?= htmlspecialchars($name); ?>"> 19<?php if (!empty($errors['name'])): ?> 20<?php foreach($errors['name'] as $error): ?> 21<p class="contact__error"><?= htmlspecialchars($error); ?></p> 22<?php endforeach ?> 23<?php endif; ?> 24</div> 25<div class="wrap"> 26<input class="contact__email-form" id="email" type="text" placeholder="メールアドレス" name="email" value="<?= htmlspecialchars($email); ?>"> 27<?php if (!empty($errors['email'])): ?> 28<?php foreach ($errors['email'] as $error): ?> 29<p class="contact__error"><?php echo htmlspecialchars($error); ?></p> 30<?php endforeach ?> 31<?php endif; ?> 32</div> 33<div class="contact__content"> 34<textarea name="content" class="content" rows="5" cols="100" class="contact__content-form" placeholder="お問い合わせ内容 ※1000文字以内"> 35<?php echo htmlspecialchars($content); ?> 36</textarea> 37<?php if (!empty($errors['content'])): ?> 38<?php foreach ($errors['content'] as $error): ?> 39<p class="contact__error"><?php echo htmlspecialchars($error); ?></p> 40<?php endforeach ?> 41<?php endif; ?> 42</div> 43<div class="contact__action-btn"> 44<button class="contact_btn" type="submit">お問い合わせ確認画面へ</button> 45</div> 46</form> 47</body> 48</html>

confirm.php

php

1<?php 2session_start(); 3require_once 'ContactValidator.php'; 4if ($_SERVER['REQUEST_METHOD'] !== 'POST') { 5 header('HTTP', true, 400); 6 exit(); 7} 8$_SESSION['name'] = $_POST['name']; 9$_SESSION['email'] = $_POST['email']; 10$_SESSION['content'] = $_POST['content']; 11$validator = new ContactValidator($_POST); 12$errors = $validator->validate(); 13if (!empty($errors)) { 14 $uri = $_SERVER['HTTP_REFERER']; 15 header("Location: ".$uri.'#contact'); 16 $_SESSION['errors'] = $errors; 17 exit(); 18} 19?>

complete.php

php

1<?php 2session_start(); 3$name = $_SESSION['name']; 4unset($_SESSION['name']); 5$email = $_SESSION['email']; 6unset($_SESSION['email']); 7$content = $_SESSION['content']; 8unset($_SESSION['content']); 9 10$subject = 'ポートフォリオお問い合わせ'; 11$subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS","UTF-8"))."?="; 12mb_language("japanese"); 13mb_internal_encoding("UTF-8"); 14require '../PHPMailer/PHPMailerAutoload.php'; 15$mail = new PHPMailer; 16$mail->isSMTP(); 17$mail->Host = 'smtp.gmail.com'; 18$mail->Port = '587'; 19$mail->SMTPAuth = true; 20$mail->SMTPSecure = 'tls'; 21$mail->Username = '自分のメールアドレス'; 22$mail->Password = 'パスワード'; 23$mail->setFrom($email); 24$mail->AddAddress('自分のメールアドレス'); 25$mail->addReplyTo($email); 26$mail->isHTML(true); 27$mail->Subject = $subject; 28$mail->Body = 'お名前:'.$name.'<br>メール:'.$email.'<br>内容:'.$content; 29$mail->send(); 30?>

試したこと

confirm.phpの後にcomplete.phpの内容をコピペすると、xserverは問題なく入力した内容が届きました。
xSERVERのphp.iniの直接編集をこのように変えました。
[mail function]
SMTP = localhost
smtp_port = 587
sendmail_path = /usr/sbin/sendmail -t -i

補足情報(FW/ツールのバージョンなど)

OS:Windows10
CPU:N2830 2.16GHz
仮想環境(ドットインストール参照)
Powershell→Vagrant→putty→Cyberduck

PHP
version 7.1.30

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

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

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

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

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

m.ts10806

2019/08/06 00:22

index.phpの内容も必要に思います。
guest

回答1

0

Xserverでcomplete.phpをcomfirm.phpの後に(でいいですよね?)コピペすると、メールは正しく送られているということなので、メール送信周りのコードは問題ないと思います。

セッションが消えるということですが、セッションクッキーは受け入れる設定になっていますでしょうか。具体的にはブラウザの設定でXserverのドメインに対して、クッキーの受入が拒否されていた場合、セッションの引継ぎに失敗して、$_SESSIONが空になっているのではないかと仮説を立てています。ブラウザ側で明示的にクッキーを受け入れる設定にして実行した場合、何か変化はありませんでしょうか。

また、herokuの方ですが、500 INTERNAL SERVER ERRORが発生しているということで、環境の問題が気になります。チェックすべき点として、requireで読み込んでいるPHPMailerAutoload.phpのパスは正しいか、文字コードは正しく動作している他の環境と同じになっているか、PHPのバージョンが他の環境と同じになっているか、この3点がまず疑われるので、確認してみてください。

投稿2019/08/06 06:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問