15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

NIJIBOXAdvent Calendar 2022

Day 24

GASを使ってボタン一つでOutlookでメールを送信したいんじゃ!

Last updated at Posted at 2022-12-23

概要

私の所属しているチームでは、出退勤報告をいくつかの所属組織に対してする必要があるのですが、毎回色々なところに報告をしていると、「あれ、報告したっけ?」みたいことが起こります。
そしてその報告の中には、Outlookでメールを送信する必要があるものがあります。

メーラー立ち上げて、メール書いて、送信して…
これを出退勤のたびにやるのです。





え、面倒くさくね?
簡単にOutlookでメールが送信したいんじゃ!





今回はGASを使って1クリックでOutlookを使ってメール送信する方法をまとめました。

今回使うもの

  • Microsoft Graph API の Outlook メール REST API

  • Google Apps Script

  • Microsoft Azure

  • Outlook(事前にアカウントを作っておいてくださいm(_ _)m)

今回説明しないもの

  • GAS
  • ターミナル

実装

1. Microsoft Azureでアプリケーションを作成する

ログインする

以下より作成済みのOutlookアカウントでログインしてください。

スクリーンショット 2022-12-16 14.52.59.png

アプリケーションを登録する

ログインできたら、アプリケーションの登録を行います。
まずは以下にアクセスしてください。

↓こんな画面が表示されるので、左上の「新規追加」をクリックします。
スクリーンショット 2022-12-14 13.12.21.png

↓こんな感じで登録します。

image.png

認証を追加する

左メニューから「認証」をクリックすると↓の画面が表示されるので、「プラットフォームを追加」をクリックします
スクリーンショット 2022-12-14 13.52.31.png

プラットフォーム構成の追加フォームが表示されるので、それぞれ以下のように設定します

  • Webアプリケーション: Web
  • リダイレクトURI: http://localhost:8888/authorized
  • 暗黙的な許可およびハイブリッド フロー: すべてチェック

クライアントシークレットを追加する

左メニューから「証明書とシークレット」をクリックすると↓の画面が表示されるので、「新しいクライアントシークレット」をクリックします。
スクリーンショット 2022-12-14 13.55.27.png

右からシュッとモーダルが出るので、適当な説明書きをつけて追加すると↓のように追加されます。
スクリーンショット 2022-12-14 13.56.13.png

このとき、追加したクライアントシークレットの「値」を絶対に保存しておくようにしてください。
ここで値を保存しないと二度と確認できなくなります。
絶対に保存してください。
大事なことなので2回言いました。

APIのアクセス許可を追加する

左メニューから「APIのアクセス許可」を選択すると↓の画面に遷移するので「アクセス許可の追加」をクリックします。
スクリーンショット 2022-12-14 13.17.10.png

右からシュッと↓が表示されるので、今回使う「Microsoft Graph」をクリックします。
スクリーンショット 2022-12-14 13.17.29.png

「委任されたアクセス許可」をクリックすると、↓が表示されるので、「Mail.Send」にチェックを入れてアクセス許可の追加をします。
image.png

APIを公開する

左メニューから「APIの公開」をクリックすると↓が表示されるので「アプリケーションIDのURI」の右にある「設定」をクリックしてURIを設定します
スクリーンショット 2022-12-14 13.35.57.png

URIを設定するとこんな感じでURIが表示されるようになります
スクリーンショット 2022-12-14 13.36.24.png

次に「Scopeの追加」をクリックするとスコープの追加モーダルが表示されるので、↓みたいな感じでスコープを追加します
スクリーンショット 2022-12-14 13.37.54.png

全部できるとこんな感じ↓
スクリーンショット 2022-12-16 15.56.57.png

概要を確認

左メニューの「概要」をクリックすると登録内容の概要が確認できます
すべての登録が完了するとこんな感じになります↓
スクリーンショット 2022-12-16 16.10.07.png

2. アプリケーションのアクセストークンを取得する

承認コードの取得

まずはアクセストークンを取得するための承認コードを取得します。

エンドポイント: login.microsoftonline.com/common/oauth2/v2.0/authorize
パラメータ:

パラメータ 解説
client_id 「概要」に表示される「アプリケーション (クライアント) ID」
response_type codeを固定で入れる
redirect_uri 認証を追加する で追加したリダイレクトURI
今回はhttp://localhost:8888/authorized
scope APIのアクセス許可を追加する で指定したAPIのアクセス許可
今回はhttps://graph.microsoft.com/Mail.Send
response_mode 今回はqueryを指定する
state 任意で指定する
内部での乱数の生成にも使われるらしい

以下のURLをブラウザに入力してアクセスします。

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=<アプリケーション(クライアント)ID>&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Fauthorized&response_mode=query&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.send+offline_access&state=1234

アカウント選択ページに遷移するので、今回使用しているOutlookのアカウントを選択します。
すると作成したアプリのサインイン画面↓に遷移するので「続行」をクリックします。
スクリーンショット 2022-12-16 16.41.52.png

設定したリダイレクトURIに遷移します。
エラーページが表示されますが、URLをよく見るとパラメータにcodeが含まれています。
スクリーンショット 2022-12-16 16.44.59.png
これが認証コードです。

http://localhost:8888/authorized?code=<認証コード>&state=1234

アクセストークンの取得

次に、先程の認証コードを利用してアクセストークンを取得します。
取得にはターミナルを利用するのが一番手っ取り早いです。

エンドポイント: login.microsoftonline.com/common/oauth2/v2.0/token
メソッド: POST
ヘッダー: Content-Type: application/x-www-form-urlencoded
パラメータ:

パラメータ 解説
client_id さっきと一緒
scope さっきと一緒だけど今回はmail.sendだけでおk
code さっき取得した認証コード
redirect_uri さっきと一緒
grant_type authorization_codeを指定する
client_secret クライアントシークレットを追加する で取得したクライアントシークレット
2回も言ったからちゃんと保存してるよね???

以下をターミナルに入力してエンターをカチャカチャッターンしてください

curl -X POST \
https://login.microsoftonline.com/common/oauth2/v2.0/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'client_id=<アプリケーション (クライアント) ID>&scope=mail.send%20offline_access&code=<認証コード>&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Fauthorized&grant_type=authorization_code&client_secret=<クライアントシークレット>' | jq

↑jqコマンドを使用しているので、使う場合はインストールしておいてください。
所得したjsonデータを自動で整形してくれるので便利です。
使わない場合は最後の | jqを削除してください。

レスポンスはこんな感じ↓です

  % Total % Received % Xferd  Average Speed   Time    Time     Time  Current Dload  Upload   Total   Spent    Left  Speed
100  1887  100  1611  100   276   2746    470 --: --: -- --: --: -- --: --: --3231
{
  "token_type": "Bearer",
  "scope": "Mail.Send Mail.ReadWrite",
  "expires_in": 3600,
  "ext_expires_in": 3600,
  "access_token": <アクセストークン>,
  "refresh_token": <リフレッシュトークン>
}

ちなみに、認証コードを取得してしばらく時間置くと認証コードの期限切れになるので注意してください。

アクセストークン取得の公式ドキュメント

3. メール送信のGASを実装する

こんな感じのコードを実装します。

code.gs
var API = 'https://graph.microsoft.com/v1.0/me/sendMail';
var ACCESS_TOKEN = '<アクセストークン>';
function sendEmail() {
    // 送信内容作成
    var payload = {
        message: {
            subject: 'タイトル',  // メールタイトル
            body: {
                contentType: 'HTML',
                content: '本文'  // メール本文
            },
            toRecipients: [
                {
                    emailAddress: {
                        address: '<送信先のメールアドレス>'
                    }
                }
            ]
        }
    };
    // ヘッダー作成
    var header = {
        Authorization: 'Bearer ' + ACCESS_TOKEN,
        'Content-Type': 'application/json'
    };
    // オプション作成
    var options = {
        method: 'POST',
        headers: header,
        payload: JSON.stringify(payload),
    };
    // 送信
    UrlFetchApp.fetch(API, options);
}

↑sendEmail関数を実行すると、<送信先のメールアドレス>に設定したメールアドレスにメールが届きます。

メール送信リファレンス

4. スプレッドシートから1クリックでメールを送信できるようにする

最後に、スプレッドシートから1クリックでメールを送信できるようにします。

スプレッドシートのメニューにボタンが表示されるようにGAS実装

先程のGASファイルに、以下のような記述を追記します。

code.gs
function onOpen() {
    var ui = SpreadsheetApp.getUi();
    var menu = ui.createMenu("スクリプト");
    menu.addItem("メール送信", "sendEmail");
    menu.addToUi();
}

トリガーを設定

トリガーにonOpen()がスプレッドシート起動時に実行されるように設定します。
image.png

スプレッドシートを開くと、メニューに「メール送信」が出現します。

image.png

メール送信

「メール送信」をクリックすると…
簡単にOutlookでメールが送信できたんじゃ!
(迷惑メールに振り分けられてしまいました…)
スクリーンショット 2022-12-16 19.47.38.png

参照

15
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?