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

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

ただいまの
回答率

88.60%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,306

orchis_mary

score 10

前提・実現したいこと

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
session_start();
$errors = $_SESSION['errors'];
unset($_SESSION['errors']);
$name = $_SESSION['name'];
unset($_SESSION['name']);
$email = $_SESSION['email'];
unset($_SESSION['email']);
$content = $_SESSION['content'];
unset($_SESSION['content']);
?>
<!DOCTYPE html>
<html>
<head~/head>
<body>
<form action="php/confirm.php" method="post" class="contact_form" id="contact_form">
<div class="wrap">
<input class="contact__name-form" id="name" type="text" placeholder="お名前" name="name" value="<?= htmlspecialchars($name); ?>">
<?php if (!empty($errors['name'])): ?>
<?php foreach($errors['name'] as $error): ?>
<p class="contact__error"><?= htmlspecialchars($error); ?></p>
<?php endforeach ?>
<?php endif; ?>
</div>
<div class="wrap">
<input class="contact__email-form" id="email" type="text" placeholder="メールアドレス" name="email" value="<?= htmlspecialchars($email); ?>">
<?php if (!empty($errors['email'])): ?>
<?php foreach ($errors['email'] as $error): ?>
<p class="contact__error"><?php echo htmlspecialchars($error); ?></p>    
<?php endforeach ?>
<?php endif; ?>
</div>    
<div class="contact__content">    
<textarea name="content" class="content" rows="5" cols="100" class="contact__content-form"                                                                    placeholder="お問い合わせ内容 ※1000文字以内">
<?php echo htmlspecialchars($content); ?>
</textarea>
<?php if (!empty($errors['content'])): ?>                
<?php foreach ($errors['content'] as $error): ?>        
<p class="contact__error"><?php echo htmlspecialchars($error); ?></p>    
<?php endforeach ?>
<?php endif; ?>    
</div>    
<div class="contact__action-btn">        
<button class="contact_btn" type="submit">お問い合わせ確認画面へ</button>        
</div>
</form>
</body>
</html>    

confirm.php

<?php
session_start();
require_once 'ContactValidator.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('HTTP', true, 400);
    exit();
}
$_SESSION['name'] = $_POST['name'];
$_SESSION['email'] = $_POST['email'];
$_SESSION['content'] = $_POST['content'];
$validator = new ContactValidator($_POST);
$errors = $validator->validate();
if (!empty($errors)) {
  $uri = $_SERVER['HTTP_REFERER'];
    header("Location: ".$uri.'#contact');
    $_SESSION['errors'] = $errors;
    exit();
}
?>

complete.php

<?php
session_start();
$name = $_SESSION['name'];
unset($_SESSION['name']);
$email = $_SESSION['email'];
unset($_SESSION['email']);
$content = $_SESSION['content'];
unset($_SESSION['content']);

$subject = 'ポートフォリオお問い合わせ';
$subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS","UTF-8"))."?=";
mb_language("japanese");
mb_internal_encoding("UTF-8");
require '../PHPMailer/PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = '587';
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->Username = '自分のメールアドレス';
$mail->Password = 'パスワード';
$mail->setFrom($email);
$mail->AddAddress('自分のメールアドレス');
$mail->addReplyTo($email);
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = 'お名前:'.$name.'<br>メール:'.$email.'<br>内容:'.$content;
$mail->send();
?>

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/08/06 09:21

    コードはマークダウンのcode機能を利用してご提示ください。
    https://teratail.com/help#about-markdown

    キャンセル

  • m.ts10806

    2019/08/06 09:22

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

    キャンセル

回答 1

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る