CDO CreateMHTMLBody блокирует файл в JScript

Я делаю сценарий JScript, который отправляет сообщения электронной почты в формате HTML через CDO. У меня есть шаблон сообщения в файле .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;
}
//-------------------------------------------

Спасибо.


person Olexa    schedule 15.06.2012    source источник


Ответы (1)


Вы пытались программно убить почтовый процесс, а затем удалить файл (если вам не нужна почтовая программа, запущенная после отправки почты)

У вас установлена ​​служба IIS SMTP, возможно, стоит попробовать

СоздатьОбъект("cdonts.НоваяПочта")

or

СоздатьОбъект("outlook.приложение")

Но вам, возможно, придется убить связанный процесс в аналогичной ситуации.

person QVSJ    schedule 15.06.2012