送信を一度に10通までに制限するにはNo.41040
n'Guin さん 11/07/20 11:13
 
いつもお世話になっております。
ちょっと、お知恵をお借りしたいのです。

私が使用しているレンタルサーバで、下記の制約があります。
マクロ等で、対策がとれないでしょうか。
電車の中などでメールを書いて、ネットにつないだときに、数十通の
メールを出すことがあります。

何らかの設定かマクロで、うまく下記の制約を乗り越えられないでしょうか?

よろしくお願いします。


−−−
弊社共用サーバーでは、SPAM対策の他、大量のメールを処理する際の
負荷の上昇を防ぐ為、同じ接続元からのメールを一度に処理できる数は
10通までに制限させて頂いております。

複数のメールを同時に送信する際は、10通づつ、1秒以上間隔をあけて
送信するようにして頂きますようお願い申し上げます。

[ ]
RE:41040 送信を一度に10通までに制限するNo.41047
秀まるお2 さん 11/07/20 13:40
 
 未送信フォルダに10通以上メールがある場合は1通毎に「今すぐ送信」で送
る、という作戦でどうでしょうか。「今すぐ送信」だと少し時間がかかるので、
それで結果としてゆっくり送信出来てエラーが回避出来ると思います。

 マクロの例は以下の通りです。

-------------------------------------------------------------------
    loaddll "tkinfo.dll";
    #n = dllfunc("GetTransmitCommandCode");
    if( #n == 40216 || #n == 40059 || #n == 40024 ) {
        #mailcount = dllfunc("GetFolderMailCount", "", "未送信");
        if( #mailcount > 10 ) {
            $folder = dllfuncstr("CurrentFolder");
            #n = dllfunc("SelectFolder", "", "未送信");
            while( dllfunc("MailCount") > 0 ) {
                #n = dllfunc("SetMailIndex", 0);
                if( #n == 0 ) {
                    message "メール選択失敗";
                    endmacro;
                }
                #n = dllfunc("OpenMail");
                #n = dllfunc("SendNow");
                if( #n == 0 ) {
                    message "メール送信失敗";
                    endmacro;
                }
                #handle = hidemaruhandle(0);
                #n = dllfunc("SetMainWndTop");
                closehidemaruforced #handle;
            }
            #n = dllfunc("SelectFolder", "", $folder);
        }
    }
-------------------------------------------------------------------

 このマクロを「マクロ・マクロ登録...」の「自動起動」ページの「送受信の
開始直前」の所に登録しておけばいいです。

 もしそれでも送信が速すぎてダメでしたら、ループの中(
closehidemaruforced文の直後とか)に、

    sleep 2000;

 とかのsleep文を入れればいいと思います。2000と指定すると2秒ウェイトが
入ります。

 ウェイト時間を適当に調整すればうまく送信出来ると思います。

[ ]
RE:41047 送信を一度に10通までに制限するNo.41053
n'Guin さん 11/07/21 03:32
 
マクロの例まで掲載していただき、ありがとうございました。
一通ずつ送るという作戦に、気がつきませんでした。
アカウントがたくさんあるので、ご教示いただいたマクロを元に、
検討いたします。

わからないことがでてきたら、またお伺いいたしますので、よろしくお願いいたしま
す。

> 未送信フォルダに10通以上メールがある場合は1通毎に「今すぐ送信」で送
>る、という作戦でどうでしょうか。「今すぐ送信」だと少し時間がかかるので、
>それで結果としてゆっくり送信出来てエラーが回避出来ると思います。

[ ]
RE:41053 送信を一度に10通までに制限するNo.41059
秀まるお2 さん 11/07/21 10:08
 
 参考までに、複数アカウント対応するとしたら以下のようになります。
 (1回しかテストしてませんが)


    loaddll "tkinfo.dll";
    #n = dllfunc("GetTransmitCommandCode");
    if( #n == 40216 || #n == 40059 ) {
        #mailcount = dllfunc("GetFolderMailCount", "", "未送信");
        if( #mailcount > 10 ) {
            $folder = dllfuncstr("CurrentFolder");
            #n = dllfunc("SelectFolder", "", "未送信");
            while( dllfunc("MailCount") > 0 ) {
                #n = dllfunc("SetMailIndex", 0);
                if( #n == 0 ) {
                    message "メール選択失敗";
                    endmacro;
                }
                #n = dllfunc("OpenMail");
                #n = dllfunc("SendNow");
                if( #n == 0 ) {
                    message "メール送信失敗";
                    endmacro;
                }
                #handle = hidemaruhandle(0);
                #n = dllfunc("SetMainWndTop");
                closehidemaruforced #handle;
            }
            #n = dllfunc("SelectFolder", "", $folder);
        }
    } else if( #n == 40024 || #n == 40144 ) {
        //すべて送受信/すべて送信
        $prevaccount = dllfuncstr("CurrentAccount");
        $prevfolder = dllfuncstr("CurrentFolder");
        #i = 0;
        while(1) {
            $account = dllfuncstr("Account", #i);
            if( $account == "" ) {
                break;
            }
            #mailcount = dllfunc("GetFolderMailCount", $account, "未送信");
            if( #mailcount > 10 ) {
                #n = dllfunc("SelectFolder", $account, "未送信");
                while( dllfunc("MailCount") > 0 ) {
                    #n = dllfunc("SetMailIndex", 0);
                    if( #n == 0 ) {
                        message "メール選択失敗";
                        endmacro;
                    }
                    #n = dllfunc("OpenMail");
                    #n = dllfunc("SendNow");
                    if( #n == 0 ) {
                        message "メール送信失敗";
                        endmacro;
                    }
                    #handle = hidemaruhandle(0);
                    #n = dllfunc("SetMainWndTop");
                    closehidemaruforced #handle;
                }
            }
            #i = #i + 1;
        }
        #n = dllfunc("SelectFolder", $prevaccount, $prevfolder);
    }

[ ]
RE:41059 送信を一度に10通までに制限するNo.41076
n'Guin さん 11/07/21 21:28
 
> 参考までに、複数アカウント対応するとしたら以下のようになります。
> (1回しかテストしてませんが)
お忙しいのに、さらにご対応いただき、大変ありがとうございます。
いつもながら、よいサポートをいただき、感謝しております。

暑い夏でもあり、どうかご自愛ください。

[ ]
RE:41059 送信を一度に10通までに制限するNo.41637
n'Guin さん 11/10/10 11:49
 
秀まるおさん、こんにちは

いただいたマクロを登録しておりましたが、有効でないようです。

そこで、ご指導いただいたように、sleep 2000 をいれたのですが、
今度は送信時にエラーが起こるようになりました。

最初にダイアログボックスが表示されます。 何か待っています・・・
といった感じの表現で、キャンセルボタン付きです。 そのままにしておくと、


エディタ上で実行できないTKInfo.dll 呼び出しが行われました。
関数コード=30

ダイアログボックス表示中なので処理できません。
関数コード=8

といった具合で、エラーメッセージが出ます。 ちなみに、Sleep 2000は実行されて
いないように見えます。

どこが悪いのか、よくわかりません。

ご教示いただければ、幸いです。
どうかよろしくお願いします。


> 参考までに、複数アカウント対応するとしたら以下のようになります。
> (1回しかテストしてませんが)

loaddll "tkinfo.dll";
    #n = dllfunc("GetTransmitCommandCode");
    if( #n == 40216 || #n == 40059 || #n == 40024 ) {
        #mailcount = dllfunc("GetFolderMailCount", "", "未送信");
        if( #mailcount > 10 ) {
            $folder = dllfuncstr("CurrentFolder");
            #n = dllfunc("SelectFolder", "", "未送信");
            while( dllfunc("MailCount") > 0 ) {
                #n = dllfunc("SetMailIndex", 0);
                if( #n == 0 ) {
                    message "メール選択失敗";
                    endmacro;
                }
                #n = dllfunc("OpenMail");
                #n = dllfunc("SendNow");
                if( #n == 0 ) {
                    message "メール送信失敗";
                    endmacro;
                }
                #handle = hidemaruhandle(0);
                #n = dllfunc("SetMainWndTop");
                closehidemaruforced #handle;
  sleep 2000;
            }
            #n = dllfunc("SelectFolder", "", $folder);
  }
    }

[ ]
RE:41637 送信を一度に10通までに制限するNo.41638
n'Guin さん 11/10/10 11:58
 
秀まるおさん、こんにちは

>最初にダイアログボックスが表示されます。 何か待っています・・・
>といった感じの表現で、キャンセルボタン付きです。


「他の秀丸メールウィンドウがマクロを終了するのを待っています。」

というダイアログボックスでした。

[ ]
RE:41638 送信を一度に10通までに制限するNo.41643
秀まるお2 さん 11/10/11 11:20
 
 こちらでテストしたら再現しました。秀丸メール自体の問題かもしれません。

 なんとか原因を調べて解決策を考えてみます。

[ ]
RE:41643 送信を一度に10通までに制限するNo.41644
秀まるお2 さん 11/10/11 11:52
 
 マクロがうまく動かない原因ですが、秀丸メールのエディタ・ウィンドウが別
スレッド(ここでいうスレッドとはCPU実行単位としてのスレッド)になってる
せいでして、根本的な解決としては、マルチスレッドでマクロ実行させないよう
にするしか無いという結論になりました。

 (話がややこしくてすみません)

 要するに、エディタを起動するのは全部ダメで、送信の処理をすべて秀丸
メール本体ウィンドウ上でやらないとダメです。それをやるために、以下のよう
にマクロを直してみました。

    loaddll "tkinfo.dll";
    #n = dllfunc("GetTransmitCommandCode");
    if( #n == 40216 || #n == 40059 || #n == 40024 ) {
        #mailcount = dllfunc("GetFolderMailCount", "", "未送信");
        if( #mailcount > 1 ) {
            $folder = dllfuncstr("CurrentFolder");
            #n = dllfunc("SelectFolder", "", "草稿");
            #n = dllfunc("MakeFolder", "$$$temp$$$");
            #n = dllfunc("SelectFolder", "", "未送信");
            #n = dllfunc("SelectAllMail");
            #n = dllfunc("Move", "", "草稿\\$$$temp$$$");
            #n = dllfunc("SelectFolder", "", "草稿\\$$$temp$$$");
            while( dllfunc("MailCount") > 0 ) {
                #n = dllfunc("SetMailIndex", 0);
                if( #n == 0 ) {
                    message "メール選択失敗";
                    endmacro;
                }
                #n = dllfunc("Move", "", "未送信");
                #n = dllfunc("SendRemain");
                if( #n == 0 ) {
                    message "メール送信失敗";
                    endmacro;
                }
                sleep 2000;
            }
            #n = dllfunc("SelectFolder", "", "草稿\\$$$temp$$$");
            if( dllfuncstr("CurrentFolder") == "草稿\\$$$temp$$$" ) {
                #n = dllfunc("DeleteFolder", 1, 0, 0);
            }
            #n = dllfunc("SelectFolder", "", $folder);
        }
    }

 作戦として、草稿フォルダの配下に「$$$temp$$$」っていう一時フォルダを作
成して、一度そこに未送信メールをすべて待避させて、それから1通ずつ未送信
フォルダに移動して「未送信メールの送信」を繰り返すという、そういう処理に
しました。

 これでうまくいくはずだと思います。

 すみませんがこれでテストお願いします。

[ ]
RE:41644 ありがとうございますNo.41666
n'Guin さん 11/10/17 18:03
 
秀まるお様

マクロをありがとうございます。
修正したマクロを現在使用しておりますが、エラーは出ておりません。
しばらく、このまま使用してみます。

>
>    loaddll "tkinfo.dll";
>    #n = dllfunc("GetTransmitCommandCode");
>    if( #n == 40216 || #n == 40059 || #n == 40024 ) {
>        #mailcount = dllfunc("GetFolderMailCount", "", "未送信");
>        if( #mailcount > 1 ) {
(以下、引用略)

ここですが、私がテストのために書き換えていたところです。
正しくは、
         if( #mailcount > 10 ) {
です。
念のため、ご連絡申し上げます。

御礼が遅くなりましたことを、お詫び申し上げます。
ありがとうございました。

[ ]
RE:41666 ありがとうございますNo.41669
秀まるお2 さん 11/10/17 21:30
 
> 正しくは、
>          if( #mailcount > 10 ) {
> です。

 すみません。テストのために書き換えてたのは僕の方でした。(10通で
テストするの大変だったので1通でテストしてました)

[ ]