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

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

ただいまの
回答率

89.96%

Gmail APIを使いPHPでのメール送信に変数を利用したいです

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,074

natlpush

score 26

前提・実現したいこと

Gmail api を使いメール送信を行います。
下記のURLを参考にコードを書き、無事に動きましたが・・・
https://www.note.technology/note/201604102243

下記のソースでは件名や本文が直接書き込んであります。
ここを変数で処理したいのですが上手く行きません。
クエリを上手く渡す方法をお知りの方、お力をお貸しいただけますでしょうか。

該当のソースコード

<?php
session_start();

require_once 'google-api-php-client-2.0.0-RC7/vendor/autoload.php';

$client_id     = '**********';
$client_secret = '**********';
$redirect_uri  = {redirect_uri};

$to_email_address = {to_email_address};

$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->setState('offline');
$client->addScope("https://www.googleapis.com/auth/gmail.compose");

$service = new Google_Service_Gmail($client);

$auth_url = $client->createAuthUrl();


if(isset($_GET['code']))
{
    //get access token
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();

    header("Location: {$redirect_uri}");

}elseif(isset($_SESSION['access_token'])){

    //mail send
    $client->setAccessToken($_SESSION['access_token']);

    $subject = mb_convert_encoding( "タイトル", "JIS", "UTF-8" );
    $subject = "Subject: =?ISO-2022-JP?B?" . base64_encode($subject) . "?=";
    $to = "To: {$to_email_address}";
    $body = "本文。";
    $send_data = "$subject\n$to\n\n$body";
    $send_data = rtrim(strtr(base64_encode($send_data), '+/', '-_'), '=');

    $msg = new Google_Service_Gmail_Message();
    $msg->setRaw($send_data);
    $result = $service->users_messages->send("me", $msg);

    unset($_SESSION['access_token']);

}else{
    //oauth
    print("<a href=\"{$auth_url}\">認証してテストメールを送信</a>");
}

試したこと

上記ソースの冒頭部分に以下を挿入しました。

$name=$_GET['name'];

$message = <<< EOF
{$name} さま

本文

EOF;

そして

$body = "本文。";

$body = $message;
としました。

$auth_url = $client->createAuthUrl();
の後に
$auth_url .= "&name=aaaaa";

と試しにしたところ、nameが空白になってしまいクエリが渡せません。

変数でnameを変化させたいのですが、お力をお借りできますでしょうか。
どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2016/09/30 14:52

    コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • kunai

    2016/09/30 14:58

    まず$_GETで値が取れているか確認をお願いします。
    var_dump($_GET);
    など記述して

    キャンセル

  • natlpush

    2016/09/30 15:24

    最初は$_GETで値が取れているのですが、「認証してテストメールを送信」というリンクをクリックした後には値が取れていません。ここで上手くわたせてないようです。よろしくお願いいたします。

    キャンセル

回答 3

+1

多分、何か大きな勘違いをされてるのではないかと思うのですが。

$auth_url = $client->createAuthUrl();
//追加
var_dump($auth_url);
exit();

と、して中身を見てください。
そのURLは、「認証の為に」Googleへ飛ばすURLですよ。

if(isset($_GET['code']))


Googleからcodeが返ってきたら、それをセッションに保存。
再度、自分自身($redirect_uri)へリダイレクトで飛ばす。

}elseif(isset($_SESSION['access_token'])){


戻ってきた時に、セッションに、access_tokenがセットされていたら、それを基に、そこで初めてGoogle_Service_Gmailの利用を開始してるという一連の処理があります。

}else{

$auth_urlは、まだ認証も何もとれていない状態で使うURLです。

ただの「GmailAPIをテストするためだけの」プログラムを持ってきて、それを拡張しようとするのは、時間の無駄かと思います。

典型的な「バッドプラクティス」です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

0

回答を下さった方、コメントを下さった方ありがとうございました。
色々と試みましたが、やはり認証を越えてクエリをクエリを継承することはできないようでした。

視点を変えて、クエリ部分を外部ファイルに書き出し、送信時に再度読み込むようにしたところ上手く行きました。

ただ別の問題も生じてきましたので、また改めて質問させていただきたいと思います。
その時はどうぞよろしくお願いいたします。

ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/06 12:51 編集

    済んだ事を蒸し返すようで、大変恐縮ですが。

    > 視点を変えて、クエリ部分を外部ファイルに書き出し、送信時に再度読み込むようにしたところ上手く行きました。

    まぁ、処理を分割すれば出来るだろうなとは思いましたが、あえてそれは私の回答にはしませんでした。

    > 色々と試みましたが、やはり認証を越えてクエリを継承することはできないようでした。

    「色々と試み」をする場面では、無いと思っているからです。
    プログラマが創意工夫を凝らす場面ではありません。

    仮に「認証を越えてクエリを継承する」事が出来るのであれば、公式ドキュメントに書いてあるでしょう。
    サンプルプログラムも載っているはずです。
    すみません。出来る出来ないまでは、私はドキュメントを見て、調べてません。

    「もしかしたら、出来るかも」と、自分の憶測であれこれ試行錯誤する事が、時間の無駄だと申し上げました。

    1.最新のライブラリを使わなければいけません。
    2.利用方法は、公式ドキュメントに載っている方法に準拠すべきです。
    3.公式ドキュメントが難しい、自分のやりたい事がなかなか実現できない場合、とにかく人が書いた方法を、たくさん探す事です。
    4.もしいろいろ探しても、自分に合った方法が見つからなければ、自分のやろうとしている事を疑い、改めなければいけません。

    もし自分で工夫して、曲がりなりに動いたとしても、その方法は採用すべきではありません。
    APIの利用などを、独自の方法でやろうとすれば、すぐセキュリティリスクを抱える事になります。

    覚えた技術だけで対応しようとする、典型的な「金のハンマー」です。

    質問者さんがどのように考えていらっしゃるのか、もちろん判らないままのコメントです。
    ただ、どうもそのように見受けられてしまったので、しつこいようですが、コメントいたしました。

    頭の片隅にでも、置いておいていただければと思います。

    キャンセル

0

値が取れていると仮定して、下記のようになるのでは。

// $auth_url .= &name=aaaaa; 
// ↓
   $auth_url .= '&name='.htmlspecialchars( urlencode( $name ), ENT_QUOTES, 'UTF-8' );

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/30 15:43

    値が取れないんです。
    $messageはそのままOKなのですが、$auth_urlの飛び先で値が消えてしまうのです。

    $auth_url .= &name=aaaaa;
    は表記ミスでした。
    正しくは
    $auth_url .= ”&name=aaaaa”;
    です。
    本文の方を修正しておきます。
    申し訳ありません。

    キャンセル

  • 2016/09/30 15:52

    htmlspecialchars & urlencode は必須ですよー。
    とりあえずHTML出力した後の「$auth_url」部分に正しく想定しているURLが入っているか、確認されてみては?

    また、「$name=$_GET['name'];」とそのまま検証無しに使われていますが、入っているかどうかもチェックされては?

    キャンセル

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

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