Не генерируйте файл на диске, вместо этого отправляйте почту с данными в памяти

У меня есть кусок кода, который работает и делает:

Читает базу данных, читает шаблон (template.htm), помещает данные в новый файл на основе шаблона (evento.htm), читает этот файл и отправляет электронное письмо с содержимым сгенерированного файла. Код ниже (я вырезал часть базы данных):

<%
    NomeDoTemplate= "template.htm"
    CaminhoDoTemplate= Server.MapPath(NomeDoTemplate)
    CaminhoDoTemplateAjustado= Mid(CaminhoDoTemplate,1,InStrRev(CaminhoDoTemplate,"\"))
    NomeDoArquivo= "evento.htm"
    CaminhoDoArquivo= Server.MapPath(NomeDoArquivo)

    Set ManipulacaoDeArquivo= Server.CreateObject("Scripting.FileSystemObject")
    Set ObjetoArquivo= ManipulacaoDeArquivo.OpenTextFile(CaminhoDoTemplate, 1)
    DadosDoObjetoArquivo= ObjetoArquivo.ReadAll
    ObjetoArquivo.Close

    DadosDoObjetoArquivo= Replace(DadosDoObjetoArquivo, "[Cliente]", Um)

    Set ObjetoArquivo= ManipulacaoDeArquivo.CreateTextFile(CaminhoDoTemplateAjustado & NomeDoArquivo)
    ObjetoArquivo.Write(DadosDoObjetoArquivo)

    Set ObjetoArquivo= ManipulacaoDeArquivo.OpenTextFile(CaminhoDoTemplateAjustado & NomeDoArquivo, 1)
    DadosDoObjetoArquivo= ObjetoArquivo.ReadAll

    Dim objCDOSYSMail
    Dim objCDOSYSCon

    Set objCDOSYSMail = Server.CreateObject("CDO.Message")
    Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")

    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.server.com"
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user_id"
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
    objCDOSYSCon.Fields.update

    Set objCDOSYSMail.Configuration = objCDOSYSCon
    objCDOSYSMail.From = "ABC <abc@server.com>"
    objCDOSYSMail.To = "sender@gmail.com"
    objCDOSYSMail.Subject = "Contato"
    objCDOSYSMail.HTMLBody= DadosDoObjetoArquivo
    objCDOSYSMail.Send

    Set objCDOSYSMail = Nothing
    Set objCDOSYSCon = Nothing
%>

Я хотел бы сделать это простым, пропустив этап создания файла на диске. Я бы хотел:

Прочитайте базу данных, прочитайте шаблон, поместите данные в память, отправьте письмо с этими данными в память.

Спасибо

2 ответа

Решение

Если я правильно понимаю, все, что вам нужно сделать, это пропустить часть, где вы сохраняете файл и перечитать его... Я реорганизовал ваш код, дал переменным некоторые английские имена, чтобы я мог видеть, что происходит, и прокомментировал из строк, которые вам не нужны:

<%
    Dim TemplateName     : TemplateName = "template.htm"
    Dim TemplateFullPath : TemplateFullPath = Server.MapPath(TemplateName)
    Dim TemplatePath     : TemplatePath = Mid(TemplateFullPath,1,InStrRev(TemplateFullPath,"\"))

    Dim ArchiveName      : ArchiveName = "evento.htm"
    Dim ArchiveFullPath  : ArchiveFullPath = Server.MapPath(ArchiveName)

    Dim FSO, TemplateFile, TemplateText
    Set FSO = Server.CreateObject("Scripting.FileSystemObject")
        Set TemplateFile = FSO.OpenTextFile(TemplateFullPath, 1)
            TemplateText = TemplateFile.ReadAll()
            TemplateText = Replace(TemplateText, "[Cliente]", Um)
            TemplateFile.Close()

'   Really simple - to do this in-memory, simply don't save and re-read the file....

'        Set TemplateFile = FSO.CreateTextFile(TemplatePath & ArchiveName)
'            TemplateFile.Write(TemplateText)

'        Set TemplateFile = FSO.OpenTextFile(TemplatePath & ArchiveName, 1)
'            TemplateText = TemplateFile.ReadAll


        Set TemplateFile = Nothing
    Set FSO = Nothing

    Dim objCDOSYSMail, objCDOSYSCon
    Set objCDOSYSMail = Server.CreateObject("CDO.Message")
        Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.server.com"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user_id"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update

            Set objCDOSYSMail.Configuration = objCDOSYSCon
                objCDOSYSMail.From = "ABC <abc@server.com>"
                objCDOSYSMail.To = "sender@gmail.com"
                objCDOSYSMail.Subject = "Contato"
                objCDOSYSMail.HTMLBody= TemplateText
                objCDOSYSMail.Send
            Set objCDOSYSMail.Configuration =  Nothing
        Set objCDOSYSMail = Nothing
    Set objCDOSYSCon = Nothing
%>

Надеюсь это поможет,

Erik

Вы могли бы использовать несколько методов:

  • написать свой собственный класс stringbuilder
  • используйте класс.net system.io.stringwriter (да, вы можете использовать это из классического ASP)
  • использовать объект adodb.stream

пример stringwriter:

set sw = server.createObject("system.io.stringwriter")
sw.write_12( DadosDoObjetoArquivo )

objCDOSYSMail.HTMLBody = sw.getStringBuilder().toString()

пример (adodb.stream):

set stream = server.createobject("ADODB.Stream")
with stream 
    .Open
    .WriteText DadosDoObjetoArquivo
end with

objCDOSYSMail.HTMLBody = stream.ReadText
stream.Close
Другие вопросы по тегам