0

CDO 経由で HTML 形式の電子メール メッセージを送信する JScript スクリプトを作成しています。.html ファイルにメッセージ テンプレートがあり、送信される各メッセージに一意のデータを入れます。そのため、メッセージごとに元の .html ファイルのコピーを作成します。

問題は、メッセージを送信した後、スクリプト内からこの一時ファイルを削除できないことです。どのプロセスがファイルをロックするかを ProcessExplorer で確認しましたが、それは cscript.exe/wscript.exe (スクリプトの実行に使用されているもの) です。

以下は (簡略化された) コードの例です。

//-------------------------------------------
var fso = new ActiveXObject("Scripting.FileSystemObject");
var BodyFileName = fso.GetAbsolutePathName(WScript.Arguments(3));
var BodyExtensionName = fso.GetExtensionName(BodyFileName)
var BodyFile = fso.OpenTextFile(BodyFileName, 1);
var Body = BodyFile.ReadAll();
BodyFile.Close();
//-------------------------------------------
// Replace something in Body here
//-------------------------------------------
BodyFileName = fso.BuildPath(fso.GetParentFolderName(BodyFileName), fso.GetTempName() + "." + BodyExtensionName);
var TmpBodyFile = fso.OpenTextFile(BodyFileName, 2, true);
TmpBodyFile.Write(Body);
TmpBodyFile.Close();
// Here ProcessExplorer shows that the file is closed
//-------------------------------------------
var objEmail = new ActiveXObject("CDO.Message");  
objEmail.From = WScript.Arguments(0);
objEmail.To = WScript.Arguments(1);  
objEmail.Subject = WScript.Arguments(2);  
objEmail.CreateMHTMLBody("file:///" + BodyFileName.replace("\\","/"));
// Here the file is open again
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;  
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.0.1";
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;  
objEmail.Configuration.Fields.Update();  
objEmail.Send();
objEmail = null;
//-------------------------------------------
// The following loop becomes endless
for (;;) {
  try {
    fso.DeleteFile(BodyFileName, true);
  } catch(e) {
    WScript.Sleep(100);
    continue;
  } finally {
  }
  break;
}
//-------------------------------------------

ありがとう。

4

1 に答える 1

0

メールプロセスをプログラムで強制終了してからファイルを削除しようとしましたか(メールを送信した後にメールプログラムを実行する必要がない限り)

IIS SMTP サービスがインストールされていますか?試してみる価値があるかもしれません

CreateObject("cdonts.NewMail")

また

CreateObject("outlook.application")

ただし、同様の状況で関連するプロセスを強制終了する必要がある場合があります。

于 2012-06-15T15:56:24.473 に答える