久しぶりのGoogle Apps Scriptネタです。
今回はGoogle Apps ScriptからOffice 365 unified APIを使って、メールを送信してみようと思います。
下準備
- 「[Google Apps Script]OAuth認証(2.0)が必要なWeb APIを利用する。」を参考に、Webアプリケーションとしてスクリプトを作成し、リダイレクト先のURLを取得します。
- 「Office 365 unified APIをVBAから呼び出す」を参考に、クライアント IDを取得します(アプリケーションの種類:ネイティブ クライアント アプリケーション、他のアプリケーションに対するアクセス許可:Office 365 unified API (preview)、デリゲートされたアクセス許可:Send mail as a user)。
コード
・コード.gs
var access_token; var client_id = '(下準備で取得したクライアント ID)'; var redirect_uri = 'https://script.google.com/macros/s/abcdefg/usercallback'; //下準備で取得したリダイレクト先のURL var resource_uri = 'https://graph.microsoft.com/'; var token_uri = 'https://login.microsoftonline.com/common/oauth2/token'; var rest_uri = 'https://graph.microsoft.com/beta/me/sendmail'; function doGet(e) { var auth_uri = 'https://login.windows.net/common/oauth2/authorize?response_type=code'; auth_uri += '&redirect_uri=' + encodeURIComponent(redirect_uri); auth_uri += '&client_id=' + client_id; auth_uri += '&resource=' + encodeURIComponent(resource_uri); auth_uri += '&state=' + ScriptApp.newStateToken().withMethod('callback').withTimeout(200).createToken(); var html = '<p style="padding:10px;">'; html += '<h4>■ Office 365 unified API メール送信サンプル</h4>'; html += '<a href="' + auth_uri + '">メール送信</a>'; html += '</p>'; return HtmlService.createHtmlOutput(html); } function callback(e){ var opt = { 'method' : 'POST', 'payload' : { 'code' : e.parameter.code, 'client_id' : client_id, 'redirect_uri' :redirect_uri, 'grant_type' : 'authorization_code' }, 'muteHttpExceptions' : true }; var res = UrlFetchApp.fetch(token_uri, opt); var dat = JSON.parse(res.getContentText()); access_token = dat.access_token; return HtmlService.createTemplateFromFile('contents') .evaluate() .setTitle('メール送信サンプル') .setSandboxMode(HtmlService.SandboxMode.NATIVE); } function sendMail(address, subject, body, access_token){ //メール送信 // *日本語非対応 // *下記のようにコード変換しても効果なし // Utilities.newBlob('').setDataFromString(subject, 'UTF-8').getDataAsString('Shift_JIS') var json = { 'Message': { 'Subject': subject, 'Body': { 'ContentType': 'Text', 'Content': body }, 'ToRecipients': [ { 'EmailAddress': { 'Address': address } } ] }, 'SaveToSentItems': 'false' }; var opt = { 'method' : 'POST', 'contentType' : 'application/json', 'headers' : { 'Authorization': 'Bearer ' + access_token }, 'payload': JSON.stringify(json), 'muteHttpExceptions' : true }; UrlFetchApp.fetch(rest_uri, opt); }
・contents.html
<style> * { padding: 10px; } td { border-style: none; } </style> <table> <tr> <td>宛先:</td> <td><input id="txtAddress" type="text" size="30" value=""></td> </tr> <tr> <td>件名:</td> <td><input id="txtSubject" type="text" size="30" value="Test Mail"></td> </tr> <tr> <td>本文</td> <td><textarea id="txtBody" cols=40 rows=4>Send Test E-mail</textarea></td> </tr> <tr> <td colspan="2"><input id="btnSend" type="button" value="送信" onclick="btnSend_onClick()"></td> </tr> <tr><td colspan="2"> </td></tr> <tr> <td colspan="2"><div id="divResults"></div></td> </tr> </table> <input type="hidden" id="txtAccessToken" value="<?= access_token ?>"> <script> function btnSend_onClick(){ var objAddress = document.getElementById('txtAddress'); var objSubject = document.getElementById('txtSubject'); var objBody = document.getElementById('txtBody'); var objAccessToken = document.getElementById('txtAccessToken'); var objResults = document.getElementById('divResults'); this.disabled = 'true'; objResults.innerHTML = ''; google.script.run.withSuccessHandler(onComplete) .withFailureHandler(onComplete) .sendMail(objAddress.value, objSubject.value, objBody.value, objAccessToken.value); } function onComplete(dat){ var objResults = document.createElement('span'); var objSend = document.getElementById('btnSend'); objResults.innerHTML = 'メールを送信しました。'; document.getElementById('divResults').appendChild(objResults); objSend.disabled = ''; } </script>
アプリケーションの実行
上記コードをエディタに貼り付けたら、いよいよアプリケーションの実行です。
- まずはリクエストを承認するため、doGet関数を実行します。
- 「承認が必要です」ダイアログが表示されたら「続行」ボタンをクリックします。
- 「(プロジェクト)が次の許可をリクエストしています」ダイアログが表示されたら「承認する」ボタンをクリックします。
- 承認が終わったら「公開」メニューから「ウェブ アプリケーションとして導入」をクリックします。
- 「ウェブ アプリケーションとして導入」ダイアログが表示されたら「最新のコード」リンクをクリックします。
- 作成したアプリケーション画面が表示されるので「メール送信」リンクをクリックします。
- 365 APIの認証画面が表示されるので、メールアドレスとパスワードを入力し、「サインイン」ボタンをクリックします。
- 再びアプリケーション画面が表示されるので、宛先、件名、本文を入力し、「送信」ボタンをクリックします。ちなみに、Google Apps Scriptの仕様かどうかは分からないのですが、件名や本文に日本語を使用すると文字化けが発生します。
- メール送信先で受信確認すると、アプリケーションから送信したメールが届いていることが確認できます。
以上で、Google Apps Scriptで作成したアプリケーションから、Office 365 unified APIを使ってメール送信できることが確認できました。
コードのテスト中、JSON形式で渡す件名や本文の文字コードを変えてみたり、POSTする際のヘッダーを変えてみたりしたのですが、色々やっても送られるメールのcharsetが“us-ascii”になってしまい、日本語を送ることができませんでした。
正直スッキリしないのですが、一応APIの動作は確認できたので、コレで良しとします。
この記事へのコメントはありません。