1
2

More than 3 years have passed since last update.

無料の Outlook メールと無料の Azure AD を使って REST API 経由でメール送信してみた

Posted at

背景と目的

Web アプリから開発時の動作検証やテスト目的でメールを送りたいけど、パブリッククラウド上や社内からだと SMTP ポート閉じられていたり、かといって従量課金のPaaSやその他の面倒な構成は嫌なので、無料の Outlook メールと無料の Azure AD を使って REST API 経由でメール送信することにしました。

前提条件

この例では python3 を使いますが、localhost:80 にアクセス出来れば何でも良いです。

実施内容

Outlook メールのアカウントを作成

https://office.live.com/start/Outlook.aspx?omkt=ja%2DJP

例えば、「アカウントがない場合 アカウントを作成しましょう」→「または、既にお持ちのメールアドレスを使う」→「新しいメールアドレスを取得」と進みます。

@outlook.jp または @outlook.com または @hotmail.com

の何れかからメールドメインを選択して、メールアカウントを作成します。

Azure AD を作成

https://portal.azure.com/#create/Microsoft.AzureActiveDirectory

「組織名」「初期ドメイン名」「国/リージョン」を入力または選択して作成します。

作成が完了したら「新しいテナントを管理するには、ここをクリックします。」をクリックします。

Azure AD にアプリを登録

Azure ポータルの一番上にある検索バーで「Azure Active Directory」を検索&選択し、左にある「管理」メニューから「アプリの登録」を開きます。

「+新規登録」でアプリを登録します。

  • 名前:(例)restapi-test
  • サポートされているアカウントの種類:個人用 Microsoft アカウントのみ
  • リダイレクトURI:Web http://localhost/

アプリが登録されたら、アプリケーション(クライアント) ID とディレクトリ(テナント) ID をコピーしておきます。

次に、左にある「管理」メニューから「証明書とシークレット」を開きます。

「+新しいクライアントシークレット」でシークレットを作成します。

  • 説明:(例)secret
  • 有効期限:(例)なし

「値」列にある、作成されたシークレットをコピーします。

最終的に必要なアプリ情報はこちらです。(注)固有情報の一部は xxxx に置き換えています。

  • クライアント ID :b31c787f-xxxx-45af-9d58-a451916f2bc2
  • クライアントシークレット:U24171_xxxxja8V-Zwo6i5~QcU9MrYc9-_

REST API に必要なトークンを取得

Web サーバーを立ち上げます。

bash
$ python3 -m http.server 80

client_id の値を先ほど作成したアプリのクライアントIDに変更して、ブラウザに貼り付けます。

https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=b31c787f-xxxx-45af-9d58-a451916f2bc2&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2F&response_mode=query&scope=offline_access%20mail.send&state=12345

「このアプリがあなたの情報にアクセスすることを許可しますか?」と表示されるので、「はい」を選択します。

画面もしくはアドレスバーに表示された「/?code=M.R3_BAY.f2b65b96-xxxx-9838-aaa1-5d7874c8279c&state=12345」の code の値をコピーします。

python の http.server は停止して、client_id と client_secret の値を先ほど作成したアプリのクライアント ID とクライアントシークレットに変更して、curl を実行します。

bash
$ curl https://login.microsoftonline.com/consumers/oauth2/v2.0/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code&code=M.R3_BAY.f2b65b96-xxxx-9838-aaa1-5d7874c8279c&redirect_uri=http%3A%2F%2Flocalhost%2F&client_id=b31c787f-xxxx-45af-9d58-a451916f2bc2&client_secret=U24171_xxxxja8V-Zwo6i5~QcU9MrYc9-_" | jq .
{
  "token_type": "Bearer",
  "scope": "Mail.Send",
  "expires_in": 3600,
  "ext_expires_in": 3600,
  "access_token": "EwBQA8l6BAAU6k7+xxxx+30x5t4B11nRniWUkbAI=",
  "refresh_token": "M.R3_BAY.CQ12c5REY4!xxxxT05Mux3bAbh*s$"
}

REST API 経由でメール送信

取得したアクセストークンを使ってメールを送信します。<受け取りたいメールアドレス>は変更します。

bash
$ curl -v https://graph.microsoft.com/v1.0/me/sendMail \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer EwBQA8l6BAAU6k7+xxxx30x5t4B11nRniWUkbAI=" \
  -d '{"message": {"subject": "テストメール", "body": {"contentType": "Text","content": "これはテストメールです。"}, "toRecipients": [{"emailAddress": {"address": "<受け取りたいメールアドレス>"}}]}, "saveToSentItems": "false"}'

「HTTP/1.1 202 Accepted」が表示されていれば OK。

メールが届いているか確認します。迷惑メールに入っていないかも確認してください。

トークンの更新

トークンに有効期限があるので、リフレッシュトークンを使用して、トークンを取得し直します。

bash
$ curl https://login.microsoftonline.com/consumers/oauth2/v2.0/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d 'grant_type=refresh_token&refresh_token=M.R3_BAY.CQ12c5REY4!T05Mux3bAbh*s$&redirect_uri=http%3A%2F%2Flocalhost%2F&client_id=b31c787f-xxxx-45af-9d58-a451916f2bc2&client_secret=U24171_xxxxja8V-Zwo6i5~QcU9MrYc9-_' | jq .
{
  "token_type": "Bearer",
  "scope": "Mail.Send",
  "expires_in": 3600,
  "ext_expires_in": 3600,
  "access_token": "EwBQA8l6BAAU6k7+xxxx/0RKEcW3QYPkpFACbAI=",
  "refresh_token": "M.R3_BAY.CSSkry!aewxxxxPLi0RUfFbbBP!0$"
}

不要になったら

下記のリストは、メールが不要になった時に削除するものです。

  • Azure AD からアプリ削除
  • Azure AD テナント削除
  • MS アカウント削除(もしくは許可したアプリの削除)

参考

認証トークンを取得する - ユーザーの代わりにアクセスを取得

1
2
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
1
2