coldfusion cfmail не принимает к =

#coldfusion #cfmail

#coldfusion #cfmail

Вопрос:

Я настраиваю группу электронных писем и начинаю с извлечения информации из таблицы MySQL

 <cfoutput>
<cfset headls ='PersonFn,PersonLn,PersonEmail1'>
<cfquery name = "sord" datasource = "whatever">
  select distinct PersonID,#headls# from PersonRepDb        
</cfquery>
</cfoutput>
  

Это приводит к правильному выводу. Затем я просматриваю результаты запроса, отправляя электронное письмо каждому пользователю.

   <cfset sordlen = sord.recordcount>
  <cfloop from = "1" to = "#sordlen#" index = 'j'> 
  <cfmail 
          from     = "#session.user#"  
          to       = "#sord['PersonEmail1'][j]#"          
          password = "#session.password#"
          username = "#session.user#"             
          server   = "localhost"                            
          replyto  = "#txt['replyto']#"
          subject  = "#txt['repsubject']#"               
          type     = "html"   >     

     ...stuff
 </cfmail>
 </cfloop>
  

Когда я пытаюсь запустить эту программу, я получаю сообщение об ошибке: «Один из следующих атрибутов должен быть определен [to, cc, bcc]». Очевидно, что «кому» есть, и если я заменю переменную на конкретное электронное письмо, например «joan@gmail.com » сообщение об ошибке исчезает. Таким образом, очевидно, что переменная после ‘to’ не декодируется.

Я попытался разделить переменную sord[‘PersonEmail1’][j] на части до и после @

 <cfset preml = GetToken("#sord['PersonEmail1'][j]#",1,'@')>
<cfset posml = GetToken("#sord['PersonEmail1'][j]#",2,'@')>
  

и затем настраивает to как

  to = "#preml#@#posml#" 
  

но это не помогло.

Кто-нибудь может сказать мне, как это исправить?

Комментарии:

1. Какая версия CF?

2. И вам нужно использовать динамические имена столбцов? Каждый раз, когда у вас есть динамическая инструкция SQL, вы рискуете внедриться. Если у вас есть несколько столбцов, которые могут вам понадобиться, возможно, вам лучше просто выбрать все нужные столбцы и отфильтровать их позже.

3. Похоже, в вашем коде нет ничего плохого. Возвращают ли ваши другие переменные то, что вы ожидаете? Кроме того, вам не нужен cfloop , вы можете указать query="sord" атрибут, и он пошагово обработает результаты вашего запроса для вас. Тогда вы бы просто использовали .....to=sord.PersonEmail1..... .

4. Я бы предпочел cfoutput query = ‘sord’ , но тег вывода, похоже, вызывает проблемы с тегом cfmail. Вы знаете, что я могу использовать это с тегом cfmail? У меня есть несколько человек, и каждый должен получить свой собственный тег cfmail, потому что электронное письмо имеет динамический контент. Вы правы, что моя переменная возвращала не то, что я думал. Кажется, теперь все работает.

5. Итак, каково фактическое значение #sord['PersonEmail1'][j]# при возникновении ошибки? Очевидно, что нужно очистить имя и домен.

Ответ №1:

Это должно быть все, что вам нужно сделать. Если вы пытаетесь сделать список столбцов из базы данных динамическим, это, вероятно, не требуется. Просто убедитесь, что содержимое столбца электронной почты соответствует допустимому формату электронной почты перед отправкой.

 <cfquery name="sord" datasource="whatever">
    select distinct 
        PersonID,
        PersonFn,
        PersonLn,
        PersonEmail1
    from 
        PersonRepDb        
</cfquery>

<cfloop query="sord">
    <cfif isValid("email", sord.PersonEmail1)>
        <cfmail 
            from     = "#session.user#"
            to       = "#sord.PersonEmail1#"
            password = "#session.password#"
            username = "#session.user#"
            server   = "localhost"
            replyto  = "#txt['replyto']#"
            subject  = "#txt['repsubject']#"
            type     = "html">

        ...stuff
    </cfmail>
</cfloop>
  

Комментарии:

1. В чем преимущество цикла запроса вокруг cfmail вместо использования атрибута запроса? Не будет ли атрибут запроса устанавливать одно соединение с почтовым сервером, а затем массово отправлять электронные письма? Не уверен.

2. Кроме того, isValid() может вызвать сбои и неверно подтвердить некоторые адреса. Особенно в старых версиях. Не уверен, какая это версия. Хотя это, вероятно, поразит подавляющее большинство необходимых адресов в большинстве систем.

3. Добавление where clause к запросу, чтобы он возвращал только действительные адреса электронной почты, позволило бы вам использовать атрибут запроса тега cfmail. Особенности зависят от СУБД, которая не была идентифицирована.

4. @DanBracuk Я бы на 100% согласился с этим, и я считаю, что вам не следует фильтровать результаты запроса в коде; это должно быть сделано в самом запросе. Единственное исключение, если вам нужно использовать этот базовый запрос, приводит к нескольким местам для нескольких вещей в коде. Тогда это все еще зависит. 🙂

5. Дэн, я посмотрю на атрибут запроса тега cfmail. Так полезно узнать об этих вещах.