google-api-php-client Client ID と Client secret と Redirect URIs が必要です ( APIs Console ) 単純なテキスト本文の送信との違いは、メール送信時の仕様通りにバイナリデータ部分とテキスト本文をそれぞれパートに分けてデータを作成しているところです。 単純なテキスト本文の送信では、subject を JIS に変換して送っていましたが、結局 Google の API 側で UTF-8 に変更されていました。なので、ここでは最初から UTF-8 を使用しています。テキスト本文の部分には改行は必要無く、API 側で作成してくれていました。しかし、バイナリ部分の改行はこちらで作成する(chunk_split)必要がありました。 添付データはテスト結果が解りやすい画像を固定で使用しています。アクセストークンが取得てきた場合、フォームを表示するようにして、送り先メールアドレスと件名と本文を入力して送信した場合にメールを送るようにしています。 送信先のテストとしては、Yahoo!メール と、Hotmail と、Nifty のメールで正しく送信されている事を確認しました。
<?php /* * Copyright 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ include_once "templates/base.php"; session_start(); header( "Content-Type: text/html; Charset=utf-8" ); header( "pragma: no-cache" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); header( "Cache-control: no-cache" ); require_once realpath(dirname(__FILE__) . '/../autoload.php'); /************************************************ $redirect_uri はこのスクリプトの URL ************************************************/ $client_id = ''; $client_secret = ''; $redirect_uri = 'http://localhost/gapi/examples/gmail-send.php'; /************************************************ クライアントの作成 ************************************************/ $client = new Google_Client(); $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setRedirectUri($redirect_uri); /************************************************ サービスの作成 ************************************************/ // https://developers.google.com/gmail/api/auth/scopes // https://developers.google.com/gmail/api/v1/reference/users/messages/send $client->addScope("https://mail.google.com/"); $service = new Google_Service_Gmail($client); /************************************************ アクセストークンの取得プロセス ************************************************/ if (isset($_REQUEST['logout'])) { unset($_SESSION['access_token']); } if (isset($_GET['code'])) { $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); if ($client->isAccessTokenExpired()) { unset($_SESSION['access_token']); } } else { $authUrl = $client->createAuthUrl(); } /************************************************ アクセストークンが取得できた時の処理 ************************************************/ if ($client->getAccessToken() && $_POST['send'] != '' && $_POST['body'] != '') { // メール送信 $subject = "Subject: =?UTF-8?B?" . base64_encode($_POST['subject']) . "?="; $to = "To: {$_POST['to']}"; $body = $_POST['body']; // 添付用データの準備 $uniqid = uniqid(); $mime = "image/jpeg"; $fname = "test.jpg"; $attachment_fname = "日本語のファイル名.jpg"; $attachment_fname = "=?UTF-8?B?" . base64_encode($attachment_fname) . "?="; // ファイルアップロードと同様の使用でメールデータを作成 $sendtype .= "Content-Type: multipart/mixed; boundary=\"{$uniqid}\""; // テキスト本文 $body = "--{$uniqid}\n"; $body .= "Content-Type: text/plain; charset=\"utf-8\"\n"; $body .= "\n"; $body .= $_POST['body'] . "\n"; // バイナリ添付データ $body .= "--{$uniqid}\n"; $body .= "Content-Type: {$mime}; name=\"{$attachment_fname}\"\n"; $body .= "Content-Transfer-Encoding: base64\n"; $body .= "Content-Disposition: attachment; filename=\"{$attachment_fname}\"\n"; $body .= "\n"; $path = "./$fname"; $data = file_get_contents($path); $encode = base64_encode($data); $body .= chunk_split($encode); $body .= "\n--{$uniqid}--\n"; // 全体データの構築 $send_data = "$subject\n$to\n$sendtype\n\n$body"; // Base64URL $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); } echo pageHeader("Gmail メール送信"); if ($client->getAccessToken()) { ?> <div style='width:300px;margin:auto'> <form method="post" > <input type="text" name="to"><br> <input type="text" name="subject"><br> <textarea name="body" style='height:100px;'></textarea><br> <input type="submit" name="send" value="送信"> </form> </div> <?php } ?> <div class="box"> <div class="request"> <?php if (isset($authUrl)) { echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>"; } ?> </div> <pre class="shortened" style='width:100%;height:500px;'> <?php if (isset($result) && $result) { print_r($result); } ?> </pre> </div>
関連する記事
|
【Googleの最新記事】
- Google 共有ドライブの容量の上限について
- Google Classroom は無料の G Suite for Education アカウントが必要
- 教室と一対一のフォルダより新しく登録されたフォルダの中にあるZoom動画ファイルを該当するClassroom の コース内の該当するトピックに登録する
- Google Apps Script : 動画を添付して Classroom の指定のトピックへ課題として投稿する
- Google Classroom のテーマ画像のサイズと既存画像をテーマ画像として使用してみた手順
- Google Chrome でスマホのソースコードをごく普通に表示して利用する
- Gmail に 実行可能なファイルの拡張子を持つファイルを格納した zip 書庫は送れません
- Gmail で添付できないファイルをエクスプローラで検索する為の文字列
- jQuery で既存 table より Firebase Database のデータを作成する
- jQuery + Bootstrap(css) + mmenu : Firebase Database 参照と更新サンプル( 新規登録テンプレートより )
- jQuery + Bootstrap(css) + mmenu : Firebase Database 新規登録テンプレート
- jQuery + Bootstrap(css) + mmenu : Firebase ログインテンプレート
- Google ドライブの WEBホスティングが無くなったので、Google の Firebase をとりあえず使う方法
- Google サイト内検索の FORM 要素による設置
- ブラウザの geolocation で Google MAP に現在地を表示。ライブラリでさらに詳細情報。API の geocoder で名称・住所から Google MAP を表示して、ライブラリで..
- Google+ に投稿するテキスト内の文字列を太字(ボールド)にしたりイタリックにしたりする方法
- Google の Plus API を使って Google+ 投稿データを jQuery UI のアコーディオン(accordion)で表示する
- Google の タスク API(ToDoリスト) を使ってタスクリストとタスクのタイトルを jQuery のプラグインでメニュー化する
- Google API の中でも単純な Task API を使って、アクセストークン取得のテンプレートを整備しました
- GitHub の google-api-php-client( PHP ) を使って、Gmail でメールを送る