|
MSMSさん、こんばんわ。
マクロのご使用ありがとうございます。
最近仕事が忙しくて、へばりぎみであまりこちらの会議室をチェック
できていません。
たまたま見かけて、今日は元気だったので試しにマクロを修正してみました。
一度お試しください。
//----------------------------------------------------------------------//
// 秀丸メール UNIX MBOX形式メールインポートマクロ //
// マクロ名称 : HMML_IMPORT_MBOX.MAC Ver 1.00 //
// //
// 機能概要 : UNIX MBOX形式データから秀丸メールへインポート //
$$ver = "1.00Beta1";
$$date = "2008/09/23";
$$author = "プックン" ;
$$fname = currentmacrobasename ;
$info = "\n" + $$fname + " Ver " + $$ver+ "\n最終更新日付:"+$$date ;
$info = $info + "\n作者:"+$$author ;
$sbuf = searchbuffer ; //マクロ終了時に、検索条件を復元するため記憶
#sopt = searchoption ;
$rbuf = replacebuffer;
//検索での表示 点滅表示/範囲選択の情報を取得する。
//点滅表示のとき0、範囲選択のときは1です。
##reg_search = searchmode;
//検索での表示を範囲選択に変更する。
if(##reg_search == 0) {
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
if(!result){message "レジストリーをopen出来ませんでした!" ;endmacro;}
writeregnum "SelectFound",1;
closereg ;
envchanged;
}
call HidemaruMail ;
//返り値(数値型)
//秀丸メールのバージョン番号を100倍した値です。
##ver = dllfunc("HidemaruMailVersion");
if(##ver < 450){
message
"現在の版数が秀丸メール Ver4.50より古いので処理を終了します。\n" +
"新しい版数を使用してください。\n" + $info ;
goto LEND ;
}
$$ini = hidemarudir + "\\" + "puku.ini";
$$Section = currentmacrobasename ;
$$key = "path" ;
$$key1 = "file" ;
//秀丸メールの本体ウィンドウ中かどうか
if(! dllfunc("IsHidemaruMailMain")){
message "秀丸メール本体からマクロを実行してください。\n";
goto LEND ;
}
// 他のソフトウェアでエクスポートされたUNIX MBOX形式のメールデータが格納された
// フォルダを指定して、指定したフォルダ以下にあるメールデータ(mbox)を
// インポートする。
//1. 1個のディレクトリを指定して、指定ディレクトリの下階層を再起的に処理
//2. フォルダ情報,ファイル情報をINIファイルにWriteする。
//3. 現在処理しているアカウントの下に"Import_mbox"フォルダを作成し、
// その下にインポートを実施する。
//4. インポートのOPTION
// "mbox" From区切りテキストファイル(UNIX MBOX形式)
// logを作成する。パラメータ4(文字列型、省略可)"makelog"を指定
// 受信日時は元メールの情報とする。
// パラメータ5(文字列型、省略可)"tdateheader"を指定する。
// 開封通知は無視する。パラメータ6(文字列型、省略可)パラメータを省略
//"Import_mbox"フォルダを作成する。
$$CurrentAccount = dllfuncstr( "CurrentAccount" );
$$ImportFolder = "Import_mbox" ;
##n = dllfunc( "SelectFolder", $$CurrentAccount, "受信" );
$$root = "受信\\" + $$ImportFolder ;
##n = dllfunc( "SelectFolder", $$CurrentAccount, $$root );
if(dllfuncstr( "CurrentFolder" ) == $$root){
question $$ImportFolder + "が存在します。処理を継続しますか?" ;
if( result == no ) {
message "Cancelしました。\n" + $info ;
goto LEND ;
}
}
else{
##n = dllfunc( "MakeFolder", $$ImportFolder);
}
freedll ; call Dengaku ;
// Dengaku.dllのバージョンチェック
$$wk = dllfuncstr("GETVERSION");
$$wk = leftstr($$wk,1) + midstr($$wk,2,2) ;
if (val($$wk) < 209) {
message "このマクロの実行には Ver.2.09 以降の田楽DLLが必要です。\n"+
"Dengaku.DLL Ver" + $$wk ;
freedll;
endmacro;
}
//途中中断されたあとの継続処理用
##break = val(getinistr($$ini, $$Section , "break")) ;
$$target_dir = getinistr($$ini, $$Section , "target_dir") ;
$$account = getinistr($$ini, $$Section , "Account") ;
if(
(##break != 0) &&
(existfile($$target_dir)) &&
($$CurrentAccount == $$account) ){
##cnt_folder = ##break ;
$$CurrentAccount = $$account ;
goto Import ;
}
##n = 0 ;
call DIROPEN ;
$$target_dir = $$return ;
##wk = existfile( $$target_dir );
if( !##wk ){
message $$target_dir + "が存在しません。\n処理を終了します。\n" + $info;
goto LEND ;
}
##dengaku_use = 1 ;
call Get_basename $$target_dir,1,##dengaku_use ; //ToLower処理を実施,田楽DL
Lの機能を利用
$$wk = $$return ;
question "mbox形式 メールフォルダは、下記フォルダで良いですか?。\n\n" + $$
target_dir +
"\n\nyesで処理を継続します。" ;
if( result == no ) {
message "Cancelしました。";
goto LEND ;
}
$$ext = "mbox" ;
//メッセージ系
question "処理対象ファイルの拡張子は\n " + $$ext + "\nでよいですか?" ;
if( result == no ) {
$$wk = "拡張子を入力してください(ピリオドを含まない)";
$$wk = input($$wk,$$ext);
if($$wk == "") {
message "拡張子指定Error\nマクロを終了します。" ;
goto LEND ;
}
else{
$$ext = $$wk ;
}
}
title "ファイル情報取得中:" ;
$$wild = $$target_dir + "\\*." + $$ext ;
##n = dllfunc("ENUMPATH","\"" + $$wild + "\"" ); //田楽DLLの機能を利用する。
##cnt_folder = 0 ;
while (1) {
$$file = dllfuncstr("FINDNEXT"); //田楽DLLの機能を利用する。
##n = strstr($$file ,"\\") ;
if ($$file == "") break;
else if ($$file == "." || $$file == "..") continue;
//アトリビュート情報がディレクトリのときはcontinue
else if(strstr(dllfuncstr("ATTRIBUTEOF",""),"d") != -1) continue; //田楽DL
Lの機能を利用する。
//file情報と、作成するフォルダ情報を作成し保存する。
##dengaku_use = 1 ;
call Get_path $$file,##dengaku_use ; //田楽DLLの機能を利用する。
$$wk = $$return ;
$$file = rightstr($$file,strlen($$file) - strlen($$wk)) ;
if(leftstr($$file,1) == "\\"){
$$file = rightstr($$file,strlen($$file) -1);
}
//作成したfile情報,フォルダ情報をINIファイルに記録する。
writeinistr $$ini, $$Section , "#" + str( ##cnt_folder ) +"_"+ $$key, $$wk;
writeinistr $$ini, $$Section , "#" + str( ##cnt_folder ) +"_"+ $$key1, $$f
ile ;
##cnt_folder = ##cnt_folder + 1;
}
if(##cnt_folder ==0) {
message "ファイル取得エラー\n" + $$target_dir + "\nファイル情報を取得でき
ませんでした。\n" + $info ;
goto LEND ;
}
//秀丸メール フォルダ作成処理
title "秀丸メールフォルダ情報取得中:" ;
##i = 0;
freedll ; call HidemaruMail ;
##n = dllfunc("DisableDraw");
while( ##i < ##cnt_folder ) {
title "秀丸メールフォルダ情報取得中:" + str(##i) + "/" + str(##cnt_folder
-1) ;
##n = dllfunc( "SelectFolder", $$CurrentAccount, $$root );
$$HomeDir = dllfuncstr("HomeDir") ;
$$dir = getinistr($$ini,$$Section,"#" + str( ##i ) +"_"+ $$key);
call Str_check $$dir ,
"変数 $$dir取得エラー\n" +
"Ini=" + $$ini + "\n" +
"Section=" + $$Section + "\n" +
"key=" + "#" + str( ##i ) +"_"+ $$key + "\n" +
$info ;
$$wk = $$dir ;
$$path = $$root ;
$$full_path = $$HomeDir + $$CurrentAccount + "\\" ;
while(1){
##n = strstr($$wk,"\\") ;
//文字列情報に"\"が含まれる場合
if(##n != -1){
$$sub_dir = midstr($$wk , 0,##n) ;
$$wk = midstr($$wk,##n +1,strlen($$wk) - ##n - 1) ;
if(!existfile(($$full_path + "\\" + $$path + "\\" + $$sub_dir))) {
##n = dllfunc( "MakeFolder", $$sub_dir);
}
}
//文字列情報に"\"が含まれない場合
else{
$$sub_dir = $$wk ;
if(!existfile($$full_path + "\\" + $$path + "\\" + $$sub_dir)) {
##n = dllfunc( "MakeFolder", $$sub_dir);
}
break ;
}
$$path = $$path + "\\" + $$sub_dir ;
##n = dllfunc( "SelectFolder", $$CurrentAccount, $$path );
}
##i = ##i + 1;
}
##n = dllfunc("EnableDraw");
Import:
disablebreak ; //マクロの中断を禁止します。
//秀丸メールインポート処理中
title "秀丸メール インポート処理中:" ;
##i = ##cnt_folder -1 ;
freedll ; call HidemaruMail ;
while( ##i >= 0 ) {
title "秀丸メール インポート処理中:" + str(##cnt_folder - ##i) + "/" + str
(##cnt_folder) ;
//title文の種類:
//title 文字列 キャプションの設定
##key = keypressed ;
//escapeを押された時の処理
if(##key==27){
writeinistr $$ini, $$Section , "break", str(##i +1) ;
writeinistr $$ini, $$Section , "target_dir", $$target_dir ;
writeinistr $$ini, $$Section , "Account", $$CurrentAccount ;
title "処理を中断しました。" + $$Section + "マクロを再実行することで、継
続処理を実施します。" ;
title -1 ;
message "処理を中断しました。\nマクロを再実行することで、継続処理を実施し
ます。\n" +
$info ;
goto LEND ;
}
$$folder = getinistr($$ini,$$Section,"#" + str( ##i ) +"_"+ $$key);
call Str_check $$folder ,
"変数 $$folder取得エラー\n" +
"Ini=" + $$ini + "\n" +
"Section=" + $$Section + "\n" +
"key=" + "#" + str( ##i ) +"_"+ $$key + "\n" +
$info ;
$$mail = getinistr($$ini,$$Section,"#" + str( ##i ) +"_"+ $$key1);
call Str_check $$mail ,
"変数 $$mail取得エラー\n" +
"Ini=" + $$ini + "\n" +
"Section=" + $$Section + "\n" +
"key=" + "#" + str( ##i ) +"_"+ $$key1 + "\n" +
$info ;
$$mail_folder = $$target_dir + "\\" + $$folder ;
freedll ; call HidemaruMail ;
//秀丸メールのImport先フォルダ選択
##n = dllfunc( "SelectFolder", $$CurrentAccount, $$root + "\\" + $$folder );
if(dllfuncstr( "CurrentFolder" ) != $$root + "\\" + $$folder){
message "Folder Select Error\n" + "Account=" + $$CurrentAccount + "\n"+ "
Folder=" + $$root + "\\" + $$folder ;
goto LEND ;
}
//パラメータ1にファイル名を指定すると、サイズが返る。
//エラーの場合は-1を返す。
// (パラメータ1にファイル名、パラメータ2は省略)
##n = dllfunc("Bypass_GetFileSize", $$target_dir + "\\" + $$mail);
if(##n == 0){
##cnt_file = 0 ;
}
else{
##cnt_file = 1 ;
}
##j = ##cnt_file -1 ;
while( ##j >= 0 ) {
title "秀丸メール インポート処理中:" + str(##cnt_folder - ##i) + "/" + st
r(##cnt_folder) +
"File=" + $$mail ;
##key = keypressed ;
//escapeを押された時の処理
if(##key==27){
writeinistr $$ini, $$Section , "break", str(##i +1) ;
writeinistr $$ini, $$Section , "target_dir", $$target_dir ;
writeinistr $$ini, $$Section , "Account", $$CurrentAccount ;
title "処理を中断しました。" + $$Section +
"マクロを再実行することで、継続処理を実施します。だだし中断をしたフォル
ダは再実行によりメールが重複することになります。" +
$info ;
title -1 ;
message "処理を中断しました。\nマクロを再実行することで、継続処理を実施
します。\n" +
"だだし中断をしたフォルダは再実行によりメールが重複することになります。
\n" + $info ;
goto LEND ;
}
//ファイルが存在するとき
if(existfile($$mail_folder + "\\" + $$mail))
//実際のImport処理
##n = dllfunc("Import",
$$mail_folder + "\\" + $$mail , //対象ファイル
"mbox", //From区切りテキストファイル(UNIX MBOX形式)
"", //現在選択しているフォルダに入れる
"makelog", //ログ(受信ログ)を作成
"tdateheader", //Date:ヘッダの示す日付
""); //開封通知要求無視
else message "There is not file. \n" + $$mail_folder + "\\" + $$mail ;
$$mail = "" ; //変数削除
##j = ##j - 1;
}
//作成したfile情報,フォルダ情報をINIファイルから削除する。
writeinistr $$ini, $$Section , "#" + str( ##i ) +"_"+ $$key, 0 ;
writeinistr $$ini, $$Section , "#" + str( ##i ) +"_"+ $$key1, 0 ;
##i = ##i - 1;
}
##n = dllfunc( "SelectFolder", $$CurrentAccount, $$root );
//重複メールのチェックコマンドを実行します。
##n = dllfunc( "CheckDuplication", "under", $$CurrentAccount, $$root );
call Del_ini $$ini, $$Section ;
message "処理終了しました。\n" + $info ;
LEND:
setsearch $sbuf, #sopt; //開始時の検索文字,optionに戻す
setreplace $rbuf ;
//検索での表示を元に戻す
if(##reg_search == 0) {
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
if(!result){message "レジストリーをopen出来ませんでした!" ;endmacro;}
writeregnum "SelectFound",##reg_search;
closereg ;
envchanged;
}
freedll;
endmacro;
HidemaruMail: //秀丸メール起動チェック&DLLロード
//機能:TKInfo.dllをロードする
//秀シリーズサポートHPより 抜粋
// DLL を Load する
openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
##res = result ;
closereg ;
if( !##res ) {
message "秀丸メールがインストールされてないです (^^;)\n"+$info;
endmacro;
}
loaddll "TKInfo.dll";
if( !result ) {
message "DLLロードに失敗\n"+$info;
endmacro;
}
return ;
Res_check:
//処理:処理の判定&メッセージ表示
//引数渡し
###num = ###1; $$mes = $$2 ;
if(###num != 1){
message $$mes ;
goto LEND;
}
return ;
Str_check:
//処理:文字列の判定&メッセージ表示
//引数渡し
$$str = $$1; $$mes = $$2 ;
if($$str == ""){
message $$mes ;
goto LEND;
}
return ;
Dengaku:
// 田楽DLLのロード
if(existfile(hidemarudir+"\\DengakuDLL.dll"))loaddll hidemarudir+"\\Dengaku
DLL.dll";
else {
$$mes = "田楽DLLが見つかりませんでした。\n" +
"田楽DLLを秀丸エディタインストールディレクトリにおいてください。\n" +
" 秀丸エディタインストールディレクトリ:\n\t"+hidemarudir + "\n\n" +
"田楽DLL ダウンロードURL\n"+
" http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/\n" +
"\nURLをopenしますか?\n" +
$info ;
question $$mes ;
if(result == yes){
call openurl ,"http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserv
er/";
}
goto LEND ;
}
if (!result) {
message "田楽DLL をロードできませんでした。"+$info;
goto LEND ;
}
return;
openurl:
//機能: 第一引数のURLをOPENする
//第一引数: 文字列型,URL情報
//戻り値: なし
//参照資料
//slide_moonさん作成magickey_cfg.mac サブルーチンAccessURL
//引数渡し
$$url = $$1 ;
if($$url == ""){
message "サブルーチンopenurl 第一引数Error\n" + $info ;
goto LEND ;
}
//Firefoxでの設定
//[HKEY_CLASSES_ROOT\http\shell\open\command]
//@="D:\\PROGRA~1\\MOZILL~1\\FIREFOX.EXE -url \"%1\""
//%1をURL指定するといいようだ。
openreg "CLASSESROOT", "http\\shell\\open\\command";
if(!result){message "レジストリーをopen出来ませんでした!" ;endmacro;}
$$shell = getregstr( "" );
closereg ; //オープンしたレジストリをクローズします。
##n = strstr($$shell,"%1") ;
//文字列"%1"を第一引数のURL情報と置換する
if(##n != -1){
$$url = leftstr($$shell,##n) +
$$url +
midstr($$shell,##n + strlen("%1") ,strlen($$shell) - ##n - strlen("%1") ) ;
}
//$$shell情報に%1の文字列が無い場合
else{
$$url = $$shell + " " + $$url ;
}
run $$url ;
return ;
DIROPEN:
// 「フォルダの指定」ダイアログ
$$def = $$1 ;
if($$def == "") $$def = hidemarudir ;
//田楽DLLサンプルマクロ dgdll.macより流用
$$name = dllfuncstr("GETDIRNAME",
hidemaruhandle(0), // オーナーウィンドウのウィンドウハンドル
"UNIX MBOX形式 メールフォルダの指定。", // タイトル
$$def // 初期フォルダ名
);
if ($$name == "") {
message "フォルダ選択処理をキャンセルしました。\n" + $info ;
goto LEND ;
break ;
}
return $$name ;
Get_basename:
//処理:第一引数で指定された"\"以降の文字列を取得する。
//引数渡し
//第一引数: 文字列型,チェックを行う文字列
$$str = $$1;
//第二引数: 数値型,大文字,小文字変換option
//0=何もしない,1=小文字,2=大文字
##tolower = ##2 ;
//第三引数: 数値型,田楽DLL機能使用
//0=使用しない,1=使用する。
##flag_dengaku = ##3 ;
##dengaku_use = 1 ;
//戻り値:文字列型,pathを削除したファイル名(小文字)
if($$str == ""){
message "サブルーチンGet_basename 第一引数Error\n" + $info ;
}
if(##tolower == 1){
if(##flag_dengaku == ##dengaku_use){
$$str = dllfuncstr("TOLOWER2",$$str);
}
else{
//ToLowerは小文字に変換します。
$$str = dllfuncstr("ToLower", $$str );
}
}
else if(##tolower == 2){
if(##flag_dengaku == ##dengaku_use){
$$str = dllfuncstr("TOUPPER2",$$str);
}
else{
//ToUpperは大文字に変換します。
$$str = dllfuncstr("ToUpper", $$str );
}
}
//"."を含むかどうか調べる
//strstrは、検索を行う文字列が複数存在する場合、
//先頭側の位置情報を示す。
##i = strstr($$str,"\\"); //.の位置を調べる 先頭が0
if( ##i != -1 ){ //.が存在する場合 ##i=ピリオドの位置
//複数の"\"を含む可能性があるので、ファイル名の後ろから調べる。
if(##flag_dengaku == ##dengaku_use){
##n = dllfunc("STRRSTR",$$str,"\\");
$$name = midstr($$str,##n + 1,strlen($$str) - ##n -1) ;
}
else{
##i = 1 ;
$$pre = "" ;
while( 1 ) {
$$name = rightstr( $$str, ##i );
if( leftstr( $$name, 1 ) == "\\" ) break;
$$pre = $$name ;
##i = ##i + 1;
}
$$name = $$pre ;
}
}
else{
$$name = $$str ;
}
return $$name ;
Get_path:
//処理:第一引数で指定されたdir情報を取得する。
// "\"より前の文字列を取得する。
// "\"が無い場合は、第一引数をそのまま戻り値とする。
//引数渡し
//第一引数: 文字列型,チェックを行う文字列
$$str = $$1;
//第ニ引数: 数値型,田楽Dllを使用するflag。"1":田楽Dllを使用,"0":田楽Dllを使
用しない
##flag_dengaku = ##2 ;
##dengaku_use = 1 ;
//戻り値:文字列型,最後の"\"以降を削除した文字列
if($$str == ""){
message "サブルーチンGet_basename 第一引数Error\n" + $info ;
}
//"."を含むかどうか調べる
//strstrは、検索を行う文字列が複数存在する場合、
//先頭側の位置情報を示す。
##i = strstr($$str,"\\"); //.の位置を調べる 先頭が0
if( ##i != -1 ){ //.が存在する場合 ##i=ピリオドの位置
//複数の"\"を含む可能性があるので、ファイル名の後ろから調べる。
if(##flag_dengaku == ##dengaku_use){
##i = dllfunc("STRRSTR",$$str,"\\");
$$pre = leftstr($$str,##i ) ;
}
else{
##i = strlen($$str) ;
$$pre = $$str ;
while( 1 ) {
if(midstr( $$pre, ##i, 1 ) == "\\"){
$$pre = leftstr($$pre,##i ) ;
break ;
}
##i = ##i - 1;
}
}
}
else{
$$pre = $$str ;
}
return $$pre ;
Del_ini:
//処理: 第一,ニ引数で指定されたini情報を削除。
// ini情報を削除後、ファイルサイズが"0"の場合、ファイルを削除する。
//引数渡し
//第一引数: 文字列型,情報を削除するiniファイルを指定
$$ini = $$1 ;
//第二引数: 文字列型,情報を削除するiniファイルのセクション名を指定
$$Section = $$2 ;
//第三引数: 数値型,田楽Dllを使用するflag。"1":田楽Dllを使用,"0":田楽Dllを使
用しない
##flag = ##3 ;
##dengaku_use = 1 ;
//戻り値
//Iniファイルの処理結果
//0 = Iniファイルの情報 削除失敗
//1 = Iniファイルの情報 削除実施
//2 = Iniファイルの情報 削除実施,Iniファイル削除
if($$ini ==""){
message "サブルーチンDel_ini\n引数エラー:iniファイル\n" + $info ;
return 0 ;
}
else if(! existfile( $$ini )) {
message "サブルーチンDel_ini\n引数エラー:ini File Not Found\n" +$$ini + "\
n" + $info ;
return 0 ;
}
if($$Section ==""){
message "サブルーチンDel_ini\n引数エラー:Section情報\n" + $info ;
return 0 ;
}
writeinistr $$ini, $$Section, 0, 0 ;
##ret = 1 ;
##n = existfile( $$ini );
if( ##n ){
//田楽DLLを使用する。
if(##flag == ##dengaku_use){
//ファイルサイズを取得する
##size = val(dllfuncstr("SIZEOF",$$ini));
//取得したファイルが空の場合削除する。
if(##size == 0){
##n = dllfunc("REMOVE", $$ini);
if(##n == 1) ##ret = 2 ;
}
}
else{ //tkinfoを使用する
//ファイルサイズを取得する
##size = dllfunc("Bypass_GetFileSize", $$ini);
//取得したファイルが空の場合削除する。
if(##size == 0){
##n = dllfunc("Bypass_DeleteFile", $$ini);
if(##n == 1) ##ret = 2 ;
}
}
}
return ##ret ;
|
|