添付ファイルを保存するコードNo.22394
コエンザイムQ10 さん 05/04/05 19:31
 
Iranoanさんのお助けにより、
以下のコードでメールを保存してます。

さらに以下の内容を加えたいです。

・もしメールに添付ファイルがついていたら、
・添付ファイルを同じ名前+”添付”+”そのファイルの拡張子”
 で保存する。

できますでしょうか。ご助言戴きたく。お願いします。

*********************
loaddll"TKinfo.dll";

$a=dllfuncstr("GetMailTransmitDate");
$b1=leftstr($a,4)+"年";

$b2=midstr($a,5,2)+"月";

$b3=midstr($a,8,2)+"日";

$d=dllfuncstr("CurrentHeader","Subject:");

call ChangeCharacter $d, ":", "_";

message $$return;

$c="D:\\"+$b1+$b2+$b3+$$return+ ".doc";
//本番では、ドライブ直下ではなくマイドキュのフォルダに格納してます。

saveas $c;

endmacro;//ここでマクロは終わり。以下は、上記call文で使用しているサブルーチン

ChangeCharacter://buffer 中の文字列を置換
  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      ##long = strlen($$1);
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

[ ]
RE:22394 添付ファイルを保存するコードNo.22395
コエンザイムQ10 さん 05/04/05 19:34
 
>・添付ファイルを同じ名前+”添付”+”そのファイルの拡張子”
> で保存する。

訂正

ファイル名は、
保存メール名(つまり年月+Subject)+”添付”+もともとのファイル名+もともとの
拡張子

という感じで保存したいです。

>Iranoanさんのお助けにより、
>以下のコードでメールを保存してます。
>
>さらに以下の内容を加えたいです。
>
>・もしメールに添付ファイルがついていたら、
>・添付ファイルを同じ名前+”添付”+”そのファイルの拡張子”
> で保存する。
>
>できますでしょうか。ご助言戴きたく。お願いします。
>
>*********************
>loaddll"TKinfo.dll";
>
>$a=dllfuncstr("GetMailTransmitDate");
>$b1=leftstr($a,4)+"年";
>
>$b2=midstr($a,5,2)+"月";
>
>$b3=midstr($a,8,2)+"日";
>
>$d=dllfuncstr("CurrentHeader","Subject:");
>
>call ChangeCharacter $d, ":", "_";
>
>message $$return;
>
>$c="D:\\"+$b1+$b2+$b3+$$return+ ".doc";
>//本番では、ドライブ直下ではなくマイドキュのフォルダに格納してます。
>
>saveas $c;
>
>endmacro;//ここでマクロは終わり。以下は、上記call文で使用しているサブルーチン
>
>ChangeCharacter://buffer 中の文字列を置換
>  ##change_char=strlen($$2);
>  $$string = "";
>  while(1){
>    ##number = strstr($$1, $$2);
>    if(##number == -1)break;
>    else{
>      ##long = strlen($$1);
>      $$string = $$string + leftstr($$1, ##number) + $$3;
>      $$1 = rightstr($$1, ##long - ##number - ##change_char);
>    }
>  }
>  return $$string + $$1;

[ ]
RE:22395 添付ファイルを保存するコードNo.22396
Iranoan さん 05/04/05 20:04
 
 コエンザイムQ10 さん今日は、Iranoan です。
> ファイル名は、
> 保存メール名(つまり年月+Subject)+”添付”+もともとのファイル名+もともとの
> 拡張子
 複数ある場合があるので、注意が必要ですが、ヒントだけ。添付ファイルは、
$s = dllfuncstr("CurrentHeader2", "X-Attach", #i );
で取得できます。

 あと気をつけなければいけないのは、保存場所に同じファイル名が存在した
ときの対処です。ファイルが存在するかは、
if( existfile( $s ) ){//存在するときの処理
で判断できます。
 また削除する場合の例が
http://hidemaruo.dip.jp:81/hidesoft/hidesoft_8/x20558.html#20600
等にあります。
 ##一度、「CurrentHeader2」で過去ログを検索すると良いかも。

[ ]
RE:22396 添付ファイルを保存するコードNo.22397
コエンザイムQ10 さん 05/04/05 20:47
 
>$s = dllfuncstr("CurrentHeader2", "X-Attach", #i );
>で取得できます。

$sにファイルのパスが格納されますね。
このパスをつかって、ファイルを開いて、
その後、そのファイルを保存すればいいはずですが、

これで、オープンファイルをしますが、PDFファイルの添付で試したのですが、開け
ません。「鶴亀では開けない」みたいなエラーがでます。

秀丸マクロは、他のアプリケーションには、
ちょっかいだせないということでしょうか。

Q10

> コエンザイムQ10 さん今日は、Iranoan です。
>> ファイル名は、
>> 保存メール名(つまり年月+Subject)+”添付”+もともとのファイル名+もともとの
>> 拡張子
> 複数ある場合があるので、注意が必要ですが、ヒントだけ。添付ファイルは、
>$s = dllfuncstr("CurrentHeader2", "X-Attach", #i );
>で取得できます。
>
> あと気をつけなければいけないのは、保存場所に同じファイル名が存在した
>ときの対処です。ファイルが存在するかは、
>if( existfile( $s ) ){//存在するときの処理
>で判断できます。
> また削除する場合の例が
>http://hidemaruo.dip.jp:81/hidesoft/hidesoft_8/x20558.html#20600
>等にあります。
> ##一度、「CurrentHeader2」で過去ログを検索すると良いかも。

[ ]
RE:22397 添付ファイルを保存するコードNo.22399
Iranoan さん 05/04/06 00:09
 
 コエンザイムQ10 さん今日は、Iranoan です。
> >$s = dllfuncstr("CurrentHeader2", "X-Attach", #i );
> >で取得できます。
>
> $sにファイルのパスが格納されますね。
 フル・パスにはならないので、注意して下さい。
 この辺りも、先にご紹介した過去ログが参考になると。
> これで、オープンファイルをしますが、PDFファイルの添付で試したのですが、開け
> ません。「鶴亀では開けない」みたいなエラーがでます。
 それは駄目。単に保存したいわけですから、Bypass_CopyFile 関数を使えば
よいです。これは名前の通り Windows 32 API をバイパスしているだけなので、
Google 等で CopyFile で検索すれば、幾らでも使用法がでてきます。
 過去ログだと
http://hidemaruo.dip.jp:81/turukame/turukame_5/x00474.html#484

 P.S http://www.maruo.co.jp/hidesoft/8/x22389_.html の印象から、コエ
ンザイムQ10 さんはヒントを書いておけば、自力で解決されそうなので、不親
切な書き込みになっていますが、悪しからず(^^)。

[ ]
RE:22399 添付ファイルを保存するコードNo.22400
コエンザイムQ10 さん 05/04/06 09:38
 
>ンザイムQ10 さんはヒントを書いておけば、自力で解決されそうなので、不>親切な
>書き込みになっていますが、悪しからず(^^)。

いえいえ、とんでもございません。
自分でコード書かないと勉強になりませんので、
ヒントを戴けるだけで十分です。

ADVありがとうございます。トライしてみます。

[ ]
RE:22400 添付ファイルを保存するコードNo.22401
コエンザイムQ10 さん 05/04/06 10:17
 
>過去ログだと
>→http://hidemaruo.dip.jp:81/turukame/turukame_5/x00474.html#484

これのリンク死んでます。

Windows API の関数を使ったことがありませんので、
どのようにコードを書いているのかが見たいです。

すみません、確認お願いします。

[ ]
RE:22401 添付ファイルを保存するコードNo.22402
こいん さん 05/04/06 10:30
 
コエンザイムQ10<3741xxxxxxxxxxxxxx@maruo.co.jp> wrote:
> >過去ログだと
> >→http://hidemaruo.dip.jp:81/turukame/turukame_5/x00474.html#484
>
> これのリンク死んでます。

生きてます。ファイアウォールで81番ポートをふさいでるせいでは?

[ ]
RE:22402 添付ファイルを保存するコードNo.22403
コエンザイムQ10 さん 05/04/06 11:11
 
>コエンザイムQ10<3741xxxxxxxxxxxxxx@maruo.co.jp> wrote:
>> >過去ログだと
>> >→http://hidemaruo.dip.jp:81/turukame/turukame_5/x00474.html#484
>>
>> これのリンク死んでます。
>
>生きてます。ファイアウォールで81番ポートをふさいでるせいでは?

ううーーーー。そうですか。会社パソで見てますので・・・

それにしても、敷居が高い。NETで調べても、本屋で調べても良く分かりません。す
みません。まじでギブです。

コード的にどう記述するのでしょうか。

変数=Bypass_Copyfile この後に引数としてファイルのパスを書くのでしょうか。

また、鶴亀の変数にはVBAのように(Q10はVBAユーザーです。)ファイルのようなオ
ブジェクトを取れるのでしょうか。$変数の文字列および#変数の数値しか、とれませ
んよね。としたら根本的にコードの書き方が、API関数だと違うのでしょうか。

すみません。
自分でがんばるとか言っておきながら、限界を感じております。

大変申し訳ございませんが、なにとぞ、このド素人に
API関数のコード記述をば、教えて戴けないでしょうか。

[ ]
RE:22401 添付ファイルを保存するコードNo.22404
Iranoan さん 05/04/06 11:45
 
 コエンザイムQ10 さん今日は、Iranoan です。
> >→http://hidemaruo.dip.jp:81/turukame/turukame_5/x00474.html#484
>
> これのリンク死んでます。
 あれ? 繋がるけど???/

 使い方は簡単なので、書いておきますと、
 if( !dllfunc( "Bypass_DeleteFile", "コピー元", "コピー先" ) )message "error";
です。

[ ]
RE:22403 添付ファイルを保存するコードNo.22406
たまがわ さん 05/04/06 12:01
 
 単純に添付ファイルをコピーするだけなら以下のようにかけます。
 あとは、添付ファイルが複数ある時の処理とコピー先のファイルネームを生成する
処理を作る必要がありますね。
 なお、ファイルは「読取り専用属性」になっていますのでご注意を。

loaddll "tkinfo.dll";
$f1 = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + dllfuncs
tr("CurrentHeader", "X-Attach");
$f2 = "d:\\targetname.txt";
#n = dllfunc("Bypass_CopyFile", $f1, $f2);


Iranoanさん、"Bypass_DeleteFile"だとまずいので口出しご容赦を。気づくと思うけ
ど。

[ ]
RE:22406 添付ファイルを保存するコードNo.22407
Iranoan さん 05/04/06 12:16
 
 たまがわさん今日は、Iranoan です。
> Iranoanさん、"Bypass_DeleteFile"だとまずいので口出しご容赦を。気づくと思うけ
> ど。
 ご指摘どうも。
 ##別の場所を C&P してしまいました。

[ ]
RE:22407 添付ファイルを保存するコードNo.22409
コエンザイムQ10 さん 05/04/06 13:17
 
Iranoanさん
たまがわさん

ありがとうございます。
やってみます。

Q10

[ ]
RE:22409 添付ファイルを保存するコードNo.22413
コエンザイムQ10 さん 05/04/06 16:04
 
以下コード書いてみましたが、
やはり、添付ファイルが保存されません。

すみませんが、ADV戴けないでしょうか。

Q10

***********************
loaddll"TKinfo.dll";

//1、まず既存のメールのパスをとる。

$a=dllfuncstr("GetMailTransmitDate");
$b1=leftstr($a,4)+"年";
$b2=midstr($a,5,2)+"月";
$b3=midstr($a,8,2)+"日";

$d=dllfuncstr("CurrentHeader","Subject:");

call ChangeCharacter $d, ":", "_";
//message $$return;

$c="D:\\"+$b1+$b2+$b3+$$return;

message $c;

//2、先にメールを保存

$e=$c + ".txt";

message $e+"で保存します。";
saveas $e;

//3、次に添付を保存する。
//添付ファイルのパスではなく、ファイル名のみ取るコード


$d= dllfuncstr("CurrentHeader", "X-Attach");
$f=midstr($d,19,100);

$g=$c+"_添付ファイル_"+$f;

message $d+"を";
message $g+"で保存します。";

#n = dllfunc("Bypass_CopyFile", $d, $g);

endmacro;
//ここでマクロは終わり。以下は、上記call文で使用しているサブルーチン

ChangeCharacter://buffer 中の文字列を置換
  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      ##long = strlen($$1);
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

[ ]
RE:22413 添付ファイルを保存するコードNo.22416
コエンザイムQ10 さん 05/04/06 19:51
 
完成形には程遠いですが、
ファイルをコピーするAPI関数を使用することが
できました。

loaddll"TKinfo.dll";

$n=dllfuncstr("Bypass_CopyFile","C:\\Documents and Settings\\XXXXXX\\My Docu
ments\\あほ.xls","D:\\ahodesu.doc");

橋頭堡に手が届きました。

Q10

[ ]
RE:22416 添付ファイルを保存するコードNo.22417
コエンザイムQ10 さん 05/04/06 20:22
 
各位

男になりました。

ポイントとしては、

・Copy_file 関数を 文字列関数(下記では$n)で取る。

・CurrentHeader関数でX-Attachを取るときは、
 フルパスではないので、"C:\\TuruKameData\\mail01.XXXX.com\\"
 を加えてフルパスにしてやる。

ということでしょうか。ド素人にて大変でした。
続いて、添付が二つ以上の時を考えます。

以下、小汚いけど完成コード
*******************
loaddll"TKinfo.dll";

//1、まず既存のメールのパスをとる。

$a=dllfuncstr("GetMailTransmitDate");
$b1=leftstr($a,4)+"年";
$b2=midstr($a,5,2)+"月";
$b3=midstr($a,8,2)+"日";

$d=dllfuncstr("CurrentHeader","Subject:");

call ChangeCharacter $d, ":", "_";
//message $$return;

$c="D:\\"+$b1+$b2+$b3+$$return;

message $c;

//2、先にメールを保存

$e=$c + ".txt";

message $e+"で保存します。";
saveas $e;

//3、次に添付を保存する。
//添付ファイルのパスではなく、ファイル名のみ取るコード

$d= "C:\\TuruKameData\\mail01.XXXX.com\\"+dllfuncstr("CurrentHeader", "X-Att
ach");

$f=midstr($d,53,100);

$g=$c+"_添付ファイル_"+$f;

message $d+"を";
message $g+"で保存します。";

$n = dllfuncstr("Bypass_CopyFile", $d, $g);

endmacro;
//ここでマクロは終わり。以下は、上記call文で使用しているサブルーチン

ChangeCharacter://buffer 中の文字列を置換
  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      ##long = strlen($$1);
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

[ ]
RE:22417 添付ファイルを保存するコードNo.22421
Iranoan さん 05/04/07 00:25
 
 コエンザイムQ10 さん今日は、Iranoan です。
 乗りかかった舟なので、気になる点について、書き込みます。
> $d= "C:\\TuruKameData\\mail01.XXXX.com\\"+dllfuncstr("CurrentHeader", "X-Att
> ach");
<snip>
> $n = dllfuncstr("Bypass_CopyFile", $d, $g);
の部分は、末尾の様にするとベターです。やっているのは、
・複数の添付ファイルの対処
・メッセージを出すなら保存のキャンセルが出来るように
・他のアカウントでも実行可能
にしています。

 P.S 今回のように、マクロの質問は長くなる傾向があり、使用しているだけ
のユーザさんがひいてしまうかもしれないので(^^;、今後は
http://www.maruo.co.jp/turukame/2/
にされると良いと思います。
//---------------------------------------------------------------------
$home = dllfuncstr( "HomeDir" ) + dllfuncstr( "CurrentAccount" ) + "\\";
#i = 0;
#j = dllfunc( "CountCurrentHeader", "X-Attach" );
while( #i < #j ){
  $d = dllfuncstr("CurrentHeader2", "X-Attach", #i );
  $g=$c+"_添付ファイル_"+$d;
  question $d+"を\n" + $g + "で保存します。";
  if( result ){
    $d0 = $home + $d;
    #n = dllfunc( "Bypass_CopyFile", $d0, $g);
    message $d0;
    message $g;
  }
  #i = #i + 1;
}

[ ]
RE:22421 添付ファイルを保存するコードNo.22427
コエンザイムQ10 さん 05/04/07 21:44
 
>  $d = dllfuncstr("CurrentHeader2", "X-Attach", #i );

なるほど。複数ある場合は、currentheader2で、引数を入れて、
添付ファイルを指定できるんですね。

ありがとうございます。

[ ]