2017-02-14 9 views
2

Я пытаюсь отправить электронное письмо каждому человеку из массива. Поэтому мне нужен адрес электронной почты от каждого человека. У меня есть коллекция с именем человека и адресом электронной почты, коллекция называется Benutzer/benutzer.Получить адрес электронной почты каждого человека в Маре в Метеор

Вот мой код на клиенте:

Template.NeuesEvent.onCreated(function() { 
    this.subscribe('events'); 
    this.subscribe('friends'); 
    this.subscribe('benutzer'); 
}); 

Template.NeuesEvent.events({ 
    "submit .add-event": function(event){ 
     var Name = event.target.name.value; 
     var Beschreibung = event.target.beschreibung.value; 
     var Datum = event.target.Datum.value; 
     var Autor = Meteor.userId(); 
     var eingeladene = []; <-- this is the array 
      $.each($('.FreundeCheckbox:checked'), function(){    
       eingeladene.push($(this).val()); 
      }); 

     var email = Meteor.Benutzer.findOne({"email": eingeladene});<<------ 

     <<---- here i want to grab the email adress 


     if (Name == "") 
     { 
      confirm("Das Event braucht einen Namen ;)") 
     } 
     else { 

     Meteor.call('addEvent', Name, Beschreibung, Datum, eingeladene, Autor, email) <<-- 
<<------and paste the information here 

     event.target.name.value = ""; 
     event.target.beschreibung.value = ""; 
     FlowRouter.go('/meineEvents'); 

     return false; 
    } 
    } 
}); 

это мой method.js но функция электронной почты не внутри него сейчас, но я уже знаю, как это сделать

Meteor.methods({ 
    addEvent(Name, Beschreibung, Datum, eingeladene, Autor, email) { 
     Events.insert({ 
      Name: Name, 
      Beschreibung: Beschreibung, 
      erstelltAm: new Date(), 
      Datum: Datum, 
      Eingeladen: eingeladene, 
      Autor: Autor 
     }); 

SSR.compileTemplate('InviteEmail', Assets.getText('Invite-Email.html')); 
     var emailData = { 
      Name: Name, 
      Beschreibung: Beschreibung, 
      erstelltAm: new Date(), 
      Datum: Datum, 
      Eingeladen: eingeladene, 
      Autor: Autor 
     }; 

    Email.send({ 
     to: email, <<<-----everytime a new one 
     from: "[email protected]", 
     subject: "Einladung", 
     html: SSR.render('InviteEmail', emailData), 
     }); 
     } 
    }); 

Так теперь вы знаете, что я пытаюсь сделать, теперь вы можете помочь мне с двумя проблемами, сначала получив адрес электронной почты, а затем второй, чтобы перекрыть функцию email.send с каждым адресом электронной почты снова

+1

Я рекомендую использовать только '_id' на клиенте. Передайте массив user '_id's в Meteor.call() и дайте серверу найти нахождение пользователей и извлечение их адресов электронной почты. Это позволит избежать заражения других адресов электронной почты пользователя клиенту (более безопасным) и уменьшит латентность операции. Не забудьте вызывать 'this.unblock()' в вашем методе, чтобы избежать блокирования других запросов. –

ответ

0

Пожалуйста, не делайте этого. писать комментарии в коде на самом деле не комментируя его:

Неправильно:

var eingeladene = []; <-- this is the array

Лучше:

var eingeladene = []; // <-- this is the array 

Помните, что ваш eingeladene является массивом, это ничего не возвращает:

var email = Meteor.Benutzer.findOne({"email": eingeladene}); 

правильный способ сделать это:

var email = Meteor.Benutzer.findOne({"email": {$in: eingeladene}}); 

В любом случае, что бы я сделал, я бы послал множество писем к методу и делать вещи там. Что-то вроде этого.

Template.NeuesEvent.events({ 
    "submit .add-event": function(event){ 
     var Name = event.target.name.value; 
     var Beschreibung = event.target.beschreibung.value; 
     var Datum = event.target.Datum.value; 
     var Autor = Meteor.userId(); 
     var eingeladene = []; 
     $.each($('.FreundeCheckbox:checked'), function(){    
      eingeladene.push($(this).val()); 
     }); 

     // we dont't need email yet 

     if (Name == "") 
     { 
      confirm("Das Event braucht einen Namen ;)") 
     } 
     else { 

     // removed Autor and email here, since we don't need it 
     Meteor.call('addEvent', Name, Beschreibung, Datum, eingeladene); 

     event.target.name.value = ""; 
     event.target.beschreibung.value = ""; 
     FlowRouter.go('/meineEvents'); 

     return false; 
    } 
    } 
}); 

Meteor.methods({ 
    'addEvent': function(Name, Beschreibung, Datum, eingeladene) { 
     this.unblock(); 
     var Autor = Meteor.users.findOne(this.userId); 

     Events.insert({ 
      Name: Name, 
      Beschreibung: Beschreibung, 
      erstelltAm: new Date(), 
      Datum: Datum, 
      Eingeladen: eingeladene, 
      Autor: Autor 
     }); 

     SSR.compileTemplate('InviteEmail', Assets.getText('Invite-Email.html')); 
     var emailData = { 
      Name: Name, 
      Beschreibung: Beschreibung, 
      erstelltAm: new Date(), 
      Datum: Datum, 
      Eingeladen: eingeladene, 
      Autor: Autor 
     }; 

     // do you really need the fetch emails from the collection? 

     for (var i in eingeladene) { 
      var email = Meteor.Benutzer.findOne({"email": eingeladene[i]}); 
      if (!email) { 
       continue; 
      } 


      Email.send({ 
       to: email, <<<-----everytime a new one 
       from: "[email protected]", 
       subject: "Einladung", 
       html: SSR.render('InviteEmail', emailData), 
      }); 
     } 
    } 
}); 
+0

Спасибо, что это очень помогло;), но когда я проверю его, чтобы найти адрес электронной почты, я получаю сообщение об ошибке: Не могу прочитать свойство «findOne» неопределенного, и интернет не сказал мне решение (и что вы имеете в виду с действительно ли вы получите электронные письма, которые не приносят ничего или я ошибаюсь? – Michael

+0

извините, забыл это в первом комментарии @iiro – Michael

+0

@ Майкл трудно сказать. Перхас вам нужно импортировать какой-нибудь файл, где ваш Meteor.Benutzer? определения сбора в/Lib каталога, так что клиент и сервер видеть их Benutzer = новый Meteor.Collection ('Benutzer');. позже ... Benutzer.findOne (...) – iiro