2016-09-14 6 views
9

html 템플릿을 사용하여 nodemailer로 이메일을 보내려고합니다. 그 템플릿에서 동적으로 일부 변수를 주입 할 필요가 있으며 실제로 그렇게 할 수 없습니다. 내 코드 : 나는 몇 가지 예제를 발견했습니다변수를 nodemailer의 html 템플릿에 전달

Hello {{username}}! 

,이 같은 떨어지게했다 :

var nodemailer = require('nodemailer'); 
var smtpTransport = require('nodemailer-smtp-transport'); 

smtpTransport = nodemailer.createTransport(smtpTransport({ 
    host: mailConfig.host, 
    secure: mailConfig.secure, 
    port: mailConfig.port, 
    auth: { 
     user: mailConfig.auth.user, 
     pass: mailConfig.auth.pass 
    } 
})); 
var mailOptions = { 
    from: '[email protected]', 
    to : '[email protected]', 
    subject : 'test subject', 
    html : { path: 'app/public/pages/emailWithPDF.html' } 
}; 
smtpTransport.sendMail(mailOptions, function (error, response) { 
    if (error) { 
     console.log(error); 
     callback(error); 
    } 
}); 

것은 이제 나는이 같은 emailWithPDF.html 무언가를 원하는 가정 해 봅시다

... 
html: '<p>Hello {{username}}</p>' 
... 

하지만, 나는 별도의 html 파일에서 원한다. 가능한가?

답변

8

동일한에 대한 또 다른 방법은 같은 당신이 노드에 fs 모듈을 사용하여 HTML 파일을 읽은 다음 handlebars

var nodemailer = require('nodemailer'); 
var smtpTransport = require('nodemailer-smtp-transport'); 
var handlebars = require('handlebars'); 
var fs = require('fs'); 

var readHTMLFile = function(path, callback) { 
    fs.readFile(path, {encoding: 'utf-8'}, function (err, html) { 
     if (err) { 
      throw err; 
      callback(err); 
     } 
     else { 
      callback(null, html); 
     } 
    }); 
}; 

smtpTransport = nodemailer.createTransport(smtpTransport({ 
    host: mailConfig.host, 
    secure: mailConfig.secure, 
    port: mailConfig.port, 
    auth: { 
     user: mailConfig.auth.user, 
     pass: mailConfig.auth.pass 
    } 
})); 

readHTMLFile(__dirname + 'app/public/pages/emailWithPDF.html', function(err, html) { 
    var template = handlebars.compile(html); 
    var replacements = { 
     username: "John Doe" 
    }; 
    var htmlToSend = template(replacements); 
    var mailOptions = { 
     from: '[email protected]', 
     to : '[email protected]', 
     subject : 'test subject', 
     html : htmlToSend 
    }; 
    smtpTransport.sendMail(mailOptions, function (error, response) { 
     if (error) { 
      console.log(error); 
      callback(error); 
     } 
    }); 
}); 
+0

'.pug' 파일의 경우처럼 우리가하는 것과 같은 다른 방법이 있는가, 변수를 맵핑하기 위해 객체를 전달한다. –

2

당신이 Nodemailer 2.0.0 이상을 사용하는 경우,이 문서 확인 :

// external renderer 
var EmailTemplate = require('email-templates').EmailTemplate; 
var send = transporter.templateSender(new EmailTemplate('template/directory')); 

그들은 또한이 예제를 제공합니다 :이 https://nodemailer.com/2-0-0-beta/templating/들이 같은 템플릿을 사용하여 외부 렌더링을 활용하는 방법에 대해 설명을 :

// create template based sender function 
// assumes text.{ext} and html.{ext} in template/directory 
var sendPwdReminder = transporter.templateSender(new EmailTemplate('template/directory'), { 
    from: '[email protected]', 
}); 

여기서 변수를 전달하는 방법을 볼 수 있습니다.

email-templates 모듈 : https://github.com/crocodilejs/node-email-templates 및 원하는 템플릿 엔진이 필요합니다.

또한 email-templates의 문서에서 당신은 순서대로 템플릿을 찾을 수있는 파일 구조를 만드는 방법을 찾을 수 있습니다 :

HTML {{내선}} (필수) -의 HTML 형식. 이메일

텍스트 {{ext}} (선택 사항) - 이메일 스타일의 텍스트 형식입니다.

{{ext}} (선택 사항) - HTML 형식 제목의 스타일.

{{내선}} (선택 사항) - 전자 우편의 주제에 대한

참조 가능한 템플릿 엔진 확장을위한 템플릿 엔진을 지원 (예 : .ejs, .jade, .nunjucks) {{내선의 값을 사용하는 }}.

IDE에서 파일을 쉽게 식별하는 데 도움이되는 파일 이름 앞에 아무 접두사를 붙일 수 있습니다. 유일한 요구 사항은 html., text., style. 및 subject가 파일 이름에 포함되어 있어야한다는 것입니다. 각기.

+0

사용하면 HTML 문자열에서 변경하려는 요소를 대체한다 할 수 있는가 우리는 .pug 파일의 경우에, 변수를 맵핑하기 위해 객체를 전달한다. –

관련 문제