新しいOutlookとOutlook on the web向けの送信確認アドインです。
送信ボタンを押したときに動きます。Outlook標準のSmart Alertsダイアログから、宛先・添付ファイル・件名・本文をチェックできる確認ペインを開きます。必要な項目をチェックしたあと、確認ペインが送信します。 目的は小さなミスを防ぐことです。宛先の間違い、添付の付け忘れ、件名の 空欄、といったものです。
スケジュール送信/Send laterは対象外です。 Outlookの下書きに 未来の配信時刻が設定されている場合、Mail Lookoutは確認フローを スキップし、Outlookにそのまま予定送信させます。そのため、 スケジュール送信メールはこのアドインでは確認されません。
名前はそのままの意味で、送信メールの見張り役です。メッセージが 出ていく前に問題を知らせます。
英語版: README.md
Mail LookoutはMicrosoft Marketplaceで一般公開されています。 Mail LookoutをOutlookに追加 し、今すぐ入手からMicrosoft 365の案内に沿ってインストールしてください。 通常のインストールでは、マニフェストのダウンロードやサイドロードは 不要です。
このアドインは送信時に4つのことを行います。
- 宛先確認。 すべての宛先をフィールド別(To/Cc/Bcc)に 一覧表示し、社外の宛先には印を付けます。
- 添付ファイル確認。 実体のある添付をすべて一覧表示し、ファイル を確認できるようにします。
- 本文確認。 本文のプレビューを表示します。
- 確認ペインで確認完了。 1回目の送信を止め、task paneで必要な 項目をチェックさせます。
加えて2つの警告を出します。
- 件名が空。 件名が空のとき、明示的なチェックを求めます。
- 添付の付け忘れ。 本文が添付に言及している(「添付」「see attached」など)のにファイルが添付されていないとき警告します。
設定タスクペインから、社内ドメインとデフォルトの待ち時間を
ユーザーごとに変更できます。これらはOutlookのローミング設定に
ユーザー単位で保存され、端末をまたいで引き継がれます。それ以外の
挙動と、出荷時の既定値は1つの設定ファイル
src/config/defaults.tsにあります。
- 新しいOutlook(Windows)またはOutlook on the web。
- Mailbox requirement set 1.15以降。
- 開発にはBun 1.3以降。
このアドインはOutlookモバイルでは動きません。クラシックOutlookについては「制限事項」を参照してください。
ロジックがOfficeに依存しないようにコードを分けています。
src/
domain/ 純粋なロジック。OfficeもDOMも時刻も使わない。全テスト済み。
config/ 設定の型とデフォルト値。
i18n/ 型安全なメッセージ。1言語につき1ファイル。
shared/ ブラウザだけのpreviewで使う共有メッセージ型。
office/ Officeアダプタ。下書きを読み、Smart Alertsハンドラを動かす。
commands/ 送信ハンドラをOfficeに登録する。
dialog/ ブラウザだけの確認previewを描画する。
domain層が中核です。メッセージのプレーンなスナップショットと
設定を受け取り、フラットでJSON化できるモデルを返します。何を表示し
何を必須にするかをここで決めます。ホストのAPIに一切触れないため、
すべてのルールをプレーンなデータでテストできます。価値はテストに
あります。
office層は薄いアダプタです。Office APIで下書きを読み、プレーンな
スナップショットをdomainに渡し、Outlook標準のSmart Alertsダイアログで送信を中止または許可します。中核層はOfficeを一切importしないので、この分離は構造として保たれます。新しいホスト呼び出しは
office層に置いてください。
# 1. 依存関係をインストールする。
bun install
# 2. ローカルのHTTPS証明書を信頼する。OutlookはHTTPSを要求する。
bun run dev-certs
# 3. https://localhost:3000で開発サーバーを起動する。
bun run dev:outlookそのあと、ローカル開発用としてOutlookにmanifest.xmlを
サイドロードします。手順はホストによって異なります。
- Outlook on the web: 設定を開き、アドインのページで「カスタム
アドインを追加」→「ファイルから追加」を選び、
manifest.xmlを 指定します。 - 新しいOutlook(Windows): 同じアカウントのOutlook on the webから、同じアドイン管理ページを使います。
サイドロード後、新規メールを開き、宛先を入れて送信を押します。 Outlook標準のSmart Alertsダイアログが表示されます。「確認画面を開く」を 押してtask paneを開き、必要な項目を確認してから 「確認して送信する」を押します。
Outlookを使わず、ブラウザだけで確認フローを試せます。
bun install
bun run dev:emulatorまたは通常の開発サーバーを起動して
Viteが表示するURLの/emulator.htmlを開きます。3000番ポートが使われている場合、
https://localhost:3001/emulator.html のように次の空きポートを使います。
このemulatorはOutlookのAPIや Office.jsを使わず、実際のドメインロジックとダイアログrendererを
そのまま使います。下書き欄やシナリオを変更し、「Review send」を押すと確認ダイアログを再生成できます。
Outlookにサイドロードして試す場合はbun run dev:outlookを使います。
manifest.xmlはhttps://localhost:3000固定なので、このscriptは
3000番ポートが使われていると意図的に失敗します。
bun run checkこれは順に、lint(oxlint)とフォーマットチェック(oxfmt)・両tsconfigの型チェック・ カバレッジ付きテスト・本番ビルド・マニフェスト検証を実行します。 各ステップが通る必要があります。個別のステップ:
bun run typecheck # srcとbuild設定へのtsc
bun run lint # oxlint
bun run format # oxfmt --write
bun run test # vitestを1回実行
bun run test:coverage # 純粋層へのカバレッジ付きvitest
bun run build # tsc --noEmitのあとvite build
bun run validate # office-addin-manifest validateMarketplace公開版はCloudflare Pagesでホストしたアドインを読み込みます。
このリポジトリにはwrangler.tomlが含まれているため、Pages側では
bun run buildでビルドし、dist/を公開できます。そのビルド中に
scripts/generate-manifest.jsがhttps://avishaikofun.comを
埋め込んだdist/manifest.xmlを生成します。
アドインの実行環境は apex の
avishaikofun.com
で、このホストはこのリポジトリのものです。コーポレートサイトはここには
ありません。
hjosugi/avishaikofun-site
に分離し、wwwから配信しています。マーケティングページの文言修正が、
このプロジェクトのビルド・テスト・リリースゲートを通らなくなりました。
apexの/はそちらへリダイレクトし(public/_redirects)、それ以外の
パスはすべてアドインです。
Mail Lookoutの製品ページ — support.html / privacy.html /
terms.html — は意図的に残しています。マニフェストがSupportUrlを
埋め込み、Marketplace掲載もこれらのURLを指しているため、移すと再認証が
必要になるからです。
一般利用者は
Microsoft Marketplace
からインストールしてください。公開サイトの/manifest.xmlは、開発・
テスト用途で引き続き利用できます。
タグ付きリリースでは、GitHub Releasesに
mail-lookout-manifest.xmlも添付します。常に最新ではなく固定版を
使いたい場合は、そのファイルを使います。
patch versionを上げて、commit、branch push、GitHub Releases用の tag pushまで行うには:
bun run version:patchこのscriptはpackage.jsonとmanifest.xmlの
versionをまとめて更新し、version commitを作り、現在のbranchを
pushしてからv* release tagを作成・pushします。そのtagを契機に
GitHub ActionsがRelease assetを作ります。minor/majorは
bun run version:minor、bun run version:major、明示指定は
bun run version:set 1.2.3を使います。scriptは次のversionを表示して
y/N確認してからファイル変更に進みます。push/tagなしでローカルの
version commitだけ作りたい場合はbun run version:bump patchを使います。
手順はCLOUDFLARE.mdを参照してください。
元のマニフェストはプレースホルダ値で出荷されます。本番運用や Marketplace公開の前には置き換えてください。
- GUID。
manifest.xmlの<Id>を自分のGUIDに置き換える。 - URL。 Cloudflare Pagesでは
https://avishaikofun.comを 使う。ほかのホストでは、manifest.xml内のすべてのhttps://localhost:3000を自分のホストに置き換えるか、ADDIN_HOST_URL=https://your-domain.example bun run buildを 実行する。dist/フォルダをそのホストのHTTPSで配信する。 エントリJSは安定した名前(/assets/commands.js)を保つため、 ビルドごとにマニフェストのURLは変わらない。 - 社内ドメイン。
src/config/defaults.tsのinternalDomainsを編集する。出荷時の既定値はavishaikofun.com。このリストが 間違っていると、すべての宛先が社外に見える。 - メタデータ。
manifest.xmlのProviderName・SupportUrl・AppDomainsを置き換える。
そのうえで、組織向けにMicrosoft 365管理センターから公開するか、 個人向けにサイドロードします。
Mail Lookoutは Microsoft Marketplace で一般公開されています。今後Marketplace版を更新するときは、ホストした ビルドをデプロイ・検証し、マニフェストのバージョンを上げてから、 Partner Centerで更新パッケージを提出します。
Marketplaceの説明文と認証担当者向けメモは
docs/marketplace-resubmission.mdにまとめています。
出荷時の既定値はsrc/config/defaults.ts
にあります。変更するにはこのファイルをフォークしてください。実行時は
設定タスクペインが、以下のうち「設定ペインでも変更可」と書いたものを
ユーザーごとに上書きします。主なオプション:
OutlookのリボンでMail LookoutのSettingsを開き、
**デフォルトの待ち時間(分)**に値を入力して保存します。0は即時送信、
0.1は6秒、1.5は90秒です。設定はOutlookのローミング設定に
保存され、同じユーザーの次回以降の確認ペインで使われます。
internalDomains: 社内として扱うドメイン(設定ペインでも変更可)。sendDelaySeconds: 確認後に送信するまでのカウントダウンの既定値 (設定ペインでも変更可)。requireRecipientConfirmation: 送信時の確認に宛先を含める (設定ペインでも変更可)。requireAttachmentConfirmation: 送信時の確認に添付ファイルを含める (設定ペインでも変更可)。requireBodyConfirmation: 送信時の確認に本文プレビューを含める (設定ペインでも変更可)。allowSendAnyway: 中止された送信にOutlookのとにかく送信を出す (設定ペインでも変更可)。既定はオフ。何に届いて何に届かないかは SendModeを参照。attachmentKeywords: 本文が添付に言及しているか判定する語。 添付付け忘れ警告で使う。warnOnEmptySubject: 件名が空のとき警告する。fallbackLocale: ホストの言語が不明なときに使う言語。dialog: ダイアログの幅と高さ(画面に対する割合)。
メッセージは型安全です。言語を追加するには:
src/i18n/locales/en.tsを新しいファイル(例de.ts)に コピーし、すべての値を翻訳する。src/i18n/catalog.tsに1行追加する。importしてlocalesオブジェクトに加えるだけ。
キーが足りなければコンパイラが教えてくれます。test/i18n.test.ts
のテストも、すべてのロケールが同じキー集合を持つことを確認します。
それ以外に変更は不要です。ロケールタグの型はlocalesのキーから
自動で更新されます。
マニフェストはSendMode="SoftBlock"を使います。SoftBlockでは、
アドインが送信を中止したとき、ユーザーは下書きに戻って編集する必要
があります。既定ではワンクリックの「とにかく送信」はありません。これ
は意図的です。すべての中止がワンクリックで回避できる確認ツールは、
ほとんど確認になりません。
1回目の送信ではSmart Alertsダイアログを表示し、送信を中止します。 ダイアログのアクションボタンから、チェックボックス付きの確認ペインを 開きます。確認ペインで下書きを確認済みにしたあと、Outlookのcompose API経由で送信します。予期しないエラーが起きた場合も、ハンドラは送信を 中止します。確認なしに実メールを送ることはありません。
SendModeは、アドイン自身では判断できない場合 — ホストに到達できない、
ブラウザ拡張がフレームを止めている等でランタイムが読み込まれなかった
場合 — の挙動も決めます。SoftBlockではOutlookはそのメールを送信
します。ダイアログも警告もログも残りません。アドインは「壊れている」
のではなく「静かに不在」になります。
ここで送信を拒否できる唯一のモードはBlockですが、使えません。
AppSourceがマニフェストを拒否します。
Error #1: Block SendMode is not allowed
PromptUserも解決になりません。アドインが利用不可のときはやはり送信
してしまう上、すべての中止に恒久的な回避ボタンが付くだけです。したが
ってMarketplace配布のアドインではこの穴は塞げず、監視するしかありま
せん。scripts/heartbeat.jsが6時間ごとにホストを確認しています。
塞ぐにはサイドロードまたは管理者展開で自分でマニフェストを配布し、
SendMode="Block"にする必要があります。
設定 → 送信が中止されたとき → 「とにかく送信」を出す をオンにすると、 中止された送信にOutlookが とにかく送信 ボタンを出すようになります。 既定はオフです。
この方向はAPIによって強制されたもので、設計上の好みではありません。
sendModeOverrideが受け付ける値はpromptUserただ1つなので、実行中の
ハンドラはマニフェストが宣言したモードを緩めることはできても、厳しく
することはできません。したがって厳しい側をマニフェストに置き、これを
opt-outとするしかありません。逆(PromptUserを出荷して設定で厳しく
する)は表現できません。
同じ非対称性が限界も決めます。設定ペインでもチェックボックスの横に 明記しています。**この設定は、アドインが実際に走ったときにしか適用され ません。**上に書いた「読み込み失敗」のケースは、どちらの方向にも変え られません。
これが何で、何でないかを正直に書きます。
- 送信イベントから独自のOfficeダイアログは開けない。
OnMessageSendはevent-based activationで実行されるため、Office.context.ui.displayDialogAsyncなどのOffice UI APIは ブロックされます。本番の送信フローは、ブラウザpreviewの ダイアログではなくOutlook標準のSmart Alertsダイアログを 使います。 - 送信ディレイは確認ペイン内で動く。 OutlookのSmart Alerts送信ハンドラは短時間で終わる必要があるため、確認ペインが カウントダウンを持ち、その後Outlookのcompose送信APIを呼びます。 ペインを閉じたり更新したりすると、待機中の送信はキャンセルされます。
- スケジュール送信/Send laterは意図的に対象外。 Mail Lookoutは
送信時に
delayDeliveryTimeを確認します。未来の配信時刻が設定されて いる場合、アドインはすぐにイベントを許可し、確認ペインを開きません。 スケジュール送信が即時のsendAsync送信に変わることを避けるためです。 その代わり、スケジュール送信メールはMail Lookoutでは保護されません。 - クラシックOutlook(Windows)は対象外。 そのホストは送信 ハンドラにJavaScript専用ランタイムを使います。本プロジェクトは HTMLページ経由で読み込むESモジュールをビルドします。これは 新しいOutlookとOutlook on the webが使うブラウザランタイム 向けです。マニフェストはスキーマ上の理由でJS専用オーバーライドを 宣言しますが、クラシック経路はサポートもテストもしていません。
- Outlookモバイルは非対応。 送信時のSmart Alertsはそこでは 動きません。
- アドインが読み込めないと、メールは未確認のまま送信される。
Outlookは送信のたびにホストから
commands.htmlを読み込みます。これ に失敗すると — ホスト障害、拡張機能によるフレームのブロック —SoftBlockはダイアログも警告も無しに送信を通します。我々のコードが 1行も走らないため、どの設定でも変えられません。ここで拒否できるのはSendMode="Block"だけですが、AppSourceはMarketplace向けアドインに Blockを許可していません。これがこのアドインの実質的な弱点で、scripts/heartbeat.jsが6時間ごとにホストを監視して発生頻度を 抑えています。SendModeを参照。
本アドインは自己責任で使用してください。本ソフトウェアの使用、使用不能、 導入、または改変に関連して生じたいかなる損害、損失、誤送信、業務中断、 その他の責任についても、作者およびコントリビューターは責任を負いません。 本番環境で使用する前に、設定と挙動を十分に確認してください。
OutlookOkanはOutlook向けの 既存の送信確認ツールです。Mail Lookoutはそのツールの目的に敬意を持っています。
Mail Lookoutは独立したプロジェクトです。OutlookOkanおよびその作者と 提携、関係、承認、後援を受けているものではありません。
本プロジェクトはアドイン専用マニフェスト(manifest.xml)で出荷
します。これは現在、Outlook on the webと新しいOutlookで十分に
サポートされています。Microsoft 365の統合マニフェストはより新しい
形式で、Microsoftが進んでいる方向です。必要なら、
office-addin-manifestツールでXMLマニフェストを統合形式に変換
できます。本プロジェクトのランタイムコードは変わりません。変わるのは
マニフェストだけです。