<?php
    // 言語設定、内部エンコーディングを指定
    mb_language("japanese");
    mb_internal_encoding("UTF-8");

    //ソースを全部読み込ませる
    //パスは自分がPHPMailerをインストールした場所で
    require_once dirname(__FILE__). '/../PHPMailer/src/PHPMailer.php';
    require_once dirname(__FILE__).  '/../PHPMailer/src/SMTP.php';
    require_once dirname(__FILE__).  '/../PHPMailer/src/POP3.php';
    require_once dirname(__FILE__).  '/../PHPMailer/src/Exception.php';
    require_once dirname(__FILE__).  '/../PHPMailer/src/OAuth.php';
    require_once dirname(__FILE__).  '/../PHPMailer/language/phpmailer.lang-ja.php';

    //公式通り
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;

    // 設定
    require_once dirname(__FILE__).  '/config.php';

    session_start();
    session_regenerate_id(true);

    checkToken();

		//送信する
    $sendResult = sendMail($_POST);
    if(!$sendResult){
				echo "送信に失敗しました";
    }

    if (!empty($_POST['files'])) {
        deleteFiles($_POST['files']);
    }

    unset($_SESSION['token'], $_SESSION['errmsg'], $_SESSION['data']);

    // チェックトークン
    function checkToken() {
        if (empty($_SESSION['token']) || ($_SESSION['token'] !== $_POST['token'])) {
            header('Location: '. CONTACT_URL);
            exit;
        }
    }

    // 添付したファイルをサーバーからさk所
    function deleteFiles($files) {
        foreach ($files as $file_name) {
            if ($file_name != '') unlink(UPLOAD_DIR. $file_name);
        }
    }

    // メール送信
    function sendMail($data) {
        //autoloderはcomposerでのインストールじゃないとないので
        //あえて記述しない

        //SMTPの設定
        $mailer = new PHPMailer();//インスタンス生成
        $mailer->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
            )
        );
        $mailer->isSMTP();//SMTPを作成
        $mailer->Host = MAIL_HOST;
        $mailer->CharSet = 'utf-8';//文字セットこれでOK
        $mailer->Encoding = 'base64';//文字セットこれでOK
        $mailer->SMTPAuth = TRUE;//SMTP認証を有効にする
        $mailer->Username = MAIL_USERNAME; // ユーザー名
        $mailer->Password = MAIL_PASS; // パスワード
        $mailer->SMTPSecure = MAIL_ENCRPT;//SSLも使えると公式で言ってます
        $mailer->Port = SMTP_PORT;//tlsは587でOK

        if (MAIL_DEBUG) $mailer->SMTPDebug = 2;//2は詳細デバッグ1は簡易デバッグ本番はコメントアウトして

        // メールテンプレート読み込み
        $mailTxt = file_get_contents(MAIL_TEMPLATE);

        // メール本文作成
        foreach($data as $key => $val) {
            if ($key == 'files') {
                // 添付ファイルの時
                foreach ($val as $field_name => $file_name) {
                    $replace_txt = $file_name == '' ? '' : '添付済み';
                    $mailTxt = str_replace("#".$field_name."#", $replace_txt, $mailTxt);
                }
            } else {
                $data[$key] = $val = trim(rm(esc($val)));
                if(is_array($val))
                {
                    // チェックボックスなどで配列になっている時
                    $val = implode(', ', $val);
                }
                $mailTxt = str_replace("#".$key."#", trim(rm(esc($val))), $mailTxt);
            }
        }

        $mailer->From     = MAIL_ADMIN; //Fromの設定
        $mailer->FromName = "Support Team";
        
        if (empty($data['sendAdminOnly']) || $data['sendAdminOnly'] == 'false') {
            // ユーザーと管理者あて両方
            $mailer->addAddress($data['email'], $data['fullName']); // To宛先
            $mailer->addBcc(MAIL_ADMIN); // Bcc宛先
            $mailer->addBcc(MAIL_COMPANY); // Bcc宛先
            $to_email = $data['email'];
        } else {
            // 管理者あてのみ
            $mailer->addAddress(MAIL_ADMIN, 'BITRUSH Administrator'); // To宛先
            $mailer->addBcc(MAIL_COMPANY); // Bcc宛先
            $to_email = MAIL_ADMIN;
        }

        if ($mailer->addReplyTo(MAIL_ADMIN, 'BITRUSH Administrator')) {
        
            //$mailer->FromName = mb_convert_encoding("表示名だよ","UTF-8","AUTO");//表示名おまじない付…
            $mailer->Subject  = mb_convert_encoding(MAIL_TITLE,"UTF-8","AUTO");//件名の設定

            // HTMLを使用しない
            $mailer->isHTML(false);
            $mailer->Body     = mb_convert_encoding($mailTxt,"UTF-8","AUTO");//メッセージ本体

        } else {
            return false;
        }

        //添付ファイル追加
        if (!empty($data['files'])) {
            foreach ($data['files'] as $file) {
                if ($file != '') {
                    // 復号化してから添付
                    $enc_data = file_get_contents(UPLOAD_DIR. $file);
                    file_put_contents(UPLOAD_DIR. $file, decData($enc_data));
                    $mailer->AddAttachment(UPLOAD_DIR. $file);
                }
            }
        }

        // 送信して結果を返す
        return $mailer->Send();
    }

    // 改行を消す(メールヘッダ・インジェクション対策);
    function rm($str) {
      if(isset($str)) {
        str_replace(array("\r\n", "\r", "\n"), '', $str);
      }
      return $str;
    }

    /**
     * データを復号化する
     * @param  [type] $enc_file   [description]
     * @return [type]             [description]
     */
    function decData($enc_data)
    {
        //パラメータ設定
        $password = PASSWORD;
        $method   = 'aes-256-cbc';
        $options  = OPENSSL_RAW_DATA;
        $iv       = IV;
 
        //復号化
        $dec_data = openssl_decrypt(
                        $enc_data,
                        $method,
                        $password,
                        $options,
                        $iv
                    );
 
        //復号化済みデータを返す
        return $dec_data;
    }

    // エスケープ処理
    function esc($value, $enc = 'UTF-8') {
      if (is_array($value)) {
        return array_map('escape', $value);
      }
      return htmlspecialchars($value, ENT_QUOTES, $enc);
    }
?>
