SQLの窓

2015年01月14日


GitHub の google-api-php-client( PHP ) を使って、Gmail でメールを送る( 添付ファイル付き )

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の最新記事】
posted by lightbox at 2015-01-14 15:34 | Google | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり