Outlook365からインポートしたメールのスNo.11622
こさく さん 23/08/09 11:50
 
お世話になっております。こさくと申します。
現在、Outlook365から「OutlookExportTool.exe」を使いマクロを駆使してインポー
トして秀丸メールでメールの管理をしています。
その節は大変お世話になりました。
そして今表題の件で困っていますので相談させていただく次第です。

秀シリーズサポートフォーラムをメール受信で読んでいるのですが自動でスレッドが
繋がりません。
スレッド関連は私の調べた限り「どうにかして繋げる」設定をしているつもりです。
なのですが例えば次の件名繋がりません。以下の件名は実在しますが本件とは無関係
です。
元メール:「hidesoft.8:11618| 秀丸メール・・・」
次メール:「hidesoft.8:11619| RE 11618 秀丸メール」
そもそも「Message-Id:」「References:」が無いからムリなのかも知れませんが件名
だけで接続出来るような手段はないでしょうか?

インポートされたメールを見る限り接続のヒントになりそうなヘッダは「Subject:」
だけです。

以下環境です
Windows 10 Pro 22H2 64Bit
秀丸エディタ:Ver9.25Beta5 64
秀丸メール:Ver7.20Beta10 64

以上よろしくお願いします。

[ ]
RE:11622 Outlook365からインポートしたメNo.11623
秀まるお2 さん 23/08/09 14:00
 
 コミュニテックスから配信されたメールのスレッドをつながるだけであれば、Subj
ect:ヘッダから無理矢理Message-Id:ヘッダやReferences:ヘッダを生成する方法でス
レッドをつなげることは可能かとは思います。マクロでなんとか出来るとは思います。

 他のメールについてはどうしようもならないですけども。

 とりあえず、OutlookExportTool.exeとは別の方法で移行させる作戦はダメでしょ
うか。今ちょっとネット検索したら、まずはOutlookからThunderbirdへ移行させる話
がありました。

    https://dajya-ranger.com/software/explanation-outlook-to-thunderbird/

 それの他にもネット検索したら、

   Google Workspace Migration for Microsoft Outlook(通称GWMMO)

 ってツールがあって、これを使うとOutlookのメールをGmailへ移行させることが出
来るような話です。

 参照:
  https://www.yoshidumi.co.jp/collaboration-lab/migration-from-outlook-to-gmail#63ff661310f89b19265c2043-1677682333931

 Gmailに移行できれば、秀丸メールからIMAP経由で受信すれば秀丸メールにも移行
できます。

 そういう作戦でどうでしょうか。

 マクロで無理矢理ヘッダを生成するとしたら、それ用のマクロは僕の方でトライし
てみてもいいです。ヘッダの生成ロジックは僕なら分かるので。(件名とDate:ヘッ
ダから生成可能です)

[ ]
RE:11623 Outlook365からインポートしたメNo.11625
秀まるお2 さん 23/08/09 14:16
 
 そのまんま「Email Converter」っていうのもあるようです。

 http://www.emailconverter.recoverydeletedfiles.com/

 OutlookのPSTファイルから、秀丸メールなどでインポートできるeml形式ファイル
へ変換できると書いてあります。無料だと、1フォルダにつき50通のメールまでし
か変換できない制限があるようです。50通ずつフォルダに分けてやれば無料でもな
んとか出来るかもしれません。

[ ]
RE:11623 Outlook365からインポートしたメNo.11626
秀まるお2 さん 23/08/09 14:18
 
 もう1つ製品がありました。

    https://www.sysinfotools.com/recovery/email-converter.php

 こちらはトライアル版での制限として、1つのPSTファイルから25通までしか変換
できないとのことです。

[ ]
RE:11623 Outlook365からインポートしたメNo.11627
こさく さん 23/08/09 14:50
 
どうもありがとうございます。
当時(と言っても数ヶ月前ですが)色々試して今の形に落ち着いたのですが他の方法も
試してみます。

>他のメールについてはどうしようもならないですけども。
件数が多いのは、コミュニテックスから配信メールで他のメールはどうにか手動で繋
げています。
マクロでお願いするのは最後の手段としてみます。

いくつか提案していただいたので時間を作って試してみようと思います。
試行錯誤してシックリ来なかった場合はマクロ作成のお願いさせていただきます。

どうもありがとうございました。

[ ]
RE:11627 Outlook365からインポートしたメNo.11628
秀まるお2 さん 23/08/09 14:56
 
 とりあえずコミュニテックスのメールを連結するだけのマクロを試しに今作ってま
す。うまく出来たらアップロードさせていただきます。少々お待ちください。

[ ]
RE:11623 Outlook365からインポートしたメNo.11631
こさく さん 23/08/09 17:21
 
お世話になります。こさくです。
ご助言ありがとうございます。

>   Google Workspace Migration for Microsoft Outlook(通称GWMMO)
> ってツールがあって、これを使うとOutlookのメールをGmailへ移行させることが
>出来るような話です。
> Gmailに移行できれば、秀丸メールからIMAP経由で受信すれば秀丸メールにも移行
>できます。
> そういう作戦でどうでしょうか。
これをやってみました。
少し悩みましたが、多分受信動作が出来るようになったのではないかと思います。
確認なのですが、GWMMO は一度設定してしまえば何もしなくて良いのでしょうか?
Outlookの受信トレイに新着メールがある状態で秀丸メールで受信動作をしても「受
信したメールはありませんでした」で終わります。
毎回GWMMOの起動が必要になると操作が煩雑なので「OutlookExportTool.exe」に軍配
が上がります。

また受信動作後に案配が悪いことがあります。
To/Fromヘッダに "漢字名" <xxxxxxxx@abc.com> の様な形式が書かれていると漢字
名部分が化けてしまいます。
そしてそれが原因か判りませんがコミュニテックス配信メールのスレッドが繋がりま
せんでした。

その他の変換ツールを使用する方法はいずれも私には使い勝手が「OutlookExportToo
l.exe」に優りませんでした。

以上試行錯誤した結果です。

---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:11631 Outlook365からインポートしたメNo.11632
秀まるお2 さん 23/08/09 17:31
 
 Googleさんのツールをもってしても同じ結果(スレッドがつながらない)というこ
とは、PSTファイル(およびOutlook)の仕組み的にReferences:ヘッダなど、取得で
きないヘッダが多々あるのかなぁと思います。

 マクロはまだ作成中です。少々お待ちください。

[ ]
RE:11632 Outlook365からインポートしたメNo.11635
秀まるお2 さん 23/08/09 18:27
 
 マクロ作ってみました。

 対象メールを特定のフォルダに入れて、そのフォルダを選択して実行してもらう形
のマクロになります。フォルダの中のすべてのメールをチェックして必要なら改変し
ます。

 改変したメールには改変マークのアイコンが付くので、後で「すべて選択」してか
ら「メールのプロパティ」を実行して、そこで「改変」のチェックをOFFにしてOKし
て改変マークを消してもらえれば大丈夫です。

 マクロがちゃんと動くかどうか自信が無いので、マクロ実行前に実行対象フォルダ
の中のメールだけでもバックアップ取っておいてもらった方がいいです。特に1回目
は。


----------------------------------------------------------------------------
------------------------------
//hidesoftフォーラムおよびturukameフォーラムから配信されたメールにmessage-id
ヘッダを付けるマクロ。
    loaddll "tkinfo.dll";
    #n = dllfunc("AutoRestoreFindPack");

    question "このマクロは現在選択してるフォルダの中のすべてのメールについて、
hidesoftフォーラムまたはturukameフォーラムのMessage-Id:ヘッダおよびReference
s:ヘッダ書き換えを行います。実行してもいいですか?";
    if( result != yes ) {
        endmacro;
    }

    #count = dllfunc("MailCount");
    if( #count == 0 ) {
        endmacro;
    }
    #n = dllfunc("SetThreadView", 0);       //一覧表示にする。
    #n = dllfunc("SetSortMethod", 3);       //Date:ヘッダ順にする。

    question "最初にMessage-Idを書き換えます。";
    if( result != yes ) {
        endmacro;
    }
    #i = 0;
    while( #i < #count) {
        #n = dllfunc("SetMailIndex", #i);
        call SetMessageId;
        #i = #i + 1;
    }
    question "References:ヘッダを書き換えます。";
    if( result != yes ) {
        endmacro;
    }
    #i = 0;
    while( #i < #count) {
        #n = dllfunc("SetMailIndex", #i);
        call SetReferences;
        #i = #i + 1;
    }
    message "終了";
    endmacro;

SetMessageId:
    $$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
        return;
    }
    ##x = 0;
    $$subject = dllfuncstr("CurrentHeader", "Subject");
    if( leftstr($$subject, 9) == "hidesoft."
     || leftstr($$subject, 9) == "turukame." ) {
        //OK
    } else {
        return;
    }
    ##councilNo = val( midstr( $$subject, 9 ) );
    if( ##councilNo <= 0 ) {
        return;
    }
    ##x = strstr( $$subject, ":" );
    if( ##x < 0 ) {
        return;
    }
    $$speechNo = midstr( $$subject, ##x + 1, 5 );
    //message str(##councilNo) + " - " + $$speechNo;
    $$date = dllfuncstr("FormatDate", dllfuncstr("CurrentHeader", "Date"), "
YYMMDD" );
    //message $$date;
    $$messageid = "<" + leftstr($$subject, 8) + "_" + str(##councilNo) + "_"
 + $$speechNo + "_" + $$date + "@maruo.co.jp>";

    $$prev = dllfuncstr("CurrentHeader", "Message-Id");
    if( $$prev == $$messageid ) {
        return;
    }
    if( $$prev != "" ) {
        question "既存のMessage-IDが想定してるのと違います。書き換えますか?\n"
            + "既存のMessage-Id: " + $$prev + "\n"
            + "正しいMessage-Id: " + $$messageid;
        if( result == no ) {
            return;
        }
    }
    ##n = dllfunc("BeginEditMail", 0, 0);
    ##n = dllfunc("SetHeader", "Message-Id", $$messageid);
    ##n = dllfunc("SaveEditMail", 0, 0);
    return;


SetReferences:
    $$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
        return;
    }
    ##x = 0;
    $$subject = dllfuncstr("CurrentHeader", "Subject");
    if( leftstr($$subject, 9) == "hidesoft."
     || leftstr($$subject, 9) == "turukame." ) {
        //OK
    } else {
        return;
    }
    ##councilNo = val( midstr( $$subject, 9 ) );
    if( ##councilNo <= 0 ) {
        return;
    }
    ##x = strstr( $$subject, ":" );
    if( ##x < 0 ) {
        return;
    }
    $$speechNo = midstr( $$subject, ##x + 1, 5 );
    ##speechNo = val($$speechNo);
    $$re = midstr( $$subject, ##x + 1 + 5, 5 );
    if( $$re != "| RE " ) {
        //返信メールじゃない
        return;
    }
    $$rootNo = midstr( $$subject, ##x + 1 + 5 + 5, 5 );
    ##rootNo = val($$rootNo);
    if( ##rootNo <= 0
     || ##rootNo >= ##speechNo ) {
        //おかしい
        return;
    }

    $$find = leftstr($$subject, 9) + str(##councilNo) + ":" + $$rootNo + "|";
    ##index = dllfunc("MailIndex");
    ##n = dllfunc("SetFindPack", "(\"" + $$find + "\", target=subject), hili
ght=0" );
    ##n = dllfunc("FindUp");
    if( ##n == 0 ) {
        //返信元見つからず
        ##n = dllfunc("SetMailIndex", ##index);     //元のメールに戻す。
        return;
    }
    $$rootid = dllfuncstr("CurrentHeader", "Message-Id" );
    ##n = dllfunc("SetMailIndex", ##index);     //元のメールに戻す。

    $$prev = dllfuncstr("CurrentHeader", "References");
    if( $$prev == $$rootid ) {
        return;
    }
    if( $$prev != "" ) {
        question "既存のReferences:ヘッダが想定してるのと違います。書き換え
ますか?\n"
            + "既存のReferences: " + $$prev + "\n"
            + "正しいReferences: " + $$rootid;
        if( result == no ) {
            return;
        }
    }
    ##n = dllfunc("BeginEditMail", 0, 0);
    ##n = dllfunc("SetHeader", "References", $$rootid);
    ##n = dllfunc("SetHeader", "In-Reply-To", $$rootid);
    ##n = dllfunc("SaveEditMail", 0, 0);
    return;

[ ]
RE:11635 Outlook365からインポートしたメNo.11656
こさく さん 23/08/17 09:37
 
こさくです。
確認が遅くなり申し訳ありません。マクロどうもありがとうございました。

試して見ましたが残念ながらスレッドは繋がりませんでした。
随所にダイアログが出たので動作の様子と共に記載します。

以下手順と様子です。
対象のフォルダをコピー(hidesoft.8) およそ300通
コピー先のフォルダを選択(フォルダ名:bbb)
マクロ起動
「このマクロは現在選択している・・・実行してもいいですか?」ダイアログで「は
い」クリック
「最初にMessage-idを書き換えます。」ダイアログで「はい」クリック
全てのメールをチェックしている様子
「References:ヘッダを書き換えます」ダイアログで「はい」クリック
全てのメールをチェックしている様子
「終了」ダイアログで「OK」クリック

これまで手動でスレッド接続されていたメールはそのまま繋がっていますが新規に受
信したメールはマクロ前後で
ヘッダ内容に変化は有りませんでした。

インポート後の全てのヘッダ表示の内容です。
From:     "bbsmailrecv@maruo.co.jp" <xxxxxxxxxxx@maruo.co.jp>
To:       "個人名\" <Outlookのおまじないのような文字列>
Subject:  hidesoft.8:11654| RE 11653 送信済みファイルと名前を変更したフォル
ダが復活
X-TuruKame-Error: Error at Base64 decoding
Date:     Wed, 16 Aug 2023 19:35:14 +0900
Content-Type: text/plain; charset=iso-2022-jp (original=UTF-8)
Content-Transfer-Encoding: BASE64
Importance: Normal
X-ReceivedTime: 2023/08/16 19:41:53


自分でもマクロ内容を読み解いてみます。
以上よろしくお願いします。

---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:11635 Outlook365からインポートしたメNo.11659
こさく さん 23/08/17 15:48
 
こさくです。

頂いたマクロを見てみました。
インポートしたメールには"Reply-To"がないのでそこで処理を終了していました。
Message-idはこの判定を除くことでそれらしい内容が書かれました。

SetReferences:も先頭は同様で"Reply-To"の処理を除きましたが、##n = dllfunc("F
indUp");で
##nが0となり返信元が見つからない結果になりました。
message $$find; で検索文字を確認すると見つかるはずの文字列でした。
##n = dllfunc("FindUp"); で検索していますが、ヒットするはずのメールは選択中
メールのすぐ上にあります。

お手数ですがお時間のあるときに確認していただければ幸いです。

以上よろしくお願いします。

[ ]
RE:11659 Outlook365からインポートしたメNo.11661
こさく さん 23/08/17 17:47
 
お世話になります。こさくです。

検索の個所を色々いじってみましたが変化ありませんでした。
そこでマクロではなくて、秀丸メール本体の「検索(S)」-「検索(F)...」でやってみ
ました。

検索条件は以下の通り
検索文字列:hidesoft.8:11636|
対象:件名
その他チェック:なし
検索範囲:ここが「メール内」になっていました。
このダイアログで「一覧内」に変更して再度マクロを実行したところ期待した動作に
なりました。

SetFindPack 文に inmail=0, を追加しました。

これで暫く様子を見て見ます。


[ ]
RE:11661 Outlook365からインポートしたメNo.11663
秀まるお2 さん 23/08/17 18:31
 
 マクロですが、とりあえず手元で、

    $$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
        return;
    }

 の所(2つある)をコメントアウトして、

    //$$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    //if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
    //  return;
    //}

 のようにしたら、少なくとも連絡いただいたサンプルメールの書き換えには成功し
ました。

 同じ箇所が2つあるので、両方とも削除またはコメントアウトしないといけないで
す。

 どうでしょうか。

 Message-Idの書き換えは成功すると思いますが、もしReferences:の書き換えがう
まくいかない場合は、スレッド的につながる2通のメールのサンプルか、出来ればも
っと50〜100通くらいメールを「添付ファイルとして転送」で"maruo@mitene.or.
jp"宛てに送ってほしいです。それでこちらで動作確認できると思います。

----------------------------------------------------------------------------
--------------

//hidesoftフォーラムおよびturukameフォーラムから配信されたメールにmessage-id
ヘッダを付けるマクロ。
    loaddll "tkinfo.dll";
    #n = dllfunc("AutoRestoreFindPack");

    question "このマクロは現在選択してるフォルダの中のすべてのメールについて、
hidesoftフォーラムまたはturukameフォーラムのMessage-Id:ヘッダおよびReference
s:ヘッダ書き換えを行います。実行してもいいですか?";
    if( result != yes ) {
        endmacro;
    }

    #count = dllfunc("MailCount");
    if( #count == 0 ) {
        endmacro;
    }
    #n = dllfunc("SetThreadView", 0);       //一覧表示にする。
    #n = dllfunc("SetSortMethod", 3);       //Date:ヘッダ順にする。

    question "最初にMessage-Idを書き換えます。";
    if( result != yes ) {
        endmacro;
    }
    #i = 0;
    while( #i < #count) {
        #n = dllfunc("SetMailIndex", #i);
        call SetMessageId;
        #i = #i + 1;
    }
    question "References:ヘッダを書き換えます。";
    if( result != yes ) {
        endmacro;
    }
    #i = 0;
    while( #i < #count) {
        #n = dllfunc("SetMailIndex", #i);
        call SetReferences;
        #i = #i + 1;
    }
    message "終了";
    endmacro;

SetMessageId:
    //$$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    //if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
    //  return;
    //}
    ##x = 0;
    $$subject = dllfuncstr("CurrentHeader", "Subject");
    if( leftstr($$subject, 9) == "hidesoft."
     || leftstr($$subject, 9) == "turukame." ) {
        //OK
    } else {
        return;
    }
    ##councilNo = val( midstr( $$subject, 9 ) );
    if( ##councilNo <= 0 ) {
        return;
    }
    ##x = strstr( $$subject, ":" );
    if( ##x < 0 ) {
        return;
    }
    $$speechNo = midstr( $$subject, ##x + 1, 5 );
    //message str(##councilNo) + " - " + $$speechNo;
    $$date = dllfuncstr("FormatDate", dllfuncstr("CurrentHeader", "Date"), "
YYMMDD" );
    //message $$date;
    $$messageid = "<" + leftstr($$subject, 8) + "_" + str(##councilNo) + "_"
 + $$speechNo + "_" + $$date + "@maruo.co.jp>";

    $$prev = dllfuncstr("CurrentHeader", "Message-Id");
    if( $$prev == $$messageid ) {
        return;
    }
    if( $$prev != "" ) {
        question "既存のMessage-IDが想定してるのと違います。書き換えますか?\n"
            + "既存のMessage-Id: " + $$prev + "\n"
            + "正しいMessage-Id: " + $$messageid;
        if( result == no ) {
            return;
        }
    }
    ##n = dllfunc("BeginEditMail", 0, 0);
    ##n = dllfunc("SetHeader", "Message-Id", $$messageid);
    ##n = dllfunc("SaveEditMail", 0, 0);
    return;


SetReferences:
    //$$replyto = dllfuncstr("CurrentHeader", "Reply-To");
    //if( strstr( $$replyto, "@maruo.co.jp" ) < 0 ) {
    //  return;
    //}
    ##x = 0;
    $$subject = dllfuncstr("CurrentHeader", "Subject");
    if( leftstr($$subject, 9) == "hidesoft."
     || leftstr($$subject, 9) == "turukame." ) {
        //OK
    } else {
        return;
    }
    ##councilNo = val( midstr( $$subject, 9 ) );
    if( ##councilNo <= 0 ) {
        return;
    }
    ##x = strstr( $$subject, ":" );
    if( ##x < 0 ) {
        return;
    }
    $$speechNo = midstr( $$subject, ##x + 1, 5 );
    ##speechNo = val($$speechNo);
    $$re = midstr( $$subject, ##x + 1 + 5, 5 );
    if( $$re != "| RE " ) {
        //返信メールじゃない
        return;
    }
    $$rootNo = midstr( $$subject, ##x + 1 + 5 + 5, 5 );
    ##rootNo = val($$rootNo);
    if( ##rootNo <= 0
     || ##rootNo >= ##speechNo ) {
        //おかしい
        return;
    }

    $$find = leftstr($$subject, 9) + str(##councilNo) + ":" + $$rootNo + "|";
    ##index = dllfunc("MailIndex");
    ##n = dllfunc("SetFindPack", "(\"" + $$find + "\", target=subject), hili
ght=0" );
    ##n = dllfunc("FindUp");
    if( ##n == 0 ) {
        //返信元見つからず
        ##n = dllfunc("SetMailIndex", ##index);     //元のメールに戻す。
        return;
    }
    $$rootid = dllfuncstr("CurrentHeader", "Message-Id" );
    ##n = dllfunc("SetMailIndex", ##index);     //元のメールに戻す。

    $$prev = dllfuncstr("CurrentHeader", "References");
    if( $$prev == $$rootid ) {
        return;
    }
    if( $$prev != "" ) {
        question "既存のReferences:ヘッダが想定してるのと違います。書き換え
ますか?\n"
            + "既存のReferences: " + $$prev + "\n"
            + "正しいReferences: " + $$rootid;
        if( result == no ) {
            return;
        }
    }
    ##n = dllfunc("BeginEditMail", 0, 0);
    ##n = dllfunc("SetHeader", "References", $$rootid);
    ##n = dllfunc("SetHeader", "In-Reply-To", $$rootid);
    ##n = dllfunc("SaveEditMail", 0, 0);
    return;

[ ]
RE:11663 Outlook365からインポートしたメNo.11665
こさく さん 23/08/18 09:27
 
こさくです。
ご確認ありがとうございます。

hidesoft.8:11661| RE 11659 で書いたように

##n = dllfunc("SetFindPack", "(\"" + $$find + "\", target=subject), inmail=0,
 hilight=0" );
としたら期待した動作になりました。

『inmail=0,』を追加しています。
これでまた快適になりますます離れられなくなりました。

今後ともよろしくお願いします。どうもありがとうございました。

[ ]