Guide

Outlook CLI:ターミナルからメールを送信

Outlook CLI を使って Graph API のセットアップ、Azure AD 登録、MSAL トークンコード、SMTP 設定なしで Microsoft 365 メールをターミナルから送信できます。送信、予約送信、HTML 本文、JSON 出力、共有メールボックスのフローを Azure AD アプリを個別に用意せずターミナルから実行する方法を解説します。

Written by Caleb Geene Director, Site Reliability Engineering

Reviewed by Hazik

VerifiedCLI 3.1.1 · Outlook, Microsoft 365 · last tested April 11, 2026

Outlook CLI を使ってターミナルからメールを送信するには?

Outlook または Microsoft 365 を一度接続すれば、nylas email send --to user@example.com --subject "Hello" --body "Hi" --yes で送信できます。Azure AD アプリの登録、MSAL の設定、SMTP の構成なしに Outlook CLI 送信ワークフローが実現します。

このコマンドは、通常 Graph API のアプリ登録や SMTP 認証情報のセットアップに誘導される Outlook コマンドラインメール送信のユースケースにそのまま対応します。

Outlook メールをプログラムで送信する場合の問題は、Microsoft のセットアップフローから始まります。

Outlook メールをプログラムで送信するには、Microsoft のエコシステムを通じて 4〜5 段階のセットアップが必要です:Azure AD アプリケーションの登録、Mail.Send API アクセス許可の構成、管理者の同意の取得、MSAL 認証ライブラリの統合、トークン更新の処理。ターミナルやシェルスクリプトからの一回限りの送信に、このオーバーヘッドは 10 秒のタスクを 45 分のプロジェクトに変えてしまいます。

Microsoft が推奨する送信パスは Graph API /sendMail エンドポイントです。Microsoft の OAuth 2.0 ドキュメントによると、アクセストークンは 60〜90 分で期限切れとなり、リフレッシュトークンのローテーションが必要です。

ターミナルやシェルスクリプトからの簡単な送信には、このセットアップは過剰です。smtp.office365.com のポート 587 経由の SMTP はまだ動作しますが、Microsoft は 2022 年 10 月に Exchange Online の基本認証を廃止しました。ユーザー名/パスワードはもう使えません。

Nylas CLI はこれらをすべて回避します。Nylas API と通信し、OAuth2 トークンの更新、プロバイダーのルーティング、接続管理を API 側で処理します。一度認証すれば、1 コマンドで送信できます。

1. インストール

Nylas CLI は macOS、Linux、Windows に 30 秒以内でインストールでき、Azure AD アプリの登録、Graph API の認証情報、MSAL ライブラリは不要です。バイナリは 20 MB 未満の単一 Go 実行ファイルで、インストール時にプラットフォームとアーキテクチャを自動検出します。

macOS または Linux では Homebrew でインストールします。Statcounter によると Outlook デスクトップユーザーの 80% 以上が使用している Windows では、PowerShell のワンライナーを使います。どちらも SHA-256 チェックサムを自動検証します。その他のインストール方法はスタートガイドをご覧ください。

2. Outlook アカウントの認証

認証は、Graph API に必要な複数ステップの Azure AD アプリ登録の代わりに、単一の OAuth2 フローで Nylas CLI を Outlook または Microsoft 365 メールボックスに接続します。全プロセスは約 2 分で完了し、認証情報はシステムキーリングに安全に保存されるため、コマンド実行のたびに再認証する必要はありません。

dashboard-v3.nylas.com でアプリケーションを作成し、Outlook または M365 メールボックスを接続します。その後、API キーで CLI を設定します。Microsoft の OAuth 2.0 ドキュメントによると、アクセストークンは 60〜90 分で期限切れになりますが、Nylas がバックグラウンドで自動的に更新を処理します。

nylas auth config
# プロンプトが表示されたら API キーを貼り付け

# 接続を確認
nylas auth whoami
# => Authenticated as you@company.com (Microsoft)

認証情報は OS キーリング(macOS Keychain、Windows Credential Manager、Linux libsecret)に保持されます。グラントを取り消さない限り、再認証は不要です。

3. ユーザーメールボックス、エイリアス、共有メールボックスからの送信

Microsoft 365 組織は通常、部署ごとに 3〜5 種類のメールボックス ID を管理しています — ユーザーメールボックス、共有メールボックス、配布グループ、リソースルーム、send-as エイリアス。Nylas CLI は正しいグラント ID を指定することで、これらのいずれの ID からでも送信できます。重要なのは「メッセージを送信できるか?」だけでなく、「どのメールボックス ID からメッセージを送信すべきか?」です。

個人の Outlook メールボックスから送信するには、グラント ID なしでコマンドを実行します — CLI はデフォルトの認証済みメールボックスを使用します。共有メールボックスや部署の ID から送信するには、最初の引数として共有メールボックスのグラント ID を指定します。各グラントは Exchange Online の 1 つのメールボックス ID に正確にマッピングされます。

# 自分の Outlook メールボックスから送信
nylas email send \
  --to "colleague@company.com" \
  --subject "Q2 planning doc" \
  --body "Hi — the planning doc is ready for review." \
  --yes

# 共有メールボックスのグラントから送信
nylas email send <shared-mailbox-grant-id> \
  --to "vendor@partner.com" \
  --subject "PO #4521" \
  --body "Purchase order 4521 is ready for review." \
  --yes

send-as または共有メールボックスの権限が不足している場合、コマンド構文が正しくても Microsoft 365 は 403 エラーを返し送信を拒否します。Microsoft の Exchange Online アクセス許可ドキュメントによると、共有メールボックスの委任変更は反映に最大 60 分かかることがあります。このエラーは Exchange Online のポリシーの問題であり、CLI の問題ではありません。

4. 配布リスト、エイリアス、チームキュー

Microsoft 365 の配布リストと M365 グループはサーバー側で全メンバーのメールボックスに展開されるため、1 つの nylas email send コマンドでクライアント側のアドレス解決なしに数百の受信者にリーチできます。従業員 500 名以上の企業は通常、部門、プロジェクトチーム、コンプライアンスルーティング用に 20〜50 の配布リストを管理しています。Nylas CLI は個別アドレスへの送信と同じ方法でこれらのリストに送信します — --to フラグにリストアドレスを指定するだけです。

以下の例は 2 つの一般的なパターンを示しています:エンジニアリング配布リストへのブロードキャストと、CC で法務に契約更新をルーティングしつつコンプライアンスの BCC を使用するケース。--bcc フラグはコンプライアンスやジャーナリングのアドレスを表示受信者リストから隠します。これは金融や医療などの規制産業で頻繁に求められる要件です。

# 配布リストに送信
nylas email send \
  --to "engineering-all@company.com" \
  --subject "Deployment window tonight" \
  --body "Production deploy starts at 22:00 UTC. Freeze all PRs by 21:00." \
  --yes

# コンプライアンスまたはアーカイブ受信者を含める
nylas email send \
  --to "contracts@company.com" \
  --cc "legal@company.com" \
  --bcc "compliance@company.com" \
  --subject "Contract update" \
  --body "Updated terms are ready for review in the contract system." \
  --yes

5. HTML 本文とビジネスワークフローメール

Outlook のビジネスメールには請求書、承認、業務委託契約書、調達更新が頻繁に含まれます。現在の CLI 送信コマンドは --body で HTML を受け付け、--template-id でホスト型テンプレートに対応し、ファイル配信は分離しています:ドキュメントシステムでファイルを公開してリンクを送信するか、MIME 添付が必要な場合は Nylas API/SDK を使用します。

Outlook のレンダリングエンジンは Microsoft Word の HTML パーサーを通じて HTML を処理するため、一部の CSS プロパティは Gmail や Apple Mail とは異なるレンダリングになります。自動化された HTML 本文は小さく保ち、重要なスタイルはインライン化し、テナントレベルの DLP とトランスポートルールに送信完了後の最終メッセージを検査させましょう。

nylas email send \
  --to "client@example.com" \
  --subject "Invoice #1042" \
  --body "<h1>Invoice #1042</h1><p>Amount due: <strong>$2,400.00</strong></p><p>Payment link: <a href='https://pay.example.com/1042'>pay.example.com/1042</a></p>" \
  --yes

6. 配信予約と Microsoft 365 の制限

Microsoft 365 のメール配信予約を使うと、メッセージを今作成して特定の将来の時間に送信できます。異なるタイムゾーンの受信者へのリーチや営業時間外のフォローアップのキューイングに便利です。Microsoft 365 はほとんどのプランで 1 分あたり 30 通、1 日あたり 10,000 受信者の制限を適用しているため、一括送信や自動化された送信ループには一時的なブロックを避けるために意図的なペーシングが必要です。

--schedule フラグは「tomorrow 9am」や「next Monday 2pm EST」のような自然言語の時間表現を受け付けます。一括送信ループでは、送信間に 2 秒の sleep を入れることで Microsoft の 1 分あたり 30 通の上限を十分に下回り、最大 24 時間続く一時的な送信ブロックの発動を回避できます。

# フォローアップを予約
nylas email send \
  --to "client@example.com" \
  --subject "Follow-up" \
  --body "Checking in on the proposal." \
  --schedule "tomorrow 9am" \
  --yes

# メールボックス自動化ループのレート制限
while read -r recipient; do
  nylas email send --to "$recipient" --subject "Status update" --body "See attached notes." --yes
  sleep 2
done < recipients.txt

7. スクリプティングと監査証跡のための JSON 出力

任意の nylas email send コマンドに --json を追加すると、メッセージ ID、グラント ID、スレッド ID、タイムスタンプ、送信者/受信者アドレスを含む完全なメッセージオブジェクトが構造化 JSON として返されます。この出力は、送信イベントのログ記録、ダウンストリームキュープロセッサーへのメッセージ ID の送信、正確なタイムスタンプ付きの配信試行証明を要求するコンプライアンス監査証跡に有用です。

JSON レスポンスはメッセージあたり通常 400〜600 バイトで、Nylas API メッセージスキーマに従います。jq を通じて出力をパイプすることで、特定のフィールドを抽出できます — 追跡用のメッセージ ID、会話スレッディング用のスレッド ID、監査ログ用の日付などです。

nylas email send \
  --to "user@example.com" \
  --subject "Test" \
  --body "Hello." \
  --json --yes
{
  "id": "a1b2c3d4e5f6g7h8",
  "grant_id": "d3f4a5b6-c7d8-9e0f-a1b2-c3d4e5f6g7h8",
  "thread_id": "x9y8z7w6v5u4t3s2",
  "subject": "Test",
  "from": [{"name": "Dev User", "email": "dev@company.com"}],
  "to": [{"name": "", "email": "user@example.com"}],
  "date": "2026-03-28T10:30:00-04:00",
  "object": "message"
}

シェルスクリプトでは、JSON 出力から jq を使ってメッセージ ID をキャプチャし、ダウンストリーム処理に使用できます — 配信状態の確認、監査 CSV への追記、チケットシステムへの受け渡しなど。.id フィールドは Nylas API 内のメッセージにマッピングされる一意の 16 文字の文字列です。

# 送信後にメッセージ ID をキャプチャ
msg_id=$(nylas email send \
  --to "user@example.com" \
  --subject "Automated" \
  --body "This is automated." \
  --json --yes | jq -r '.id')

echo "Sent message: $msg_id"

Graph API と Nylas CLI の比較

Microsoft Graph API で Outlook メールを 1 通送信するには、Azure AD アプリの登録、MSAL トークンの取得、トークン更新の処理、実際の POST リクエストを含めると Python や Node.js で 50〜100 行のコードが必要です。Nylas CLI はこれをコード 0 行、Azure ポータルの設定なしで 1 コマンドに削減します。以下の比較表で各ステップを両アプローチで分解しています。

ステップGraph APINylas CLI
アプリ登録Azure AD ポータルでリダイレクト URI を設定不要
アクセス許可Mail.Send を追加し管理者の同意を取得不要
認証MSAL ライブラリでトークン取得・更新処理nylas auth config(1 回のみ)
メール送信/me/sendMail に JSON ボディで POSTnylas email send --to ...
ファイル配信JSON 内で Base64 エンコード、3 MB 超はアップロードセッションリンクを送信、または添付は Nylas API/SDK を使用
トークン更新401 を処理しリフレッシュトークンをローテーション自動
マルチプロバイダーMicrosoft のみGmail、Outlook、Exchange、Yahoo、iCloud、IMAP
コード行数50〜100 行以上(Python/Node + MSAL)1 コマンド

Outlook 固有のヒント

Microsoft 365 には、Gmail や Yahoo などのコンシューマーメールプロバイダーには存在しないテナントレベルのポリシー、コンプライアンス機能、メールボックスタイプがあります。以下のヒントでは、開封確認、秘密度ラベル、共有メールボックス、レート制限、トランスポートルールなど、CLI を離れた後に送信メールの処理に影響する Outlook 固有の動作を取り上げます。

開封確認

Outlook は Disposition-Notification-To ヘッダーによる開封確認リクエストに対応しています。Nylas CLI で送信すると、受信者の Outlook クライアントは設定に応じて開封確認を送信するよう促す場合があります。Microsoft のドキュメントによると、受信者は開封確認リクエストを拒否できるため、自動化ワークフローでの配信確認として依存すべきではありません。

秘密度ラベル

M365 の秘密度ラベル(社外秘、社内限定など)は Microsoft Information Protection によりテナントレベルで適用されます。Nylas CLI で送信されたメッセージはテナントのデフォルトラベルポリシーに従います。組織が特定のラベルを必要とする場合、Exchange 管理者が自動ラベル付けルールを設定でき、送信クライアントに関係なくすべての送信メールに適用されます。

共有メールボックスからの送信

共有メールボックスから送信するには、OAuth フローで別のグラントとして接続します。各共有メールボックスは独自のグラント ID を持ち、送信時にその ID を参照します。共有メールボックスを接続するユーザーアカウントには Exchange Online のフルアクセスまたは送信者として送信のアクセス許可が必要です — 委任変更は反映に最大 60 分かかることがあります。

# 共有メールボックスを接続
nylas auth login
# 共有メールボックスの OAuth フローに従う

# グラント ID を指定して共有メールボックスから送信
nylas email send <shared-mailbox-grant-id> \
  --to "vendor@partner.com" \
  --subject "PO #4521" \
  --body "Purchase order 4521 is ready for review."

Outlook の送信制限

Microsoft 365 はほとんどのプランで 1 日あたり 10,000 受信者、1 分あたり 30 通の制限を適用しています。Microsoft の Exchange Online 制限ドキュメントによると、これらを超過すると一時的なブロックが発動します。一括送信では、スクリプト内のメッセージ間に sleep 2 を追加してください。

トランスポートルール、ジャーナリング、send-as ポリシー

Microsoft 365 のメールフローは、メッセージが受信者に届く前に処理されるテナント全体の Exchange Online ルールによって形成されます。トランスポートルールは送信者、受信者、件名、コンテンツパターンに基づいてメッセージをリダイレクト、ブロック、または変更できます。ジャーナリングはすべてのメールをコンプライアンスメールボックスにコピーします。DLP ポリシーは 100 以上の組み込み機密情報タイプに対して添付ファイルと本文コンテンツをスキャンします。Microsoft のメールフロールールドキュメントによると、トランスポートルールは優先順位で評価され、最初にマッチしたルールがその後の処理を停止できます。

Outlook からの送信が 2 つのメールボックスで異なる動作をする場合、原因は通常メールボックスポリシーまたはテナントルーティングポリシーであり、CLI のコマンド構文ではありません。

共有メールボックスとチームキューのワークフロー

Microsoft 365 組織は調達、サポート、採用、エグゼクティブ業務に共有メールボックスを使用しています。Microsoft の共有メールボックスドキュメントによると、50 GB 以下の共有メールボックスには別途ライセンスは不要です。support@company.comap@company.com から Nylas CLI で送信するには、共有メールボックスを別のグラントとして接続し、送信コマンドでそのグラント ID を指定します。

次のステップ

ターミナルから Outlook メールを送信できるようになったら、Outlook 受信トレイの閲覧とフィルタリング、カレンダーイベントの管理、AI エージェントのメールボックス接続、別のプロバイダーへの切り替えなどワークフローを拡張できます — Nylas CLI は同じコマンド構文で 6 つのプロバイダーに対応しています。