Outlookのメール本文中にurlリンクを簡単・イイ感じに貼り付けたいっ！


# 背景
メーラとしてOutlookを利用しています。
メールを作成している時、本文中にurlリンクを貼り付けたいです。

勿論、書式はHTML形式にするとか、url文字列をCopy&Pasteすれは良いとか、基本的な項目を押さえた上でハイパーリンクを作成できる事は理解しています。

でも、諸々めんどくさいんだよー

# 方針

* InternetExplorerのコンテキストメニューをカスタマイズして「Send to Outlook」を追加する
* このメニューが選ばれたら、Outlookのメール作成中ウィンドウのカレントカーソル位置にページタイトルを挿入し、その位置にurlリンクを割り当てる

ね？
イイ感じでしょ？

# 要件
実現に必要な要素は以下の通り。

* IEのコンテキストメニューを追加する方法
* Outlookの作成中ウィンドウを捕まえる方法
* HyperLinkを挿入する方法

だな。

# 要素
#### IEのコンテキストメニューを追加する

* レジストリ``HKCU\Software\Microsoft\Internet Explorer\MenuExt``の下にキーを追加すると、そのキー名が``IE``のコンテキストメニューに追加される
* メニュー項目が選択されると、上記キーの``Default``項目に登録されている``html``ファイルが実行されるので、ここに``script``を書いておけばそれが実行されるって訳
* 上記キーの``Contents``の値により、``IE``のどの表示部品上でこのメニュー項目が表示されるかが決まる

という事らしいですが詳細は[ここら辺](https://support.microsoft.com/ja-jp/kb/177241)を参照して下さい。

#### Outlookの編集中ウィンドウを捕まえる

```js
var outlook = new ActiveXObject("Outlook.Application");
var inspector = outlook.ActiveInspector();
```

で、Outookのアクティブなウィンドウを捕まえられる、けど…

* アクティブウィンドウが存在しないかも知れないし
* アクティブウィンドウが、メールアイテムじゃないかも知れないし
*  編集可能じゃないかも知れない

ってのを織り込んで、以下のコードを追加しましょう。

```js
if (inspector==null ||
    inspector.CurrentItem.Class!=43 ||
    inspector.CurrentItem.Sent) {
    outolook.CreateItem(0).Display();            //    新しいメールアイテムを開いちゃいましょう
    inspector = outlook.ActiveInspector();
}
```

#### HyperLinkを挿入する

文字列を挿入しても何ともならんので、``WordEditor``ってのを捕まえて、そいつに`HyperLink`を直接挿入しちゃえばオッケ。
こんな感じ。

```js
var doc = external.menuArguments.document;
var word = inspector.WordEditor;
var win = word.Windows(1);

var url = doc.URL;
var title = doc.title;
if (title==undefined ||
    title==null ||
    title=="")
    title = url;        //    タイトルがなければurlで代替する
    
word.Hyperlinks.Add(win.Selection.Range, url, "", "", title);
```

#### 仕上げ
全体を纏めちゃうと、こんなん。
軽～くエラートラップも入れてあります。

```html:SendToOutlook.htm
<script Language="JavaScript" defer>
var outlook = new ActiveXObject("Outlook.Application");
var inspector = outlook.ActiveInspector();
if(inspector==null ||
   inspector.CurrentItem.Class != 43 ||
   inspector.CurrentItem.Sent) {
   outlook.CreateItem(0).Display();
   inspector = outlook.ActiveInspector();
}
var doc = external.menuArguments.document;
var word = inspector.WordEditor;
var win = word.Windows(1);
try {
   var url = doc.URL;
   var title = doc.title;
   if(title==undefined || title==null || title=="")
      title = url;
   word.Hyperlinks.Add(win.Selection.Range, url, "", "", title);
}
catch(e) {
   window.Alert(e.message);
}
finally {
   outlook = word = win = null;
}
</script>
```

# セットアップ
えーっと、配置に色々面倒臭いものがあるからセットアップスクリプトを作っちゃいましょう。
やってる事はユーザの``Templates``フォルダに``htm``ファイルをコピーして、レジストリにそいつを登録しているだけです。

```js:Setup.js
var wsh = WScript.CreateObject("WScript.Shell");
var fso = WScript.CreateObject("Scripting.FileSystemObject");

try {
    var key = "HKCU\\Software\\Microsoft\\Internet Explorer\\MenuExt\\Send to Outlook\\";
    var template = wsh.SpecialFolders("Templates") + "\\";
    var scrFolder = fso.getParentFolderName(WScript.ScriptFullName) + "\\";
    var htm = "SendToOutlook.htm";
    
    wsh.RegWrite(key, "file://" + template + htm, "REG_SZ");
    wsh.RegWrite(key + "Contexts", 127, "REG_DWORD");
    
    if (fso.FileExists(template + htm))
        fso.DeleteFile(template + htm, true);
    
    fso.CopyFile(scrFolder + htm, template);
    }
finally {
    wsh = fso = null;
}
```

``Setup.js``と``SendToOutlook.htm``を同じフォルダに置いて（デスクトップで充分です）、``Setup.js``をダブルクリックすれば設定完了です。もし、以下の画面が出たら、``Windows Based Script Host``を選んで``OK``を押して下さい。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/94018b66-990b-d054-a8e5-bdc654c48f4f.png)

先の``Setup.js``と``SendToOutlook.htm``はもう用済みなので削除しちゃってイイです。

# 実行
``Internet Explorer``のウィンドウ上で右クリックすると、、コンテキストメニューが表示されます。
``Send to Outlook``が追加されていることが確認できました。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/95c40fa0-cbee-803d-67ba-8d4f29bd1fda.png)

多分、一番最初は以下のセキュリティ警告が出ると思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/25a67638-a4cc-4a52-f658-ef3197b3ee82.png)

``今後、このプログラムに関する警告を表示しない``にチェックを入れて「許可する」を押せば良いでしょう。
すると、Outlookのメール作成ウィンドウにリンクが挿入されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/136132/76acc9ba-0c9d-eadf-b2b1-4493bee3afee.png)

ん、イイ感じだー

※ 尚、動作確認が取れている``Outlook``のバージョンは``2016``と``2010``です。