hyperqm
QMAIL3の全文検索をちょっぴりGmail風にするツール
QMAIL3はHyper Estraierと組み合わせて使用することで、高速な全文検索を行うことができます。
大変便利で強力な機能なのですが、メール本文に対しての検索しか行うことができません。
メールの属性(送信者、宛先、日時、etc)を対象とした条件も使用できれば・・・。
そんな思いから、このツールを作ってみました。(Musee d'Dimanche より引用)
大変便利で強力な機能なのですが、メール本文に対しての検索しか行うことができません。
メールの属性(送信者、宛先、日時、etc)を対象とした条件も使用できれば・・・。
そんな思いから、このツールを作ってみました。(Musee d'Dimanche より引用)
Musee d'Dimanche
http://freemind.s57.xrea.com/hyperqm/
http://freemind.s57.xrea.com/hyperqm/
hyperqm.js
hyperqm.exeをちょっぴり使いやすくするツール
- hyperqm.exeのソースをJScriptに移植したもの。
- hyperqm.exeと同じフォルダにhyperqm.jsというファイル名でソースを保存して使ってください。
- QMAIL3検索オプションでカスタムにして検索のところを「cscript hyperqm.js "$index" "$condition" $encoding」とする。
- 検索式もhyperqm.exeと同じでそれに加えて下記が可能。
- 属性のOR:「from,cc:hoge,foo」とすれば「hoge」または「foo」が「fromまたはcc」にあるメールを検索。→「"from,cc:hoge foo"」と「"」で括って検索対象を「半角空白」で区切っても可。
- 属性の否定:「hoge -from:foo」とすれば、本文に「hoge」を含み「from」が「foo」を含まないメールを検索。
main();
function main(){var WshShell = new ActiveXObject('WScript.Shell'); var ARGV = WScript.Arguments; var index = ARGV(0); var char_code = ARGV(ARGV.length-1); var tmp = ARGV(1); for(var i=2;i<ARGV.length-1;i++){tmp+=" " + ARGV(i)} if(ARGV.length>=3){ tmp=tmp.replace(/\\(\S+?( \S+?)+?)\\/g,"\"$1\""); } var parser = new StringParser(tmp); var attr_str = parser.attr_str; var search_phrase = parser.search_phrase;if(debug){var fso, f; var ForReading = 1, ForWriting = 2; fso = new ActiveXObject("Scripting.FileSystemObject"); f = fso.OpenTextFile("C:\\Program Files\\QMAIL3\\testfile.txt", ForWriting, true); tmp+= "\n---------\n"; tmp+= attr_str; tmp+= "\n---------\n"; tmp+= search_phrase; tmp+= "\n---------\n"; for(i=0;i<ARGV.length;i++){tmp+=ARGV(i) + "\n"} f.Write(tmp); f.Close();}
var objExec = WshShell.Exec('estcmd search -nl -ic ' + char_code + ' -vu -aux 99 -max -1' + attr_str + ' "' + index + '" "' + search_phrase + '"'); while(!objExec.StdOut.AtEndOfStream) { WScript.StdOut.WriteLine(objExec.StdOut.ReadLine()); }}
function StringParser(arg){var inputted_str = arg var search_phrase = ''; var attribute_condition_ary = new Array(); var r, str; while(r=inputted_str.match(/\"(.*?)\"/)){ str = inputted_str.slice(r.index + 1, r.lastIndex - 1); if(str.indexOf(':') != -1){ attribute_condition_ary = attribute_condition_ary.concat(attribute(str)); }else{ if(search_phrase.length > 0){ search_phrase += ' AND '; } search_phrase += str; } inputted_str = inputted_str.slice(0,r.index) + inputted_str.slice(r.lastIndex); } var strs = inputted_str.split(/ | /); for(var key in strs){ str = strs[key]; if(!str){continue;} if(str.indexOf(':') != -1){ attribute_condition_ary = attribute_condition_ary.concat(attribute(str)); continue; } if(search_phrase.length > 0){ if(str == 'OR'){ search_phrase += ' OR'; continue; }else if(search_phrase.match(/.+ OR$/)){ search_phrase += ' '; }else if(str.charAt(0) == '-'){ search_phrase += ' ANDNOT '; str = str.slice(1); }else{ search_phrase += ' AND '; } } search_phrase += str; } if(search_phrase.length == 0){ search_phrase = '[UVSET]'; } var attr_str = ''; if(attribute_condition_ary && attribute_condition_ary.length > 0){ for(key in attribute_condition_ary){ attr_str += ' -attr "' + attribute_condition_ary[key] + '"'; } } this.source = arg; this.attr_str = attr_str; this.search_phrase = search_phrase;}
function attribute(str){var str_ary = str.split(':'); if(!str_ary){return} if(str_ary[0] == 'after'){ return "@cdate NUMGE " + Math.round(Date.parse(str_ary[1])/1000); }else if(str_ary[0] == 'before'){ return "@cdate NUMLT " + (Math.round(Date.parse(str_ary[1])/1000) + 60*60*24); }else if(str_ary[0].charAt(0) == '-'){ var ary = str_ary[0].slice(1).split(','); var a = new Array(); for(var key in ary){ if(!str_ary[1]){ continue; }else{ a=a.concat(ary[key] + " !ISTRRX " + escapeReg(str_ary[1])); } } return a; }else if(str_ary[1].match(/,| |\|/)){ return str_ary[0] + " ISTRRX " + escapeReg(str_ary[1]); }else if(!str_ary[1]){ return str_ary[0]; }else{ return str_ary[0] + " ISTRINC " + str_ary[1]; }}
function escapeReg(str){var tmp=str; tmp = str.replace(/(\\|\$|\*|\+|\?|\^|\(|\))/g,"\\$1");//.のエスケープ不要? return tmp.replace(/,| |\|/g,'|');}
Browser.js
標準ブラウザ以外で開くスクリプト。
Browser.jsという名前でQmail3のscriptsフォルダに保存。
メールのurlを範囲指定してから「ツール」-「スクリプト」で選択。
Browser.jsという名前でQmail3のscriptsフォルダに保存。
メールのurlを範囲指定してから「ツール」-「スクリプト」で選択。
var browser = "iexplore.exe";//var browser = "opera.exe"; //var browser = "firefox.exe"; //var browser = "Netscp.exe";
actionTarget.invokeAction("EditCopy");
var macro = macroParser.parse("@Clipboard()");
var url = macro.evaluate(application.nothing, application.nothing);
var shell = new ActiveXObject("WScript.Shell");
shell.Run(browser + " " + url);
起動したいブラウザのコメント(//)はずしてください。
上記ではIEが起動してます。
上記ではIEが起動してます。
EditByEditor.js
EmEditorでメール編集するためのスクリプト。
テンポラリファイルをUTF-8にしているので、Shift-JIS以外の言語でも問題ありません。
下記のスクリプトをEditByEmeditor.jsとしてscriptsフォルダに保存してください。
また、最初の二行はそれぞれの環境に合わせてパスを変更する必要があります。テンポラリファイルの拡張子はお好みで適当に変えてください。
テンポラリファイルをUTF-8にしているので、Shift-JIS以外の言語でも問題ありません。
下記のスクリプトをEditByEmeditor.jsとしてscriptsフォルダに保存してください。
また、最初の二行はそれぞれの環境に合わせてパスを変更する必要があります。テンポラリファイルの拡張子はお好みで適当に変えてください。
var editor = "\"C:\\Program Files\\EmEditor\\emeditor.exe\" /sp ";
var tempFile = "C:\\Windows\\temp\\spellcheck.qhtml";
var adTypeText = 2;
var adSaveCreateOverWrite = 2;
function SaveText(filename, text, charset)
{var stm = new ActiveXObject("ADODB.Stream"); stm.Type = adTypeText; stm.Charset = charset; stm.Open(); stm.WriteText(text); stm.SaveToFile(filename, adSaveCreateOverWrite); stm.Close();}
function LoadText(filename, charset)
{var stm = new ActiveXObject("ADODB.Stream"); stm.Type = adTypeText; stm.Charset = charset; stm.Open(); stm.LoadFromFile(filename); var text = stm.ReadText(); stm.Close(); return text;}
editFrameWindow.invokeAction("EditSelectAll");
editFrameWindow.invokeAction("EditCopy");
var getClipboardMacro = macroParser.parse("@Clipboard()");
var inText = getClipboardMacro.evaluate(application.nothing, document.accounts(0));
SaveText(tempFile, inText, "UTF-8");
// Editorを起動して終了するまで待つ var shell = new ActiveXObject("WScript.Shell"); var flag=shell.Run(editor + tempFile, 5, true); macroParser.parse("@MessageBox(\"Editor編集後のファイルを読み込みます\")").evaluate(application.nothing, application.nothing);
// Editorが修正したファイルを読み込む var outText = null; outText = LoadText(tempFile, "UTF-8");
// クリップボードを経由してエディットビューに貼り付け var setClipboardMacro = macroParser.parse("@Clipboard($value)"); setClipboardMacro.setVariable("value", outText); setClipboardMacro.evaluate(application.nothing, document.accounts(0)); editFrameWindow.invokeAction("EditSelectAll"); editFrameWindow.invokeAction("EditPaste"); editFrameWindow.invokeAction("EditMoveDocStart");try {var fs = new ActiveXObject("Scripting.FileSystemObject"); fs.DeleteFile(tempFile);}
finally {
}
Googleで検索
本家メモにあります。
http://snak.tdiary.net/20050927.html#p01
http://snak.tdiary.net/20050927.html#p01
AddSama.js
メールに「様」をつけるスクリプト。
付けたいときに付ける事が出来ます。
AddSama.jsという名前でQmail3のscriptsフォルダに保存。
メールのurlを範囲指定してから「ツール」-「スクリプト」で選択。
付けたいときに付ける事が出来ます。
AddSama.jsという名前でQmail3のscriptsフォルダに保存。
メールのurlを範囲指定してから「ツール」-「スクリプト」で選択。
addSAMA(0);//To
addSAMA(1);//Cc
addSAMA(2);//Bcc
function addSAMA(n){
var address=getText(n).replace(/(?!様)("?) </g,"様$1 <");
var setClipboardMacro = macroParser.parse("@Clipboard($value)");
setClipboardMacro.setVariable("value", address);
setClipboardMacro.evaluate(application.nothing, document.accounts(0));
editFrameWindow.invokeAction("EditPaste");
}
function getText(n){
var putClipboardMacro = macroParser.parse("@Clipboard('')");
putClipboardMacro.evaluate(application.nothing, application.nothing);
editFrameWindow.invokeAction("ViewFocusEditItem","@" + n);
editFrameWindow.invokeAction("EditSelectAll");
editFrameWindow.invokeAction("EditCopy");
var getClipboardMacro = macroParser.parse("@Clipboard()");
var inText = getClipboardMacro.evaluate(application.nothing, application.nothing);
return inText;
}
_chkToSubject.js
送信メールのToとSubjectが空の場合に警告します。
おまけで、本文に「添付」「attached」「attachment」の単語が存在すると、送信の可否を聞いてきます。マクロの方法と違い、実際に添付ファイルがあってもなくても送信の可否を聞いてきます。
通常はメール作成にあるマクロを使用してください。
マクロでは機能しないIMAP4での使用を意図しています。
下記を _chkToSubject.js という名前で scripts フォルダに保存してください。
おまけで、本文に「添付」「attached」「attachment」の単語が存在すると、送信の可否を聞いてきます。マクロの方法と違い、実際に添付ファイルがあってもなくても送信の可否を聞いてきます。
通常はメール作成にあるマクロを使用してください。
マクロでは機能しないIMAP4での使用を意図しています。
下記を _chkToSubject.js という名前で scripts フォルダに保存してください。
// エディットビューからto,cc,subjectが空かを判定 // var cmd=1;//変更可 // 1:通常の送信(巡回待ち) // 2:すぐに送信 // 0:Debug // クリップボードを空にする var outText = ""; var setClipboardMacro = macroParser.parse("@Clipboard($value)"); setClipboardMacro.setVariable("value", outText); setClipboardMacro.evaluate(application.nothing, document.accounts(0)); var flag=true; if(chkBlank(0)){//To flag = setClipboardMacro = macroParser.parse("@Equal(6,@MessageBox(@Concat('To',' がないけど送信する?\n-------------------------\n はい(Y) - そのまま送信\n いいえ(N)- 再編集'),68))").evaluate(application.nothing, application.nothing); } if(flag&&chkBlank(5)){//Subject flag = setClipboardMacro = macroParser.parse("@Equal(6,@MessageBox(@Concat('Subject',' がないけど送信する?\n-------------------------\n はい(Y) - そのまま送信\n いいえ(N)- 再編集'),68))").evaluate(application.nothing, application.nothing); } if(flag){ editFrameWindow.invokeAction("ViewFocusEditItem","@8");//署名 editFrameWindow.invokeAction("ViewFocusNextEditItem");//次のアイテムに移動 // テキストをすべて選択してクリップボードにいれ、 // クリップボード経由でテキストを取得する editFrameWindow.invokeAction("EditMoveLineStart"); editFrameWindow.invokeAction("EditSelectAll"); editFrameWindow.invokeAction("EditCopy"); var getClipboardMacro = macroParser.parse("@Clipboard()"); var inText = getClipboardMacro.evaluate(application.nothing, document.accounts(0)); if(inText.match(/添付|attached|attachment/i)){ flag = setClipboardMacro = macroParser.parse("@Equal(6,@MessageBox(@Concat('添付',' がないけど送信する?\n-------------------------\n はい(Y) - そのまま送信\n いいえ(N)- 再編集'),68))").evaluate(application.nothing, application.nothing); }else{ flag=true; } editFrameWindow.invokeAction("EditMoveDocStart");//カーソルを文頭に移動 } if(flag){ if(cmd==2){editFrameWindow.invokeAction("FileSendNow")} else if(cmd==1){editFrameWindow.invokeAction("FileSend")} else{ macroParser.parse("@MessageBox('送信するアクション実行')").evaluate(application.nothing, application.nothing); } } if(cmd!=1&&cmd!=2){ macroParser.parse("@MessageBox('" + flag + "')").evaluate(application.nothing, application.nothing); } function chkBlank(n){ if(getText(n)){return false} else {return true} } function getText(n){ var putClipboardMacro = macroParser.parse("@Clipboard('')"); putClipboardMacro.evaluate(application.nothing, application.nothing); editFrameWindow.invokeAction("ViewFocusEditItem","@" + n); editFrameWindow.invokeAction("EditSelectAll"); editFrameWindow.invokeAction("EditCopy"); var getClipboardMacro = macroParser.parse("@Clipboard()"); var inText = getClipboardMacro.evaluate(application.nothing, application.nothing); return inText; }
「ツール」-「スクリプト」から選択してもいいですが面倒なので、下記のようにツールバーに登録しておくと便利です。
<toolbar name="editframe" showText="true">
の中に下記を書きます。
<button image="15" action="ToolScript" param='_chkToSubject' text="送信★"/>