背景
メーラとして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
のどの表示部品上でこのメニュー項目が表示されるかが決まる
という事らしいですが詳細はここら辺を参照して下さい。
Outlookの編集中ウィンドウを捕まえる
var outlook = new ActiveXObject("Outlook.Application");
var inspector = outlook.ActiveInspector();
で、Outookのアクティブなウィンドウを捕まえられる、けど…
- アクティブウィンドウが存在しないかも知れないし
- アクティブウィンドウが、メールアイテムじゃないかも知れないし
- 編集可能じゃないかも知れない
ってのを織り込んで、以下のコードを追加しましょう。
if (inspector==null ||
inspector.CurrentItem.Class!=43 ||
inspector.CurrentItem.Sent) {
outolook.CreateItem(0).Display(); // 新しいメールアイテムを開いちゃいましょう
inspector = outlook.ActiveInspector();
}
HyperLinkを挿入する
文字列を挿入しても何ともならんので、WordEditor
ってのを捕まえて、そいつにHyperLink
を直接挿入しちゃえばオッケ。
こんな感じ。
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);
仕上げ
全体を纏めちゃうと、こんなん。
軽~くエラートラップも入れてあります。
<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
ファイルをコピーして、レジストリにそいつを登録しているだけです。
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
を押して下さい。
先のSetup.js
とSendToOutlook.htm
はもう用済みなので削除しちゃってイイです。
実行
Internet Explorer
のウィンドウ上で右クリックすると、、コンテキストメニューが表示されます。
Send to Outlook
が追加されていることが確認できました。
多分、一番最初は以下のセキュリティ警告が出ると思います。
今後、このプログラムに関する警告を表示しない
にチェックを入れて「許可する」を押せば良いでしょう。
すると、Outlookのメール作成ウィンドウにリンクが挿入されます。
ん、イイ感じだー
※ 尚、動作確認が取れているOutlook
のバージョンは2016
と2010
です。