[ 新規に投稿する ]

送信用メールエディタ起動時マクロで、宛先ドメインに応じて FroNo.00160
emuyama さん 26/07/22 10:45 [ コメントを投稿する ]
いつもありがとうございます。
秀丸メール Ver.7.47(32ビット版)を使用しています。

海外の取引先へ返信・送信する際だけ、差出人の表示名を日本語から英語へ自動的に切り替えたいと考えています。
現在の差出人はアカウント設定で "私の氏名" <example@hoge.co.jp> としています。

実現したい動作は次のとおりです。

・送信用メールエディタ起動時マクロで処理する
・To、Cc、Bcc に含まれるメールアドレスを対象とする
・外部ファイル(EnglishDomains.txt)に記載したドメインと照合する
・一致した場合のみ "私の氏名の英文表記" <example@hoge.co.jp> に From 表示名を変更する
・一致しない場合は何も変更せず、アカウント設定の表示名をそのまま使用する

EnglishDomains.txt の内容は、例えば次のような形式を想定しています(ドメイン名は例です)。

---------------------------
# 英語表示名を使用するドメイン

tesla.com
boeing.com
---------------------------

コメント行(#)と空行は無視し、ドメイン比較では大文字・小文字を区別せず、mail.boeing.com のようなサブドメインも一致とみなしたいと考えています。

そこで質問です。

1. このような用途では、送信用メールエディタ起動時マクロを使用する方法が適切でしょうか。
2. To、Cc、Bcc のメールアドレス取得・解析には、どの関数の使用が推奨されるでしょうか。
3. EnglishDomains.txt を読み込み、1行ずつ比較する場合、推奨される実装方法はあるでしょうか。
4. From の表示名だけを書き換える場合は、SetHeaderUnited(または他の方法)が適切でしょうか。

できれば、推奨される実装方法やサンプルコードをご教示いただけますと大変参考になります。
また、マクロ以外に、より容易または推奨される実現方法がありましたら、そちらもご教示いただけますと幸いです。

よろしくお願いいたします。
[ ]
RE:00160 送信用メールエディタ起動時マクロで、宛先ドメインにNo.00161
秀まるお さん 26/07/22 15:07 [ コメントを投稿する ]
  いくつか案を書かせていただきます。

■1.日本語英語併用作戦

単純に、From:ヘッダの名前に日本語と英語の両方表記作戦があるかとは思います。

From: "斉藤秀夫 (Hideo Saito)" <xxxxx@maruo.co.jp>

みたいにするのがよくある作戦かなぁと思います。

■2.振り分け+テンプレートで切り替える作戦

まず、「設定 - テンプレート/署名の編集」で、新規メール用/返信メール用などそれぞれに英語用のテンプレートも作っておきます。

例えば

$(SetHeader,From,"Hideo Saito <xxxxx@maruo.co.jp>")$-

みたいな命令を埋め込んでテンプレートを用意しておきます。そして、外国の組織から届くメールはそれ用のフォルダに振り分けるようにします。

例えば「テスラ」ってフォルダを作って、@tesla.comからのメールは全部そこに行くようにするとかです。

その「テスト」フォルダを選択して「設定 - フォルダ毎の設定...」の「テンプレート/署名」ページで、先ほど作成したテンプレートを指定する作戦になります。

■3.英語なら英語表記にする作戦

マクロでやるとしたら、ですが、簡単な方法として、メールの件名+本文が全部英語(日本語の文字含まない)ならFrom:ヘッダを書き換える作戦があります。

マクロの例としては、

    loaddll "tkinfo.dll";
    $subject = dllfuncstr("CurrentHeader", "Subject");
    $body = gettext( 0, 0, 0, 9999 );
    $total = $subject + "\n" + $body;
    loaddll "hmjre.dll";
    #n = dllfunc("FindRegular", @"[\x81\x40-\xFC\xFF]", $total, 0);
    if( #n < 0 ) {
        loaddll "tkinfo.dll";
        #n = dllfunc("SetHeader", "From", "Hideo Saito <maruo@mitene.or.jp>");
    }

みたいな割と簡単なマクロになります。こういうマクロを「マクロ - マクロ登録...」の「自動起動」ページの「あとで送信/今すぐ送信時」に登録しておく作戦があります。

■4.ご要望の作戦

ご要望通りの作戦ってことになると、マクロがかなり大変で、正直ある程度プログラミング能力が必要になると思うんですが、一応、サンプルは作ってみました。それを改良してなんとかしてみるといいかなぁと思います。

サンプルは以下の通りです。JavaScriptとかならAIチャットに質問するとなんでも教えてくれるんですが、秀丸マクロについてはAIチャットはあんまりうまく教えてくれないです。

    loaddll "tkinfo.dll";
    $home = dllfuncstr("HomeDir");
    $filename = $home + "EnglishDomains.txt";
    if( !existfile( $filename ) ) {
        message "秀丸メールのデータ用フォルダにEnglishDomains.txtファイルを作成してから実行してください。";
        endmacro;
    }
    $domainlist = dllfuncstr("LoadStringFromFile", $filename);
    $domainlist = dllfuncstr("ToLower", $domainlist);
    $emaillist = dllfuncstr("CurrentHeaderUnited", "To") + "," + dllfuncstr("CurrentHeaderUnited", "Cc") + "," + dllfuncstr("CurrentHeaderUnited", "Bcc");
    #count = dllfunc("CountEmailList", $emaillist);
    #i = 0;
    while( #i < #count ) {
        $email = dllfuncstr("GetEmailList", $emaillist, #i);
        $email = dllfuncstr("SetEmailOnly", $email);
        $email = dllfuncstr("ToLower", $email);
        #x = strstr( $email, "@" );
        if( #x >= 0 ) {
            $domain = midstr($email, #x + 1);

Label_TryFindDomainAgain: ;
            #x = -1;
            while(1) {
                #x = strstr( $domainlist, $domain, #x + 1 );
                if( #x < 0 ) {
                    break;
                }
                if( (#x == 0 || ascii( midstr( $domainlist, #x - 1, 1 ) ) < ' ' )
                 && ascii( midstr( $domainlist, #x + strlen($domain), 1 ) ) < ' ' ) {
                    message "From:の名前を英語にします。";
                    #n = dllfunc("SetHeader", "From", "Hideo Saito <maruo@mitene.or.jp>");
                    endmacro;
                }
            }
            #x = strstr( $domain, "." );
            if( #x >= 0 ) {
                $domain = midstr( $domain, #x + 1 );
                goto Label_TryFindDomainAgain;
            }
        }
        #i = #i + 1;
    }
[ ]

[ 新規に投稿する ]