2015-02-03 9 views
9

L'invio di allegati di posta elettronica non sembra essere ancora stato implementato in Meteor's email package ufficiale. Ho provato il suggerimento di nodemailer (visto here) ma ho ricevuto l'errore "Impossibile leggere la proprietà 'createTransport' di undefined".Invio di allegati di posta elettronica con Meteor.js (pacchetto email e/o nodemailer o altro)

Sto tentando di creare un file CSV in un URI di dati e quindi inviare quell'allegato. Ecco un frammento del mio codice quando si utilizza il pacchetto ufficiale e-mail:

csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv); 

var options = { 
      from: "[email protected]", 
      to: "[email protected]", 
      subject: "xxx", 
      html: html, 
      attachment: { 
      fileName: fileName, 
      path: csvData 
      } 
     }; 

Meteor.call('sendEmail', options); 

EDIT:

Qui è fondamentalmente ciò che il mio codice nodemailer sembrava:

var nodemailer = Nodemailer; 
var transporter = nodemailer.createTransport(); 
transporter.sendMail({ 
    from: '[email protected]', 
    to: '[email protected]', 
    subject: 'hello', 
    text: 'hello world!', 
    attachments: [ 
     { 
      path: csvData 
     } 
    ] 
}); 
+0

Qual è il codice di nodemailer hai provato? Non credo che gli allegati siano supportati nel pacchetto ufficiale dei meteoriti. – rivarolle

+0

Ho usato [questo pacchetto] (https://atmospherejs.com/mrt/meteor-nodemailer) e ho seguito le istruzioni per farlo funzionare (ha una configurazione abbastanza simile all'e-mail di Meteor). Aggiornerò la mia domanda con il codice. –

+0

Questo articolo ha alcuni esempi http://kukuruku.co/hub/javascript/meteor-how-to-build-a-todo-list –

risposta

5

Non abbastanza rep per commentare.

Ho finito per risolvere il problema degli allegati utilizzando il pacchetto NPM di Sendgrids.

npm install sendgrid 

Se non si dispone di npm nell'app meteo, è possibile leggerlo. https://meteorhacks.com/complete-npm-integration-for-meteor

Nella tua packages.json

{ 
    "sendgrid": "1.4.0" 
} 

Poi, in un file che viene eseguito sul server:

Meteor.startup(function(){ 
    process.env.MAIL_URL = 'smtp://<username>:<password>@smtp.sendgrid.net:587'; 
}); 

Qui è un metodo di esempio meteora che ottiene l'URL di un allegato (noi stiamo usando S3) da una collezione di allegati. Questo particolare metodo può inviare qualsiasi numero di allegati a qualsiasi numero di destinatari. C'è qualche logica specifica per il contesto qui, ma dovrebbe essere sufficiente per farti funzionare mandando allegati.

La parte importante:

var email = new sendgrid.Email(); 
email.setFrom("[email protected]"); 
email.setSubject("subject"); 
email.addFile({ 
    filename: attachment_name, 
    url: attachment_url 
}); 
sendgrid.send(email, function (err, json) { 
    if (err) { 
     console.error(err); 
    } 
    if (json) { 
     console.log(json.message);     
    } 
}); 

un metodo completo esempio:

Meteor.methods({ 
SendEmail: function (subject, message, templateNumber) { 

    //console.log(subject, message, templateNumber); 

    var user_id = Meteor.userId(); 
    var list = UserList.find({user_id: user_id}).fetch(); 
    var sentTemplate = sentTemplate + templateNumber; 
    var counter = 0; 
    console.log(list.length); 
    // Track is the 'No Response' from the list. 
    for (var i = 0; i < list.length; i++) {  
      var email = new sendgrid.Email(); 
      if (list[i].track == null || list[i].track == "1") { 
       //email.addTo(list[0].list[i].Email); 
       //console.log(list[0].list[i].Email); 
       email.to = list[i].email; 
      } 
      email.setFrom(Meteor.user().email); 
      email.replyto = Meteor.user().email; 

      email.setSubject(subject); 

      var firstName = list[i].name.split(" ")[0]; 

      var companyReplace = message.replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company).replace("{{Company}}", list[i].company); 
      var nameReplace = companyReplace.replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name).replace("{{Name}}",list[i].name) 
      var firstNameReplace = companyReplace.replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName).replace("{{FirstName}}",firstName); 

      email.setHtml(firstNameReplace); 

      var numAttachments = Attachments.find({user_id: Meteor.userId()}).fetch().length; 
      var attachments = Attachments.find({user_id: Meteor.userId()}).fetch(); 
      console.log("**********Attachments****************"); 
      console.log(attachments); 
      console.log("**********Attachments****************"); 
      for (var t = 0; t < numAttachments; t++) { 
       email.addFile({ 
        filename: attachments[t].attachment_name, 
        url: attachments[t].attachment_url 
       }); 
      } 
      sendgrid.send(email, function (err, json) { 
       if (err) { 
        console.error(err); 
       } 
       if (json) { 
        console.log(json.message); 

       } 
      }); 
      //console.log(email); 

    } // end for loop 

    if (templateNumber == 1) { 
     Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate1": true}}); 
    } 
    if (templateNumber == 2) { 
     Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate2": true}}); 
    } 
    if (templateNumber == 3) { 
     Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate3": true}}); 
    } 
    if (templateNumber == 4) { 
     Meteor.users.update({_id:Meteor.userId()}, {$set: {"sentTemplate4": true}}); 
    } 
    // for each email. replace all html 

    return list.length; 
} 
}); 
Problemi correlati