Skip to content

Latest commit

 

History

History
394 lines (308 loc) · 21.2 KB

File metadata and controls

394 lines (308 loc) · 21.2 KB

English | 日本語

Mail Lookout

新しい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つのことを行います。

  1. 宛先確認。 すべての宛先をフィールド別(To/Cc/Bcc)に 一覧表示し、社外の宛先には印を付けます。
  2. 添付ファイル確認。 実体のある添付をすべて一覧表示し、ファイル を確認できるようにします。
  3. 本文確認。 本文のプレビューを表示します。
  4. 確認ペインで確認完了。 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なしのローカルemulator

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 validate

本番デプロイ

Marketplace公開版は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公開の前には置き換えてください。

  1. GUID。 manifest.xmlの<Id>を自分のGUIDに置き換える。
  2. 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は変わらない。
  3. 社内ドメイン。 src/config/defaults.tsのinternalDomains を編集する。出荷時の既定値はavishaikofun.com。このリストが 間違っていると、すべての宛先が社外に見える。
  4. メタデータ。 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: ダイアログの幅と高さ(画面に対する割合)。

言語を追加する

メッセージは型安全です。言語を追加するには:

  1. src/i18n/locales/en.tsを新しいファイル(例de.ts)に コピーし、すべての値を翻訳する。
  2. src/i18n/catalog.tsに1行追加する。importしてlocales オブジェクトに加えるだけ。

キーが足りなければコンパイラが教えてくれます。test/i18n.test.ts のテストも、すべてのロケールが同じキー集合を持つことを確認します。 それ以外に変更は不要です。ロケールタグの型はlocalesのキーから 自動で更新されます。

SendMode

マニフェストはSendMode="SoftBlock"を使います。SoftBlockでは、 アドインが送信を中止したとき、ユーザーは下書きに戻って編集する必要 があります。既定ではワンクリックの「とにかく送信」はありません。これ は意図的です。すべての中止がワンクリックで回避できる確認ツールは、 ほとんど確認になりません。

1回目の送信ではSmart Alertsダイアログを表示し、送信を中止します。 ダイアログのアクションボタンから、チェックボックス付きの確認ペインを 開きます。確認ペインで下書きを確認済みにしたあと、Outlookのcompose API経由で送信します。予期しないエラーが起きた場合も、ハンドラは送信を 中止します。確認なしに実メールを送ることはありません。

SoftBlockでカバーされないこと

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との関係

OutlookOkanはOutlook向けの 既存の送信確認ツールです。Mail Lookoutはそのツールの目的に敬意を持っています。

Mail Lookoutは独立したプロジェクトです。OutlookOkanおよびその作者と 提携、関係、承認、後援を受けているものではありません。

統合マニフェストへの移行

本プロジェクトはアドイン専用マニフェスト(manifest.xml)で出荷 します。これは現在、Outlook on the webと新しいOutlookで十分に サポートされています。Microsoft 365の統合マニフェストはより新しい 形式で、Microsoftが進んでいる方向です。必要なら、 office-addin-manifestツールでXMLマニフェストを統合形式に変換 できます。本プロジェクトのランタイムコードは変わりません。変わるのは マニフェストだけです。

ライセンス

MIT