2015-02-03 7 views
9

Das Senden von E-Mail-Anlagen scheint in Meteor's offiziellem email package noch nicht implementiert zu sein. Ich habe den nodemailer Vorschlag versucht (gesehen here), aber erhielt den Fehler "kann Eigenschaft 'createTransport' von undefined nicht lesen".Senden von E-Mail-Anhängen mit Meteor.js (E-Mail-Paket und/oder nodemailer oder andere)

Ich versuche, eine CSV-Datei in einem Daten-URI zu erstellen und dann diesen Anhang zu senden. Hier ist ein Ausschnitt aus meinem Code, wenn das offizielle E-Mail-Paket mit:

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:

Hier ist im Grunde, was mein nodemailer Code aussah:

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

was die nodemailer Code, den Sie versucht? Ich glaube nicht, dass Anhänge im offiziellen Meteor-Paket unterstützt werden. – rivarolle

+0

Ich verwendete [dieses Paket] (https://atmosphherejs.com/mrt/meteor-nodemailer) und befolgte die Anweisungen, um es zum Laufen zu bringen (hat eine ähnliche Konfiguration wie Meteor's E-Mail). Ich werde meine Frage mit dem Code aktualisieren. –

+0

Dieser Artikel hat einige Beispiele http://kukuruku.co/hub/javascript/meteor-how-to-build-a-todo-list –

Antwort

5

nicht genug rep zu kommentieren.

Ich löste das Problem Anhang mit Sendgrids NPM-Paket.

npm install sendgrid 

Wenn Sie nicht npm in Ihrer Meteor App haben, können Sie dies lesen. https://meteorhacks.com/complete-npm-integration-for-meteor

In Ihrem packages.json

{ 
    "sendgrid": "1.4.0" 
} 

dann in einer Datei, die auf dem Server ausgeführt wird:

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

Hier ein Beispiel Meteor-Methode, die die URL einer Anlage bekommt (wir verwenden S3) aus einer Anhangsammlung. Diese bestimmte Methode kann beliebig viele Anlagen an beliebig viele Empfänger senden. Es gibt hier einige kontextspezifische Logik, aber es sollte ausreichen, um Sie zum Senden von Anhängen zu bewegen.

Der wichtige Teil:

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);     
    } 
}); 

Ein komplettes Verfahren Beispiel:

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; 
} 
});