要望ネタ1:アドレス帳の1エントリーにNo.09607
タケ さん 05/08/10 00:07
 
商標問題で大変な時期に申し訳ないですが、将来のネタとして
扱ってもらえればうれしいです。

要望

  現状のアドレス帳のエントリーは、名前・メールアドレス・備考・
  備考2・備考3・登録日という項目になっていますが、これに
  補助メールアドレス (補助という呼び名はうまくないですが) を
  追加することは可能でしょうか? もしくは、メールアドレスの
  項目にカンマなどで区切って複数のメールアドレスを登録しても
  支障がないようにすることは可能でしょうか?

具体例

  後者の場合を例にしますと...
      エントリーα  xxxxx@example.jp,xxxxx@example.co.jp
      エントリーβ  xxxx@example.jp,xxxx@example.ne.jp
      エントリーγ  xxxxx@example.jp,xxxxx@example.gr.jp
  のように登録できて、受信メールの一覧表示では...
      from: が xxxxx@example.jp   なら、表示は エントリーα
      from: が xxxx@example.ne.jp なら、表示は エントリーβ
  のように表示します。そして送信する際は...
      エントリーα が選択されたら xxxxx@example.jp を使用
      エントリーβ が選択されたら xxxx@example.jp  を使用
  というようにします。

  複数のメールアドレスのうち、受信表示にはすべてのメールアド
  レスを対象とし、送信の際には最初のメールアドレスを使用します。

理由

  携帯から発信されるメールには特定のヘッダを編集できないものが
  あり (少なくともドコモのPDCは)、Reply-to: ヘッダが使えれば
  済む話なのですが、以下のような事例の際に困ったことが、今回の
  要望に至りました。

  「Aさん」は自宅と携帯の2種類のメールアドレスを使用して、
  私のアドレス帳には2つのエントリーが存在します。
      Aさん      xxx@example.jp
      Aさん携帯  bar@k-tai.example.ne.jp

  「Aさん」の方は、以下の理由から必ず foo@... 宛に送ってくれ!!
  と言い、bar@... の方には送ってくれるな!! と言います。
      1. foo@... に届いたメールは bar@... に転送しているので
         わざわざ bar@... に送る必要はない。
      2. すべてのメールを foo@... の方で管理しているので、
         bar@... に送られると困る。
      3. 迷惑メール対策のため bar@... の方は不定期に変更する
         可能性がある。
  実際、bar@... の方はこれまでに1回変更したことがあります。

  問題は「Aさん」がたまに携帯 (bar@...) からメールを送ってくる
  ことがあり、そのメールに私がそのまま返信すると、携帯 (bar@...)
  宛にメールを送ってしまう点です。私としては Reply-to ヘッダを
  付けろよ、とか携帯から送って来るなと主張したいところですが、
  どうやら Reply-to ヘッダを付けることは無理みたいですし、
  「Aさん」も出先からだと携帯に頼るしかないと言いますし...
  あとは私の方で、注意深くメールの発信者が「Aさん」なのか
  「Aさん携帯」なのかを確認するしかないのかなぁ、というのが
  実情です。

  そこで、先の要望の中の例のようにして...
      Aさん   xxx@example.jp,bar@k-tai.example.ne.jp
  と登録することができれば、この問題が解消できると思うのですが
  いかがでしょうか?

余談

  こういった場合、マクロでの解決策もあるかと思い、少し勉強を
  始めたのですが、手がかりになるものがないので手詰まっています。
  実は「Aさん」のように複数のメールアドレスを所持して、携帯に
  転送している人がこの1年くらいで5人ほど増えました。プロバイダ
  での無料メール転送のサービスが当たり前になっているせいなのか
  どうかは分かりませんが、どうせマクロで実現するなら、今後も
  増えていくことを考慮した造りにしたいです。

[ ]
RE:09607 要望ネタ1:アドレス帳の1エンNo.09611
山紫水明 さん 05/08/10 10:26
 
 タケさん,こんにちは。

>  こういった場合、マクロでの解決策もあるかと思い、少し勉強を
>  始めたのですが、手がかりになるものがないので手詰まっています。
>  実は「Aさん」のように複数のメールアドレスを所持して、携帯に
>  転送している人がこの1年くらいで5人ほど増えました。プロバイダ
>  での無料メール転送のサービスが当たり前になっているせいなのか
>  どうかは分かりませんが、どうせマクロで実現するなら、今後も
>  増えていくことを考慮した造りにしたいです。

 自分でもそういう必要がある場合がありますので,ちょっと作ってみました。

//-------HMMChangeAdrs.mac--------------------------------------//
//  宛先アドレスを変更する

loaddll "tkinfo.dll";
if( dllfunc("MailType") != 1 ) endmacro;//返信メールでなければ終了
//**************************************************
//変更するアドレスのセットを並べる,数は限定なし。
//上が受信アドレス,下が送信アドレス

$RootAdrs[1] = "xxxxx@ppp.qqq.jp";
$SendAdrs[1] = "xxx@xxx.yy.jp";

$RootAdrs[2] = "22222@ppp.qqq.jp";
$SendAdrs[2] = "xxx@xxx.yy.jp";

$RootAdrs[3] = "33333@ppp.qqq.jp";
$SendAdrs[3] = "xxx@xxx.yy.jp";

//**************************************************
$from = dllfuncstr( "RootHeader", "From" );
$to = dllfuncstr( "SetEmailOnly", $from );
#i = 1;
while( 1 ) {
    if( $RootAdrs[#i] == "" ) break;
    if($to == $RootAdrs[#i] ) {
        $s = dllfuncstr( "SetHeader", "To", $SendAdrs[#i] );
    }
    #i = #i + 1;
}
endmacro;
//-------------------------------------------------//

 マクロ名は適当につけてください。
 変更したいアドレスを書き込んでください。
 とりあえず,返信メール上で実行してみて,うまくいくようでしたら,「自動
実行の送信用エディタ起動時」に登録してみてください。
 まだ,実験段階で,いろいろ改善すべき点が出てきそうですが,とりあえずテ
ストいただけたら幸いです。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:09607 要望ネタ1:アドレス帳の1エンNo.09615
秀まるお さん 05/08/10 16:23
 
 現状のアドレス帳には、複数メールアドレスをコンマ区切りで登録できるんで
すけど、それは当然ご存じであって、それとは別に、つまり、返信時に自動的に
アドレス変換して欲しいってことですよね。

 ちょっとそれは現状のアドレス帳の拡張ってことでは実現が難しいんじゃない
かと思います。

 しいて対応するなら、とりあえずマクロでってことになってしまいますが…。
簡単な例として、そういう難しいメールアドレスの置換を一気に行うマクロを使
う手もあります。

    replaceall "bar@k-tai.example.ne.jp", "xxx@example.jp", word;

 みたいな感じで置換するマクロを作成して、それを「あとで送信/今すぐ送信
時」に登録しておくという作戦です。

 他には、これら特別なメールアドレスを強調表示の一覧に追加しておくという
手もあります。

 その辺で解決して欲しい所です。

[ ]
RE:09615 要望ネタ1:アドレス帳の1エンNo.09620
タケ さん 05/08/10 22:22
 
山紫水明さん、秀まるおさん
ありがとうございます。

実は、おふたかたのマクロサンプルを拝見する前に、マクロライブラリ
を覗いてみて山紫水明さんの「スポンサー欄などの定型行を削除する
マクロ」が参考になりそうだと思いました。このマクロを見て考えた
のは、受信後に From を書き換える方法でした。これだとアドレス帳
に余計なエントリー (先の「Aさん携帯」) を用意する必要がない
ので (マクロ側に From 変換テーブルは必要)、このマクロをベースに
して初のマクロ作成に取り組み始めたところです。

その後、おふたかたのサンプルを見て、送信時に To を書き換える
方法もあるのだと認識しました。少し悩んだのですが、途中で投げ
出すのもなんなので、とりあえず受信後に From を書き換える方法で
(自信はないですが) 進めていこうと思います。

余談
マクロヘルプのキーワード検索で endmacro や readonlyswtich が
出てこないようです。

[ ]
RE:09620 要望ネタ1:アドレス帳の1エンNo.09622
山紫水明 さん 05/08/10 23:12
 
 タケさん,こんばんは。

>その後、おふたかたのサンプルを見て、送信時に To を書き換える
>方法もあるのだと認識しました。少し悩んだのですが、途中で投げ
>出すのもなんなので、とりあえず受信後に From を書き換える方法で
>(自信はないですが) 進めていこうと思います。

 ともかく,自分なりの方針で書けるようでしたら,それが最善でしょう。がん
ばってください。

>マクロヘルプのキーワード検索で endmacro や readonlyswtich が
>出てこないようです。

 秀丸エディタのマクロヘルプには両方ともありますよ。

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:09622 要望ネタ1:アドレス帳の1エンNo.09631
タケ さん 05/08/14 05:00
 
>>マクロヘルプのキーワード検索で endmacro や readonlyswtich が
>>出てこないようです。
>
> 秀丸エディタのマクロヘルプには両方ともありますよ。

ありがとうございます。秀丸メールのマクロ作成のためには、秀丸メールの
マクロヘルプと秀丸エディタのマクロヘルプを両方見ないと駄目なんですね。
ちょっと悩ましいとこです。というのは、一方のマクロヘルプを開いた状態で
もう一方のマクロヘルプを開こうとすると、最初に開いていたマクロヘルプが
閉じてしまうんです。両方開いて同時に見ようとするにはコツが要るようです。

ところでマクロの方ですが、いろいろと参考にして↓こんな感じになりました。
気になる点が2点ほどありますが、しばらくこれで様子見したいと思います。

  - IsHidemaruMailMain を使っていますが、自分自身 4.50 以前の秀丸メール
    を使う予定はないので敢えてこれを使ってます。
  - 変換アドレスを実際に変更する際、strstr 関数を使用している関係で
    単語単位での変換を行っていません。その辺で誤動作する可能性があり
    ますが、自身の用途では問題にならないので、そのままにしています。


//////////////////////////////////////////////////////////////////////
// AdrTrans.mac : アドレス変換マクロ for 秀丸メール
//
// $Id$
//
// From/To/Cc ヘッダ中のメールアドレスを変換テーブルをもとにして変換
// します。自動起動時 (受信直後) は新着メール、手動起動時はカレント
// フォルダの全メールが変換の対象となります。受信直後以外の自動起動時
// は何もしません。

loaddll "tkinfo.dll";


//////////////////////////////////////////////////////////////////////
// 変換テーブル

// 変換元アドレス ($org_addr) と変換先アドレス ($new_addr) を記述します。
$org_addr[0] = "bar@k-tai.example.ne.jp";  $new_addr[0] = "xxx@example.jp";
$org_addr[1] = "org.domain";               $new_addr[1] = "new.domain";


//////////////////////////////////////////////////////////////////////
// メインルーチン

// デバッグ設定 (0: 通常、1: デバッグ)
#debug = 0;
debuginfo #debug;

// マクロ起動要因の取得
#reason = dllfunc("ReasonMacroStarted");
debuginfo "#reason = " + str(#reason);

// 自動起動 (受信直後)?
if (#reason == 3)
{
    // 自動起動時:新着メールがあれば、それを対象にアドレス変換を実施
    if (dllfunc("RecvMailCount") > 0)
    {
        call TranslateAddress 1;
    }
}

// 手動起動?
if (#reason == 0)
{
    // 手動起動時:本体ウィンドウ以外での処理は不可
    if (!dllfunc("IsHidemaruMailMain"))
    {
        message "このマクロは本体ウィンドウ上で起動してください。";
        goto Exit;
    }

    // 手動起動時:送受信中は処理を中止
    if (dllfunc("IsTransmitting"))
    {
        #n = dllfunc("SetAutoPushTimer", 2, "ok");
        message "送受信中です。アドレス変換の処理を中止します。";
        goto Exit;
    }

    // 手動起動時:カレントフォルダの全メールを対象にアドレス変換を実施
    call TranslateAddress 0;
}

// 処理終了
Exit: endmacro;


//////////////////////////////////////////////////////////////////////
// アドレス変換ルーチン

TranslateAddress:
    // 引数の取得 (1: 自動起動、0: 手動起動)
    ##auto = ##1;
    debuginfo "##auto = " + str(##auto);

    // 前処理 (状態の保存など)
    if (!#debug) #n = dllfunc("DisableDraw");
    ##thread  = dllfunc("IsThreadView");
    $$account = dllfuncstr("CurrentAccount");
    $$folder  = dllfuncstr("CurrentFolder");

    // 変換テーブルのスキャン
    ##index = 0;
    while (($org_addr[##index] != "") && ($new_addr[##index] != ""))
    {
        debuginfo "$org_addr[" + str(##index) + "] = " + $org_addr[##index];
        debuginfo "$new_addr[" + str(##index) + "] = " + $new_addr[##index];
        $org = $org_addr[##index];
        $new = $new_addr[##index];

        if ($org != $new)
        {
            // 変換対象メールの検索準備
            $$find = "(\"" + $org + "\", target=from+to, word)";
            if (##auto)
            {
                // 自動起動時:検索対象は全フォルダの新着&未読メール
                #n = dllfunc("SelectFolder", dllfuncstr("Account", 0), "");
                $$find = $$find + ", inmail=3, subfolder=1, flag=hot&unread";
            }
            else
            {
                // 手動起動時:検索対象はカレントフォルダの全メール
                #n = dllfunc("SetThreadView", 0);
                #n = dllfunc("SetMailIndex", 0);
                $$find = $$find + ", inmail=0, subfolder=0";
            }

            // 変換対象メールの検索と置換
            #n = dllfunc("SetFindPack", $$find);
            while (1)
            {
                if (!dllfunc("FindDownInclude")) break;

                // From/To/Cc ヘッダ中のメールアドレスの置換
                #n = dllfunc("BeginEditMail");
                call ReplaceHeader "From";
                call ReplaceHeader "To";
                call ReplaceHeader "Cc";
                #n = dllfunc("SaveEditMail", 0, 0);

                #n = dllfunc("SetViewAreaFoundBefore");
                if (!dllfunc("NextPrevCustom", "", "down", "", "")) break;
            }
        }

        ##index = ##index + 1;
    }

    // 後処理 (状態の復帰など)
    #n = dllfunc("SelectFolder", $$account, "");
    #n = dllfunc("SelectFolder", $$account, $$folder);
    #n = dllfunc("SetThreadView", ##thread);
    #n = dllfunc("EnableDraw");
return;

ReplaceHeader:
    // 引数の取得 (ヘッダ名)
    $$header = $$1;
    debuginfo "$$header = " + $$header;

    ##index = 0;
    while (1)
    {
        $$str = dllfuncstr("CurrentHeader2", $$header, ##index);
        if ($$str == "") break;
        debuginfo "$$str.org = " + $$str;

        while (1)
        {
            ##ptr = strstr($$str, $org);
            if (##ptr < 0) break;
            $$left  = leftstr($$str, ##ptr);
            $$right = rightstr($$str, strlen($$str) - strlen($org) - ##ptr);
            $$str = $$left + $new + $$right;
        }

        debuginfo "$$str.new = " + $$str;
        #n = dllfunc("SetHeader", $$header, $$str, ##index);
        ##index = ##index + 1;
    }
return;

[ ]