Где хранить автоматизированные шаблоны транзакционной электронной почты в ColdFusion - PullRequest
0 голосов
/ 06 февраля 2019

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

  • Регистрация пользователя
  • Проверка электронной почты
  • Сброс пароля
  • Подтверждение заказа
  • Подтверждение отправки
  • Уведомления о комментариях

И т. Д.

Прив тот момент, когда я отправляю только электронные письма о регистрации пользователей, мне удалось сохранить их все в одном компоненте под названием email.cfc и сохранить его экземпляр в области application, например <cfset APPLICATION.EmailSender = New email.cfc() />

email.cfcпросто есть куча методов, которые отправляют различные электронные письма, такие как:

<cffunction name="NewUserRegistered">
  <cfmail type="html" to="#useremail#" subject="Welcome" >
    <h1>Thanks for registering #username#!</h1>
  </cfmail>
</cffunction>

<cffunction name="PasswordReset">
  <cfmail type="html" to="#useremail#" subject="Password Reset">
    <h1>Dear #username#, you requested a password reset...</h1>
  </cfmail>
</cffunction>

<cffunction name="OrderConfirmation">
  <cfmail type="html" to="#useremail#" subject="Order Confirmation #orderid#">
    <h1>Your order: #order_id# has been received...</h1>
  </cfmail>
</cffunction>

Я только что понял, что количество различных типов электронных писем собирается резко возрасти, и я мог бы в итоге получить около 50 различных типовэлектронные письма, которые должны выходить в зависимости от того, какое событие происходит.Кажется, слишком просто хранить все эти шаблоны электронной почты в одном CFC в области приложения, что может заполнить память сервера или вызвать другие проблемы с масштабируемостью (что бы это ни было / может означать)

Что было бы лучшеспособ управлять отправкой автоматической транзакционной электронной почты в ColdFusion?Некоторые возможные решения:

  • Продолжайте хранить все электронные письма в одном CFC и получать к ним доступ с других страниц CFC / CFM
  • Сохраняйте шаблоны в CFC, которые в них нуждаются, такие как shoppingcart.cfc, которыесработает по электронной почте с подтверждением заказа в конце торговой сессии

1 Ответ

0 голосов
/ 07 февраля 2019

РЕДАКТИРОВАТЬ: Добавлен пример замены заполнителя.

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

<cfscript>
    // Our mail function.
    public Void function genEmail ( required Numeric templateTypeID, required String userEmail, required Struct placeholder ) {

        // Created fake query of templates.
        emailTemplateQuery = queryNew(
            "templatetypeid,templatesubject,templatetext",
            "integer,varchar,varchar", 
            [ 
                { templatetypeid=1,templatesubject='Welcome',templatetext='<h1>Thanks for registering!</h1><p>[[p1]]</p><p>[[p2]]</p>' },
                { templatetypeid=2,templatesubject='Password Reset',templatetext='<h1>You requested a password reset.</h1><p>[[p1]]</p><p>[[p2]]</p>' },
                { templatetypeid=3,templatesubject='Another Email',templatetext='<h1>You did something.</h1><p>[[p1]]</p><p>[[p2]]</p><p>[[p3]]</p>' }
            ]
        ) ;
        ///////////////////////////////////

        // Build the query.
        local.sql = "SELECT templatesubject, templatetext FROM emailTemplateQuery WHERE templateTypeID = :templateTypeID" ;
        // Which template?
        local.params = { templateTypeID = arguments.templateTypeID };   
        // Query options?
        local.queryoptions = { 
            dbtype="query" 
            // datasource="myDSN" << Use your DSN for final query.
        } ;

        // Create a new query and execute it.
        local.emailQ = QueryExecute(local.sql, local.params, local.queryoptions ) ;

        local.finalEmailString = local.emailQ.templatetext ;

        // Let's inject our placeholder info into our email template
        for ( var p IN arguments.placeholder ) {
            local.finalEmailString = local.finalEmailString.replaceNoCase(
                "[[" & p & "]]" ,
                arguments.placeholder[p] ,
                "All"
            ) ;
        }

        // Create a new mail object.
        local.sendEmail = new mail() ;
        // Save mail body to a variable.
        savecontent variable="emailBody" {
            writeOutput(local.finalEmailString);
        }
          // Set From, To, Type, etc.
          sendEmail.setFrom("fromMe@domain.com");
          sendEmail.setTo(arguments.userEmail);
          sendEmail.setType("html");
          sendEmail.setSubject(local.emailQ.templatesubject);
          // Send the email. So uncomment next line to send.
          //sendEmail.send(body=emailBody); 

        // We don't have to return anything, but for this demo, we want to see what email will be sent.
        writeDump(local.emailQ.templatesubject);
        writeDump(local.finalEmailString);
    }



    // To send an email, just call genEmail() and pass the type and who to.
    genEmail(1,"bill@beexcellent.com",{"p1":"This is my first replacement.","p2":"This is my second replacement."}) ;
    writeoutput("<br><br>");
    genEmail(2,"ted@beexcellent.com",{"p1":"This is my third replacement.","p2":"This is my fourth replacement."}) ;
    writeoutput("<br><br>");
    genEmail(3,"rufus@beexcellent.com",{"p1":"This is my fifth replacement.","p2":"This is my sixth replacement.","p3":"This is my seventh replacement."}) ;
</cfscript>

Это можно немного упростить.Большая часть моего кода была настройка тестовых данных и использование Query Of Query.Вы хотели бы использовать регулярный вызов к вашему источнику данных.Вы также можете более эффективно использовать результаты запроса внутри тега cfmail.Я настоятельно рекомендую сделать много фильтрации и проверки, прежде чем разрешить что-либо отправлять электронную почту из вашей системы.Вы также можете вернуть код состояния из функции электронной почты, чтобы проверить успешность (или другую информацию).

Вы можете сохранить процесс электронной почты в свой собственный CFC, а затем кэшировать его для использования в своем приложении.

ПРИМЕЧАНИЕ: Я также предпочитаю сценарий тегамдля большинства CF, но моя логика выше может быть преобразована обратно в теги, если вы хотите.

https://cffiddle.org/app/file?filepath=639e2956-a658-4676-a0d2-0efca81d7c23/ce5629c9-87e6-4bff-a9b8-86b608e9fc72/c8d38df7-f14d-481f-867d-2f7fbf3238f2.cfm

РЕЗУЛЬТАТЫ: С моими выше тестами,Вы получаете электронные письма со следующим HTML.

genEmail(1,"bill@beexcellent.com",{"p1":"This is my first replacement.","p2":"This is my second replacement."}) Добро пожаловать

Спасибо за регистрацию!

Это моя первая замена.

Это моя вторая замена.

genEmail(2,"ted@beexcellent.com",{"p1":"This is my third replacement.","p2":"This is my fourth replacement."})

Сброс пароля

Вы запросили сброс пароля.

Это моя третья замена.

Это моя четвертая замена.

genEmail(3,"rufus@beexcellent.com",{"p1":"This is my fifth replacement.","p2":"This is my sixth replacement.","p3":"This is my seventh replacement."})

Другое письмо

Вы что-то сделали.

Это моя пятая замена.

Это моя шестая замена.

Это моя седьмая замена.

...