久しぶりの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の動作は確認できたので、コレで良しとします。





























この記事へのコメントはありません。