Как я могу создать сложную электронную почту - шаблон плюс содержимое, сохраненное в переменной - используя cfscript вместо cfmail? - PullRequest
2 голосов
/ 05 июня 2019

Это немного расширяет вопрос, который я задавал ранее. Сервер CF2016. Я сохраняю таблицу данных, используя savecontent:

savecontent variable = 'mailBody' {
   writeOutput('
    <table width="99%" style="border-collapse:collapse;width:99%;">
      <tr>
        <td style="background-color:##09AFFF;color:##FFFFFF;width:30%;padding-left:3px;padding-top:5px;padding-bottom:5px;font-size:12px;font-weight:700;border-bottom:1px solid ##5B5B5B;text-align:left;">Name</td>
        <td style="background-color:##09AFFF;color:##FFFFFF;width:15%;padding-top:5px;padding-bottom:5px;font-size:12px;font-weight:700;border-bottom:1px solid ##5B5B5B;text-align:center;">Class</td>
        <td style="background-color:##09AFFF;color:##FFFFFF;width:30%;padding-top:5px;padding-bottom:5px;font-size:12px;text-align:left;font-weight:700;border-bottom:1px solid ##5B5B5B;">City,State,ZIP</td>
        <td style="background-color:##09AFFF;color:##FFFFFF;width:15%;padding-right:5px;padding-top:5px;padding-bottom:5px;font-size:12px;text-align:left;font-weight:700;border-bottom:1px solid ##5B5B5B;">Amount</td>
      </tr>
  ');

   for ( qryPeople in queryPeople ){
       writeOutput('
      <tr>
        <td style="font-size:12px;padding-left:3px;padding-top:3px;padding-bottom:4px;background-color:#thisBgColor#;border-bottom:1px solid ##5B5B5B;">#qryPeople.p_first# #qryPeople.p_last#</td>
        <td style="font-size:12px;padding-left:3px;padding-top:3px;padding-bottom:4px;background-color:#thisBgColor#;border-bottom:1px solid ##5B5B5B;text-align:center;">#YEAR(qryPeople.p_graduation)#</td>
        <td style="font-size:12px;padding-left:3px;padding-top:3px;padding-bottom:4px;background-color:#thisBgColor#;border-bottom:1px solid ##5B5B5B;">#qryPeople.p_city# #qryPeople.p_state#</td>
        <td style="font-size:12px;padding-top:3px;padding-bottom:4px;padding-right:5px;background-color:#thisBgColor#;border-bottom:1px solid ##5B5B5B;">#NumberFormat(qryValue.p_value,'99,999')#</td>
      </tr>
    ');
   };
   writeOutput('
      <tr>
        <td colspan="5" style="font-size:11px;padding-left:5px;padding-top:5px;padding-right:5px;padding-bottom:7px;background-color:##09AFFF;color:##FFFFFF;font-style:italic;border-bottom:1px solid ##5B5B5B;">footer text</td> 
      </tr>  
    </table>
  '); 
};//end savecontent

Хорошо работает здесь - я могу вывести переменную mailBody и увидеть таблицу в стиле, подходящую для электронной почты в формате HTML.

У нас есть стандартные шаблоны электронной почты, которые мы используем (.htm), которые хранятся централизованно. Я пытаюсь внедрить этот контент в один из этих шаблонов для отправки.

    mailerService = new mail();
    mailTemplate = fileRead(application.paths.physicalroot & '\email\project1\templates\people.htm');
    mailerService.setTo("me@domain.com"); 
    mailerService.setFrom("support@domain.com"); 
    mailerService.setSubject("People Report"); 
    mailerService.setType("html"); 
    mailerService.send(body=mailTemplate);

В файле шаблона .htm у меня есть

<cfoutput>#mailBody#</cfoutput>

И это дает мне именно это - # mailBody #. В менее сложных электронных письмах у меня нет проблем, используя что-то вроде

<cfoutput>Welcome #qryPeople.p_first# #qryPeople.p_last#</cfoutput>

Или доступ к другим переменным, установленным в шаблоне cfscript, который управляет электронной почтой. Но я не могу понять, почему моя переменная savecontent работает не так, как ожидалось.

РЕШЕНИЕ - ранее попытка включения savecontent не работала, но, возможно, это было в ACF 2010. Это работает в ACF2016.

mailerService = new mail();
savecontent variable="mailTemplate" {
  include variables.templatePath & '\email\project1\templates\people.htm';
};
mailerService.setTo("me@domain.com"); 

People.htm включен, а другое содержимое сохранения (mailbody) отображается в электронном письме. Теперь, чтобы понять это, используя новый скрипт cfmail () ...

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Если у вас есть только один «блок» для оценки, я бы просто заменил его, используя строковую функцию:

mailTemplate = fileRead(application.paths.physicalroot & '\email\project1\templates\people.htm');
mailTemplate = replaceNoCase(mailTemplate, "##mailBody##", mailBody, "one");
// continue with mailerService.* methods

Другой вариант - использовать include с saveContent:

Для этого может потребоваться переименовать шаблон из * .htm в файл * .cfm.

// create mailBody first using your current saveContent
savecontent variable="finalBody" {
    include "#application.paths.physicalroot#\email\project1\templates\people.cfm";
}

Переменная finalBody теперь должна содержать содержимое из переменной mailBody.

1 голос
/ 06 июня 2019

Если вы можете иметь разметку CF в шаблонах, вы сможете получить желаемые результаты с помощью этого:

<cfsavecontent variable="mailBody">
<cfinclude template="#application.paths.physicalroot#\email\project1\templates\people.htm"> 
</cfsavecontent>
...