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

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

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

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Gmail

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

5617閲覧

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

natlpush

総合スコア32

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

Gmail

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2016/09/30 00:34

編集2016/09/30 06:45

###前提・実現したいこと
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を変化させたいのですが、お力をお借りできますでしょうか。
どうぞよろしくお願いいたします。

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

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

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

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

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

kei344

2016/09/30 05:52

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

2016/09/30 05:58

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

2016/09/30 06:24

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

回答3

0

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

php

1$auth_url = $client->createAuthUrl(); 2//追加 3var_dump($auth_url); 4exit();

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

php

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

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

php

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

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

php

1}else{

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

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

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

投稿2016/09/30 09:39

編集2016/09/30 16:02
pack

総合スコア256

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

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

0

自己解決

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

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

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

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

投稿2016/10/01 03:24

natlpush

総合スコア32

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

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

pack

2016/10/06 04:18 編集

済んだ事を蒸し返すようで、大変恐縮ですが。 > 視点を変えて、クエリ部分を外部ファイルに書き出し、送信時に再度読み込むようにしたところ上手く行きました。 まぁ、処理を分割すれば出来るだろうなとは思いましたが、あえてそれは私の回答にはしませんでした。 > 色々と試みましたが、やはり認証を越えてクエリを継承することはできないようでした。 「色々と試み」をする場面では、無いと思っているからです。 プログラマが創意工夫を凝らす場面ではありません。 仮に「認証を越えてクエリを継承する」事が出来るのであれば、公式ドキュメントに書いてあるでしょう。 サンプルプログラムも載っているはずです。 すみません。出来る出来ないまでは、私はドキュメントを見て、調べてません。 「もしかしたら、出来るかも」と、自分の憶測であれこれ試行錯誤する事が、時間の無駄だと申し上げました。 1.最新のライブラリを使わなければいけません。 2.利用方法は、公式ドキュメントに載っている方法に準拠すべきです。 3.公式ドキュメントが難しい、自分のやりたい事がなかなか実現できない場合、とにかく人が書いた方法を、たくさん探す事です。 4.もしいろいろ探しても、自分に合った方法が見つからなければ、自分のやろうとしている事を疑い、改めなければいけません。 もし自分で工夫して、曲がりなりに動いたとしても、その方法は採用すべきではありません。 APIの利用などを、独自の方法でやろうとすれば、すぐセキュリティリスクを抱える事になります。 覚えた技術だけで対応しようとする、典型的な「金のハンマー」です。 質問者さんがどのように考えていらっしゃるのか、もちろん判らないままのコメントです。 ただ、どうもそのように見受けられてしまったので、しつこいようですが、コメントいたしました。 頭の片隅にでも、置いておいていただければと思います。
guest

0

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

PHP

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

投稿2016/09/30 06:26

kei344

総合スコア69398

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

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

natlpush

2016/09/30 06:43

値が取れないんです。 $messageはそのままOKなのですが、$auth_urlの飛び先で値が消えてしまうのです。 $auth_url .= &name=aaaaa; は表記ミスでした。 正しくは $auth_url .= ”&name=aaaaa”; です。 本文の方を修正しておきます。 申し訳ありません。
kei344

2016/09/30 06:52

htmlspecialchars & urlencode は必須ですよー。 とりあえずHTML出力した後の「$auth_url」部分に正しく想定しているURLが入っているか、確認されてみては? また、「$name=$_GET['name'];」とそのまま検証無しに使われていますが、入っているかどうかもチェックされては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問