Gmail API 署名取得 方法(PHP)

署名を取得するには、まずsendAsの一覧を取得し、その中から署名を取り出す。
sendAsとはGmailのエイリアス設定のこと。

Google_Service_Gmailクラスのメンバ変数 $users_settings_sendAslistUsersSettingsSendAs() メソッドを呼び出してsendAsの一覧を取得する。

//サービスオブジェクトを生成
$service = new Google_Service_Gmail($client);
//sendAs一覧レスポンスを取得
$sendAsRes = $service->users_settings_sendAs->listUsersSettingsSendAs($userId);
//sendAs一覧を取得
$sendAs = $sendAsRes->getSendAs();
//デフォルトの署名を取得
foreach ($sendAs as $sendas) {
  if($sendas->isDefault) {
    $signature = $sendas.getSignature();
    echo $signature;
  }
}

Gmail API メール送信 方法(PHP)

送信メッセージの作成を関数化

function createMessage() {
    $msg = new Google_Service_Gmail_Message();
    $data = "";
    $data.= "To: hoge\n"; //送信先
    $data.= "Cc: fuga\n"; //CC
    $subject = "[タイトル]"; //タイトル
    $data.= "Subject: " . mb_encode_mimeheader($subject, 'utf-8') . "\n";
    $data.= "\n"; //改行2回でヘッダー部分を区別
    $body = <<<EOF
    [本文内容]
EOF;
    $data.= $body;
    $data = base64_encode($data); //base64エンコードする
    $data = strtr($data, '+/', '-_'); //サニタイジング
    $data = rtrim($data, '='); //最後の'='を除去
    $msg->setRaw($data); //データをセット
    return $msg;  //返却
}
ポイント
  • Google_Service_Gmail_Messageクラスのオブジェクトを生成
  • タイトルをUTF-8でMIMEエンコード
  • BODY部はbase64エンコード

 

上記の関数を使用してメッセージを送信する

//オブジェクト生成
$service = new Google_Service_Gmail($client);
//メッセージ作成
$message = createMessage();
//メッセージ送信
$message = $service->users_messages->send($userId, $message);

赤アンダーラインがメッセージ送信の肝のメソッド

参考 sendメソッドの詳細はこちら


Gmail API メール取得 方法(PHP)

Gmail APIを使用してメッセージを取得するサンプル

メッセージ一覧取得

Gmail APIを使用したメッセージ一覧取得処理を関数化したもの

メッセージ一覧は一度に取得するのではなく、何回かに分割して取得し前回分にマージしていく。

その際の取得範囲を決定する情報がページトークン

function listMessages($service, $userId) {
  $pageToken = NULL; //ページトークン
  $messages = array(); //メッセージ
  $opt_param = array(); //オプションパラメータ
  do {
    try {
      if ($pageToken) {
        $opt_param['pageToken'] = $pageToken; //ページトークンをセット
      }
      //メッセージ一覧を取得
      $messagesResponse = $service->users_messages->listUsersMessages($userId, $opt_param);
      if ($messagesResponse->getMessages()) {
        //マージする
        $messages = array_merge($messages, $messagesResponse->getMessages());
        //ページトークン取得
        $pageToken = $messagesResponse->getNextPageToken();
      }
    } catch (Exception $e) {
      print 'An error occurred: ' . $e->getMessage();
    }
  } while ($pageToken);
  //メッセージを返却
  return $messages;
}

赤アンダーラインの箇所がメッセージ一覧を取得する肝のメソッド

メッセージ一覧は正確にはメッセージIDの一覧だと思ってください。

メッセージの具体的な内容の取得は次に説明するメッセージ取得でおこなう。

参考 listUsersMessagesメソッドの詳細についてはこちら

メッセージ取得

個々のメッセージを取得する場合の処理を関数化したもの

function getMessage($service, $userId, $messageId) {
  try {
    //メッセージ取得
    $message = $service->users_messages->get($userId, $messageId);
    //返却
    return $message;
  } catch (Exception $e) {
    print 'An error occurred: ' . $e->getMessage();
  }
}

赤アンダーラインの箇所がメッセージ取得の肝のメソッド

参考 getメソッドの詳細についてはこちら

メッセージ本文取得

function getMessageBody($message) {
  //bodyを取得
  $body = $message->getPayload()->getBody();
  $rawData = $body->data;
  $sanitizeData = strtr($rawData, '-_', '+/'); //サニタイジングを戻す
  $decodeMessage = base64_decode($sanitizeData); //base64デコード
  //返却
  return $decodeMessage;
}
メッセージ本文はbase64エンコードされているためデコードする

一連の処理サンプル

//サービスオブジェクト
$service = new Google_Service_Gmail($client);
//ユーザーID(当該ユーザーの場合は'me'を渡す)
$userId = 'me';
//メッセージ(ID)一覧
$messages = listMessages($service, $userId);
//ループ
foreach ($messages as $msg) {
  //メッセージID
  $messageId = $msg->getId();
  //メッセージ(オブジェクト)取得
  $message = getMessage($service, $userId, $messageId);
  //メッセージ本文取得
  $messageBody = getMessageBody($message);
  //出力
  echo $messageBody;
}

Gmail API PHP の手引き2

Google_Service_Gmail_UsersMessages
_Resourceクラス

Google_Service_Gmailクラスのメンバ変数 $users_messages の型(クラス)となる。

ユーザーメッセージの取得や送信などGmailの基本的な処理に使用

主なメソッドは以下のとおり

getメソッド

指定されたメッセージを取得する。

  /**
   * @引数1 string $userId //ユーザーID
   * @引数2 string $id //メッセージID
   * @引数3 array $optParams //オプションパラメータ
   * @返り値 Google_Service_Gmail_Message //オブジェクト
   */
public Google_Service_Gmail_Message get($userId, $id, $optParams = array())

listUsersMessagesメソッド

ユーザーのメールボックスにあるメッセージを一覧表示する。

  /**
   * @引数1 string $userId //ユーザーID
   * @引数2 array $optParams //オプションパラメータ
   * @返り値 Google_Service_Gmail_ListMessagesResponse //オブジェクト
   */
  public Google_Service_Gmail_ListMessagesResponse listUsersMessages($userId, $optParams = array())

sendメソッド

指定したメッセージを送信する。

  /**
   * @引数1 string $userId //ユーザーID
   * @引数2 Google_Service_Gmail_Message $message//メッセージ
   * @引数3 array $optParams //オプションパラメータ
   * @返り値 Google_Service_Gmail_Message //オブジェクト
   */
  public Google_Service_Gmail_Message send($userId, $message, $optParams = array())

参考 その他のメソッドについてはこちら

ソースコードサンプル

メール取得方法

メール送信方法

 

Gmail API Client PHP の手引き1

 

Google_Service_Gmail
_UsersSettingsSendAs_Resourceクラス

Google_Service_Gmailクラスのメンバ変数 $users_settings_sendAs の型(クラス)となる。

署名の取得など、Gmailのエイリアス情報にアクセスする。

listUsersSettingsSendAsメソッド

/**
 * @引数1 string $userId //ユーザーID
 * @引数2 array $optParams //オプションパラメータ
 * @返り値 e_Service_Gmail_ListSendAsResponse //オブジェクト
 */
listUsersSettingsSendAs( string $userId, array $optParams = array() )

ソースコードサンプル

署名取得方法


Gmail API PHP の手引き1

Gmail APIの概要

googleが提供しているgmail用APIの主な使い方。

実際に使用する際にはgoogleの管理コンソールで設定したりクライアントライブラリを取得したりといろいろお膳立てがあるが、ここでは主にAPIの使い方に重きをおいて書く。

グーグルのAPIを使用する際に基本となるサービスクラスがあるが、Gmailの場合はそのサービスクラスがGoogle_Service_Gmailクラスになる。

このサービスクラスにクライアント情報(認証用キーファイル、ユーザーアカウントなど)を付随させつつ、しかるべきメソッドにアクセスして目的を果たすというようなイメージ

google-api-php-clientのインストール

composerを使ってgoogle-api-php-clientをインストールする。

参照 google-api-php-clientのインストール

クライアント情報(オブジェクト)の生成

実際にGmail APIを使用する場合、まずはじめにクライアント情報となるオブジェクトを生成し、必要な情報をセットする。

$client = new Google_Client();
$client->setApplicationName([アプリケーション名]); //たぶん何でもよい
$client->setAuthConfig([認証用キーファイル]); //JSONファイル
$client->setScopes([スコープ]); //グーグルの管理コンソールで設定する値
$client->setSubject([ユーザーアカウント]); //メールボックスにアクセスするユーザーのメールアカウント

このオブジェクト($client)を、以下で説明するGoogle_Service_Gmailクラスのオブジェクトを生成する際の引数としてセットする。

Google_Service_Gmailクラス

gmailのAPIを使用する際にメインとなるサービスクラス

使い方としてはまずGoogle_Service_Gmailクラスのオブジェクトを生成し、そのオブジェクトのメンバ変数がもつメソッドを呼び出すことによりメッセージの取得や送信などさまざまな処理をおこなう。

//クラスのオブジェクトを生成する
$service = new Google_Service_Gmail($client)
//メンバ変数のメソッドを呼び出す
$messages = $service->user_messages->get(userId, $id, optParams)

メンバ変数(プロパティ)

$users
$users_drafts
$users_history
$users_labels
$users_messages
$users_messages_attachments
$users_settings
$users_settings_filters
$users_settings_forwardingAddresses
$users_settings_sendAs
$users_settings_sendAs_smimeInfo
$users_threads

リンクをクリックするとそのメンバ変数がもつクラスとそのメソッドを参照できます。

これで基本的なメソッドの使用方法がご理解いただけたかと。しかしメソッドを使ってメッセージ(オブジェクト)を取得した場合、その内部構造はどうなるのか?

それが以下で説明するGoogle_Service_Gmail_Messageクラス

Google_Service_Gmail_Messageクラス

gmailメッセージ本体の型(クラス)

例えばメッセージ取得メソッドによって取得したオブジェクトの型がこれに相当する。

//@返り値 Google_Service_Gmail_Message $message
$message = $service->users_messages->get($userId, $messageId);

そのオブジェクトからさらにメールタイトルや本文内容を取得したい場合はゲッターメソッド(get○○)を使用する。

また、メッセージを送信する場合はこのクラスのオブジェクトを生成して、セッターメソッド(set○○)で必要な値をセットした後、メッセージ送信メソッドで送信する。

//オブジェクトを生成
$message = new Google_Service_Gmail_Message();
//必要な値をセット
$message->setRaw($raw);
//メソッド呼び出し
$service->user_messages->send($userId, $message);


Google_Service_Gmail_Messageクラスの内部構造(プロパティ)は以下のようになっている。

{
  "id": string,
  "threadId": string,
  "labelIds": [
    string
  ],
  "snippet": string,
  "historyId": unsigned long,
  "internalDate": long,
  "payload": {
    "partId": string,
    "mimeType": string,
    "filename": string,
    "headers": [
      {
        "name": string,
        "value": string
      }
    ],
    "body": users.messages.attachments Resource,
    "parts": [
      (MessagePart)
    ]
  },
  "sizeEstimate": integer,
  "raw": bytes
}

各プロパティに対して以下のようなゲッター、セッターが存在する。

ゲッター・セッター一覧

setHistoryId( mixed $historyId )
getHistoryId()
setId( mixed $id )
getId()
setInternalDate( mixed $internalDate )
getInternalDate()
setLabelIds( mixed $labelIds )
getLabelIds()
setPayload( Google_Service_Gmail_MessagePart $payload )
getPayload()
setRaw( mixed $raw )
getRaw()
setSizeEstimate( mixed $sizeEstimate )
getSizeEstimate()
setSnippet( mixed $snippet )
getSnippet()
setThreadId( mixed $threadId )
getThreadId()

ソースコードサンプル

以上がGmail APIを使用する際のおおまかな説明

具体的なサンプルを記載しましたので上記を踏まえた上でご覧いただければと

メール取得方法

メール送信方法

署名取得方法

 

Gmail API Client PHP の手引き2


CentOS6 Apache の設定

CentOS6 Apache 設定

ホームページを公開するのに必要なWebサーバーがApache

 

Apacheインストール確認

httpdがインストールされているか確認する。

[root@localhost ~]# yum list installed | grep httpd

なければインストールする。

yum -y install httpd

 

設定ファイルの確認

設定ファイルのhttpd.confを確認する。

[root@localhost ~]# cd /etc/httpd/conf
[root@localhost ~]# vi httpd.conf

DocumentRootに指定されているディレクトリがホームページ公開用フォルダ。

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

index.htmlファイルを作成し、ドキュメントルートに設置する。

<html>
<body>
Hello World!
</body>
</html>

 

Apacheの起動

Apacheを起動し、再起動時の設定もおこなう。

[root@localhost ~]# service httpd start
[root@localhost ~]# chkconfig httpd --list

 

ブラウザで確認

http://localhost/で確認する。


nodejsでchatをつくってみた

まずは準備
socket.ioをインストールする

[root@localhost app2.chat]# npm install socket.io --save

ついでにfsもインストールしておく

[root@localhost app2.chat]# npm install fs --save

app.jsの編集

var http = require('http');
var socketio = require('socket.io');
var fs = require('fs');

//サーバを立ち上げる
var server = http.createServer(function(req, res) {
  res.writeHead(200, {"Content-Type": "text/html"});
  var output = fs.readFileSync('./index.html', 'utf-8');
  res.end(output);
});
server.listen(3000, function() {
  console.log("running..");
});

//サーバとソケットを紐付ける
var io = socketio.listen(server);

//イベント受付処理
io.sockets.on("connection", function(socket) {

  socket.on("C_to_S_message", function(data) {
    //サーバからイベントを発火させる
    io.sockets.emit("S_to_C_message", {value:data.value});
  });
});

index.htmlの編集

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
$(function() {
  var s = io.connect();
  //サーバーから受け取るイベント
  s.on("S_to_C_message", function(data) {
    $("#message").append("<li>" + data.value + "</li>");
  });
  //クライアントからサーバーへイベント送信
  $(document).on("click", "#submit", function() {
    var msg = $("#text").val();
    s.emit("C_to_S_message", {value:msg});
});
</script>
</head>
<body>
<ul id="message"></ul>
<input id="text"><button id="submit">send</button>
</body>
</html>

CentOS6 SSH 接続 するための設定

CentOS6 SSH 接続 をおこなうための設定方法。サーバを構築する際には必須の設定になるかと。

 

SSH インストール

SSHがインストールされているかどうかを確認

[root@localhost ~]#yum list installed | grep ssh

なければインストール

[root@localhost ~]#yum -y install openssh-server

 

ネットワーク の設定

設定ファイルを開く。

[root@localhost ~]#cd /etc/sysconfig/network-scripts
[root@localhost ~]#vi ifcfg-eth1

編集内容

DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
HWADDR=物理アドレス #ifconfigコマンドで確認する
NAME="System eth1"
IPADDR=192.168.15.204 #設定したいIPアドレス
NETMASK=255.255.255.0
IPV6INIT=no

設定は以上

 

ネットワーク の確認

ネットワークを再起動

[root@localhost ~]#service network restart

ifconfigコマンドでIPアドレスが設定されていることを確認

[root@localhost ~]#ifconfig

inet addr:192.168.15.204となっていることを確認

eth1      Link encap:Ethernet  HWaddr 08:00:27:70:**:**
          inet addr:192.168.15.204  Bcast:192.168.15.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe70:****/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:190 errors:0 dropped:0 overruns:0 frame:0
          TX packets:267 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23171 (22.6 KiB)  TX bytes:73626 (71.9 KiB)

 

SSH 起動設定

SSHを起動します。サーバーが再起動する際の自動起動設定もおこなう。

[root@localhost ~]#service sshd start
[root@localhost ~]#chkconfig sshd on

 

SSH 接続 確認

ターミナルで接続を確認

ログインできた


SSH 公開鍵 認証 を検証してみた

SSH 公開鍵 認証 を検証してみた。

SSH接続をおこなう際、パスワードではなく公開鍵と秘密鍵で認証するように設定

※CentOS6を前提にしています。

 

公開鍵と秘密鍵とは?

公開鍵と秘密鍵はペアになっており、公開鍵で暗号化した文字列は秘密鍵でしか復号化できない。

逆に秘密鍵で暗号化した文字列は公開鍵でしか復号化できない。

SSH公開鍵認証はこの仕組みが利用されている。

サーバー側からランダムな数字を公開鍵によって暗号化したものが送られ、クライアント側でそれを秘密鍵によって復号化してサーバーに送り返し、両者が一致しているかどうかで認証している。

 

公開鍵 と 秘密鍵 の作成

ssh-keygenコマンドで公開鍵と秘密鍵のペアを作成する。(タイプ:RSA)

[sepg@localhost ~]$ ssh-keygen -t rsa

いろいろ聞かれるがすべてEnter

Generating public/private rsa key pair.
Enter file in which to save the key (/home/sepg/.ssh/id_rsa):
Created directory '/home/sepg/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sepg/.ssh/id_rsa.
Your public key has been saved in /home/sepg/.ssh/id_rsa.pub.
The key fingerprint is:
3f:b9:88:f5:fd:31:8c:12:0e:4c:df:9e:0b:71:3e:2d sepg@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        .        |
|       o . .     |
|        S + o    |
|         + B =   |
|        . B E =  |
|       o o * + o |
|      . . o o..  |
+-----------------+

.sshディレクトリの中に鍵ファイルが作成される。

[sepg@localhost ~]$ cd .ssh
[sepg@localhost .ssh]$ ll
total 8
-rw------- 1 sepg sepg 1675 Mar  4 13:53 id_rsa
-rw-r--r-- 1 sepg sepg  408 Mar  4 13:53 id_rsa.pub

公開鍵(id_rsa.pub)をauthorized_kesファイルに書き出してパーミッションを設定(root権限で)

[sepg@localhost .ssh]$ cat id_rsa.pub > authorized_keys
[root@localhost .ssh]# chmod 600 authorized_keys

/etc/ssh/sshd_configの設定

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

 

SSH 接続確認

秘密鍵(id_rsa)をローカルのデスクトップにダウンロードする。

ターミナルで繋いで見る
・◎RSA/../../鍵を使う
・秘密鍵ボタンでダウンロードした秘密鍵(id_rsa)を選択

ログインできた

おわり


nodejs インストールと初期設定

nodejsのインストール

nodejsとnpmをインストールする

//nodejsとnpmをインストール
[root@localhost nodejs]# yum -y install --enablerepo=epel nodejs npm

nをインストール

[root@localhost nodejs]# npm -g install n inherits //nをインストール
-gはグローバルのオプション(うまくいかない場合は外してみる)

nodejsをいったん削除し、nで再びインストールする

[root@localhost nodejs]# yum remove nodejs //nodejsを削除
[root@localhost nodejs]# n stable //nodejsをインストール

初期設定

ディレクトリを作成し、その中でnpm initをおこなう。

[root@localhost nodejs]# mkdir app1
[root@localhost nodejs]# cd app1
[root@localhost app1]# npm init

いろいろ聞かれるがすべてEnter

his utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (app1)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /root/nodejs/app1/package.json:

{
  "name": "app1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes)

リスト表示で確認

[root@localhost app1]# ll
total 24
drwxr-xr-x 50 root root 4096 Mar 4 10:32 node_modules
-rw-r--r-- 1 root root 250 Mar 4 10:32 package.json
-rw-r--r-- 1 root root 12915 Mar 4 10:32 package-lock.json

node_modulesやpackage.jsonが入った

expressをインストールする場合

[root@localhost app1]# npm install express --save //saveオプションでpackageに依存関係を記述
npm WARN app1@1.0.0 No description
npm WARN app1@1.0.0 No repository field.

おわり