์๋ ํ์ธ์,
readme์ ์ดํดํ๊ธฐ ์ฌ์ด ์์ ๋ฅผ ์ ๊ณตํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ ๊ณผ ๊ฐ์ด ๊ฐ๋จํ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด 30 ์ค์ ์ฐ๊ณ ์ถ๋ค๋ฉด tbh ๋๋ฌธ์ ๋๋ค. ๊ฐ๋จํ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ์๋ฐ ์คํฌ๋ฆฝํธ ์ฝ๋์ ๊ฒฝ์ฐ sendgrid๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
์๋ จ ๋ ๊ฐ๋ฐ์๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํธํฉ๋๋ค.
๊ฑด๋ฐฐ,
์ด ํ๋ ์๋ฆฌ์ ๋ํด ์ฃ์กํฉ๋๋ค
์ถ์ :์ด ์์ ๋ https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html์ ์ฐพ๊ณ ์์ผ๋ฏ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
์๋ ํ์ธ์ @julesbou ,
ํ๋ ํญ์ธ์ ๋์๊ฒ ๊ด์ฐฎ์ต๋๋ค. ํนํ ์๋ฃจ์ ์ด ์ฒจ๋ถ๋์ด ์๋ค๋ฉด :)
์๊ฐ์๋ด์ด ์๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ ๋ค์ ๋ฐ๋ณต์ ์ํด ๊ฐ์ ์ ๊ณํํ๊ณ ์์ผ๋ฏ๋ก ์ข์ ํ์ด๋ฐ์ ๊ฐ์ก์ต๋๋ค!
๋ค๋ฅธ ํน์ ์์ฒญ์ด์๋ ๊ฒฝ์ฐ์ด ์ค๋ ๋์์ ์๋ ค์ฃผ๊ฑฐ๋ ์ถ๊ฐ ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค.
๊ฐ์ฌ!
๋์ฐ๋ฏธ ํด๋์ค๋ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? ๋ด๊ฐ ์ํ๋ ๊ฒ์ ์ด๋ฆ์ ์ค์ ํ๋ ๊ฒ๋ฟ์ ๋๊น ??
@jsgandalf ,
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ https://github.com/sendgrid/sendgrid-nodejs#hello -email, ๊ตฌ์ฒด์ ์ผ๋ก๋ https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example์ ๋๋ค. js # L4
๋ค์๊ณผ ๊ฐ์ด ๊ณ ์ ํ json์ ๋น๋ ํ ์๋ ์์ต๋๋ค. https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js#L31 (์ฌ๊ธฐ์ json ๊ฐ์๊ฐ ์์ต๋๋ค : https : / /sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)
๊ฐ์ฌ!
๋งค์ฐ ์ ์ฉํฉ๋๋ค! ์ด๊ฒ์ readme์ ์์ด์ผํฉ๋๋ค !!
@jsgandalf @thinkingserious ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ค๋ง ์ค๋ฝ์ต๋๋ค. ํ ํ๋ฆฟ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋ ์์ ๋๋ณ๋ก ๋์์ด๋์ง ์์ต๋๋ค. "๋ฐ๋ ์ฌ๋"๋ฐ "๋ณด๋ธ ์ฌ๋"์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ํผ๋์ค๋ฝ๊ณ ์ด ์ฝ๋๋ ๋ด ์ด๋ฉ์ผ์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ง๋ 3 ์ผ ๋์ ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ์ ๋๋ค. ๋์์ด ํ์ํ์ธ์?
@bcootner ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทํ์ ์์ฒญ์ ๋๊ธฐ์ด์ ์์ ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ๋๋ด๊ณ ์ถ์ดํ๋ ๋ฌธ์ ์ ๋๋ค.
๊ทธ๋์์ด ์์ ๊ฐ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)
function helloTemplate(){
var helper = require('sendgrid').mail
from_email = new helper.Email("[email protected]")
to_email = new helper.Email("[email protected]")
subject = "Hello World from the SendGrid Node.js Library"
content = new helper.Content("text/plain", "some text here")
mail = new helper.Mail(from_email, subject, to_email, content)
// The constructor above already creates our personalization object
// -name- and -card- are substitutions in my template
substitution = new helper.Substitution("-name-", "Example User")
mail.personalizations[0].addSubstitution(substitution)
substitution = new helper.Substitution("-card-", "Denver")
mail.personalizations[0].addSubstitution(substitution)
mail.setTemplateId("YOUR_TEMPLATE_ID")
return mail.toJSON()
}
function send(toSend){
//console.log(JSON.stringify(toSend, null, 2))
//console.log(JSON.stringify(toSend))
var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)
var requestBody = toSend
var emptyRequest = require('sendgrid-rest').request
var requestPost = JSON.parse(JSON.stringify(emptyRequest))
requestPost.method = 'POST'
requestPost.path = '/v3/mail/send'
requestPost.body = requestBody
sg.API(requestPost, function (response) {
console.log(response.statusCode)
console.log(response.body)
console.log(response.headers)
})
}
send(helloTemplate())
์ถ๊ฐ ๋์์ด ํ์ํ๋ฉด ๋ฌธ์ ํด์ฃผ์ธ์.
@thinkingserious ์๊ฐ๊ณผ ์ฌ๋ ค ๊น์ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค์ ์ฝ๋๊ฐ ์์ต๋๋ค.
var sg = require('sendgrid').SendGrid("SG.**** .. ***6o");
function welcomeTemplate() {
console.log("template")
var helper = require('sendgrid').mail
from_email = new helper.Email("[email protected]")
to_email = new helper.Email("[email protected]")
subject = "Hello World from the SendGrid Node.js Library"
content = new helper.Content("text/plain", "some text here")
mail = new helper.Mail(from_email, subject, to_email, content)
substitution = new helper.Substitution("-Name-", "bcootner")
mail.personalizations[0].addSubstitution(substitution)
mail.setTemplateId("5a****-*******-******-9") //The ID of my Transactional Template
return mail.toJSON()
}
function sendMail(toSend) {
console.log("Send")
var sg = require('sendgrid').SendGrid("SG.***....****o")
var requestBody = toSend
var emptyRequest = require('sendgrid-rest').request
var requestPost = JSON.parse(JSON.stringify(emptyRequest))
requestPost.method = 'POST'
requestPost.path = '/v3/mail/send'
requestPost.body = requestBody
sg.API(requestPost, function (response) {
console.log(response.statusCode)
console.log(response.body)
console.log(response.headers)
})
}
๊ทธ๋ฐ ๋ค์์ด ์ฝ๋๋ฅผ sendMail(welcomeTemplate())
๋ถ๋ฅด์ง ๋ง ์๋ํ์ง ์์ต๋๋ค. "ํ
ํ๋ฆฟ"๋ฐ "๋ณด๋ด๊ธฐ"๊ฐ ๋ก๊ทธ์ ๋ํ๋์ง๋ง statusCode, ๋ณธ๋ฌธ ๋๋ ํค๋๊ฐ ํ์๋์ง ์๊ณ ์ด๋ฉ์ผ์ด ์์ ๋์ง ์๊ณ ๋์ ๋ณด๋์ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค.
ํ requestPost.body = requestBody
๋น์ ์ ์ ๋ฐ ์ console.log(JSON.stringify(requestBody))
๋ด๊ฒ ๋น์ ์ด ๋ฌด์์ ์ป์ ์๋ ค ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
@thinkingserious ๋๋ฒ๊น
ํ var emptyRequest = require('sendgrid-rest').request
์ค ๋ค์ ์๋ฌด๊ฒ๋ ์ธ์๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๋จผ์ "ํ
ํ๋ฆฟ"์ด ๊ธฐ๋ก๋๊ณ ์ฝ 5 ๋ถ ํ์ "send"๊ฐ ์ธ์๋ฉ๋๋ค (๊ทธ๋ฆฌ๊ณ send ํจ์์์ ์ฃผ์ ์ฒ๋ฆฌ ํ ์ค์ ์ฃผ์ ํด์ ํ๋ฉด ์ ๋๋ก ์๋ํฉ๋๋ค). ์ด require ๋ฌธ์์ ๋น ์ง ๊ฒ์ด ์์ต๋๊น? ๋ฐฉ๊ธ npm install sendgrid
์ด๊ฒ์ ์๋ํ์ญ์์ค :
A. ๋ค์ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ post.json์ด๋ผ๋ ํ์ผ์ ๋ง๋ญ๋๋ค.
{"content":[{"type":"text","value":"Hello, World!"}],"from":{"email":"[email protected]"},"personalizations":[{"subject":"Hello, World!","to":[{"email":"[email protected]"}]}]}
B. ์์ ์ด๋ฉ์ผ ๊ต์ฒด
C. ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค.
curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \
-H "Authorization: Bearer $SENDGRID_API_KEY" \
-H "Content-Type: application/json" \
-d @post.json
D. $ SENDGRID_API_KEY๋ฅผ API ํค๋ก ๋ฐ๊พธ๊ฑฐ๋ API ํค๋ฅผ SENDGRID_API_KEY๋ผ๋ ํ๊ฒฝ ๋ณ์์ ์ถ๊ฐํ์ญ์์ค.
@thinkingserious ํ ์คํธ ์ด๋ฉ์ผ์ ๋ฐ์๋๋ฐ Hello Test๊ฐ ์ ๋๋ก ์๋ํ๋๋ก ํ ์์์์ต๋๋ค. ๋จ์ง ์ด๋ฌํ ํ ํ๋ฆฟ์ด ์๋ํ์ง ์๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํธ์ง : ๊ทธ๋์ var emptyRequest = require('sendgrid-rest').request
๋ฅผ var emptyRequest = sg.emptyRequest()
๋ฐ๊พธ๊ณ ์ด๋ฉ์ผ์ ๋ณด๋
๋๋ค. ํ
ํ๋ฆฟ ๋์์ธ์ด๋ ์ด๋ฏธ์ง์ ์์์ด ์์ต๋๋ค.
@bcootner ,
์ํ๊น๊ฒ๋ ๊ทํ์ ์ค๋ฅ๋ฅผ ์ฌํ ํ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ์์ ์์๋ ๋จ๊ณ๋ฅผ ๋์ ๋๋ฆฌ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. curl์ ํตํด ์ด๋ฉ์ผ์ ๋ณด๋ผ ์ ์์ผ๋ฏ๋ก API ํค๊ฐ ์ํธํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ ํ๋ฆฟ ID์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
mail.setTemplateId("5a****-*******-******-9")
๋ฅผ ์ ๊ฑฐํ๋ฉด ์ด๋ฉ์ผ์ด ์ ์ก๋ฉ๋๊น?
@thinkingserious ๊ทธ๋์ setTemplateID๋ฅผ ์ ๊ฑฐํ๋ฉด "Hello World from the SendGrid Node.js Library"๋ผ๋ ํ ์คํธ๋ฅผ ๋ณด๋ ๋๋ค.
๋ด ํธ์ง ๋ด์ฉ์ ๋ณด์๋์ง ํ์คํ์ง ์์ง๋ง var emptyRequest = require('sendgrid-rest').request
๋ฅผ var emptyRequest = sg.emptyRequest()
๋ก ๋ฐ๊พธ๋ฉด ๋ด ํ
ํ๋ฆฟ์ ํ
์คํธ๊ฐ ์ ์ก๋์ง๋ง ์์์ด ์์ต๋๋ค (๊ธ๊ผด ์์, ์ด๋ฏธ์ง ์์). ์ด์ ์ฝ์์์ ๋ค์๊ณผ ๊ฐ์ ์ธ์๋ฌผ์ ์ป์ต๋๋ค.
2016-07-13T00:01:07.514157+00:00 app[web.1]: date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514159+00:00 app[web.1]: connection: 'close',
2016-07-13T00:01:07.514157+00:00 app[web.1]: date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514158+00:00 app[web.1]: 'content-type': 'text/plain; charset=utf-8',
2016-07-13T00:01:07.502390+00:00 app[web.1]: 202
2016-07-13T00:01:07.502454+00:00 app[web.1]:
2016-07-13T00:01:07.514155+00:00 app[web.1]: { server: 'nginx',
2016-07-13T00:01:07.514159+00:00 app[web.1]: connection: 'close',
2016-07-13T00:01:07.514161+00:00 app[web.1]: 'x-frame-options': 'DENY' }
๋ญ๊ฐ 'ํ ์คํธ / ์ผ๋ฐ'์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์คํ์ง ์์ต๋๋ค. ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์๋ ํ์ธ์ @bcootner , ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๊ณ ๋ช ์๊ฐ ๋์ ๋จธ๋ฆฌ๋ฅผ ๊ธ์ ์ด์ง๋ง ํด๊ฒฐํ์ต๋๋ค. ์ค์ ๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ถํ์ํ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์ด ํ์ํ ๊ฒ ๊ฐ์ง๋ง, ์ฌ๊ธฐ์ ๋ด ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
_Params_
{
":name": "someName",
":email": "someEmail"
}
. :email
๋ฐ :name
๋ ์ด๋ฉ์ผ ํ
ํ๋ฆฟ์์ ๋ด ๋ณ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ -email-
๋๋ ์ฌ์ฉ์๊ฐ ๋ณด์ ํ ๋ชจ๋ ํญ๋ชฉ์ด ๋ ์ ์์ต๋๋ค. let sendTemplateMail = (from, to, subject, message, template, templateVariables, successCallback, errorCallback) => {
var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY),
helper = require('sendgrid').mail,
content_text = new helper.Content("text/plain", message),
content_html = new helper.Content("text/html", message),
request = sg.emptyRequest(),
email_to = new helper.Email(to),
email_from = new helper.Email(from),
mail = new helper.Mail(email_from, subject, email_to, content_text),
personalization = new helper.Personalization();
personalization.addTo(email_to);
personalization.setSubject(subject);
mail.setTemplateId(template);
mail.addContent(content_html);
for(var key in templateVariables) {
if(templateVariables.hasOwnProperty(key)) {
var substitution = new helper.Substitution(key, templateVariables[key]);
personalization.addSubstitution(substitution);
}
}
mail.addPersonalization(personalization);
request.method = 'POST';
request.path = '/v3/mail/send';
request.body = mail.toJSON();
sg.API(request, (json) => {
if(json.statusCode >= 300) {
errorCallback(json);
} else {
successCallback(json);
}
});
}
๋ฌธ์์๋ ์ค์ ๋ก ๊ธฐ๋ณธ์ ์ด๊ณ ๊ฐ๋จํ ์์ ์ ํจ๊ป ๋ช ๊ฐ์ง ๋ฆฌํฉํ ๋ง์ด ํ์ํฉ๋๋ค. ๋ด ๊ธฐ๋ฅ์ด ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :)
@ByEmke ๊ทํ์ ์ง์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ํฐ์ ์ธ ์ฌ์ด์ฆ์ ์ฐํธ ์ฃผ์๋ฅผ [email protected] ์ผ๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด ์ฃผ์๊ฒ ์ต๋๊น?
๋ฌธ์์ ๊ด๋ จํ์ฌ ๋ฉ์ผ ๋์ฐ๋ฏธ ์์ฒด๋ฟ๋ง ์๋๋ผ ๋ฆฌํฉํฐ๋ง์ด ์งํ ์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ๋ถ์ ๋ชจ๋ ํผ๋๋ฐฑ์ ์์งํ๊ณ ์์ผ๋ฉฐ ๋ค์ ๋ฐ๋ณต์ ๊ธฐ๋ํฉ๋๋ค.
๋ํ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ ์ฌ์ ํ ์ฝํ ์ธ ๋ฅผ ์ค์ ํด์ผํ๋ค๋ ํฐ ํผ๋์ด ์์ต๋๋ค. ๋คํํ๋ ๊ณง ๋ณ๊ฒฝ ๋ ๊ฒ์ ๋๋ค (์ผ).
@bcootner ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ชป ๋ฐ์๋ค๊ณ ์๊ฐํฉ๋๋ค. content_html = new helper.Content("text/html", message)
ํฉ๋๋ค. ๋คํํ๋์ด ์๊ตฌ ์ฌํญ์ ๋ฉฐ์น ๋ด์ ์์ด์ง๊ณ ํ์ฌ ์ฐ๋ฆฌ ํ์ ํ
ํ๋ฆฟ์ ์ง์ ํ ๋ ๋ ์ด์ ์ฝํ
์ธ ๋ฅผ ์ค์ ํ ํ์๊ฐ ์๋๋ก์ด ๋์์ ๋ณ๊ฒฝํ๊ณ ์์ต๋๋ค.
@ByEmke @thinkingserious ์ด ๋ฌธ์ ์ ๋ํ ๊ทํ์ ๋์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด์ ๋ฐค์ ๋ค์ ์ฝ๋๋ก ์์ ํ ์์์์ต๋๋ค.
var sg = require('sendgrid').SendGrid("SendGrid API Key" or <environment variable>)
function sendEmail(tempID){
var helper = require('sendgrid').mail;
from_email = new helper.Email("[email protected]")
to_email = new helper.Email("[email protected]")
subject = "Dummy Subject"
content = new helper.Content("text/html", "dummy content")
mail = new helper.Mail(from_email, subject, to_email, content)
substitution = new helper.Substitution("-name-", "User's Name")
mail.personalizations[0].addSubstitution(substitution)
mail.setTemplateId(tempID)
var requestBody = mail.toJSON()
var requestPost = JSON.parse(JSON.stringify(sg.emptyRequest()))
requestPost.method = 'POST'
requestPost.path = '/v3/mail/send'
requestPost.body = requestBody
sg.API(requestPost, function (response) {
console.log(response.statusCode)
console.log(response.body)
console.log(response.headers)
})
}
๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํนํ ํ ํ๋ฆฟ ๋ฐ ๊ธฐํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ๋ฌธ์๋ฅผ ๋ฐ๋ฅด๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค.
helper () ๊ตฌ๋ฌธ๋ณด๋ค request.body = {} ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค. ์ด๊ฒ์ (์ ์ด๋ ๋๋ฅผ ์ํด) ์ผ์ ๋ ์ฅํฉํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธํ๊ณ , ์์ ๋ฅผ ์ดํด๋ณด๊ณ , ์ฌ๊ธฐ์ ๋ค์ ์์ ๋ค์ ์๋ํ๋ ๋ฐ ์๋นํ ์๊ฐ์ ๋ณด๋๊ณ , ๋ฌธ์ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ ์ฝํ ์ธ ๋ฅผ ์ค์ ํด์ผํ๋ค๋ ์ฌ์ค์ ์์ ๋์ต๋๋ค. ์์. ์ด๋ฐ ๊ฒ๋ค์ ๋น์ ์ ๋ฏธ์น๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด์จ๋ ์์ ์์ ๋ฅผ ์ ๊ณต ํ @ByEmke ์๊ฒ ๋ณด๋ ๋๋ค .
@peterkuiper (๋๋ Adam์ด๋ผ๊ณ ๋งํด์ผํฉ๋๊น :))
์๊ฒฌ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ๊ฐ์ ํ ์์๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค.
๋ถ๋ช ํ ๋งํด์ ์ด๊ฒ๋ค์ ์ธ๊ธํ๊ณ ์์ต๋๊น? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md
์ฝํ ์ธ ๋ฌธ์ (๋ชจ๋ ๋ค์์ต๋๋ค :))์ ๊ด๋ จํ์ฌ ๊ฑฐ์ ํด๊ฒฐ๋์์ต๋๋ค. ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ ์ฝํ ์ธ ๋ฅผ ์ค์ ํ ํ์๊ฐ์๋ ๋ฆด๋ฆฌ์ค๋ฅผ API์ ๋ฐฐํฌ ํ ๊ฒ์ ๋๋ค. ๋ณ๊ฒฝ์ผ๋ก ํ ํ๋ฆฟ ํ๊ฒฝ์ด ํจ์ฌ ๋ ์ข์์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@thinkingserious Github๋ก ๋ฐ๋ก ์ด๋ํด์ผํ๋ ๋์ sendgrid.com (์ : https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)์ ๋ฌธ์๋ฅผ ํ์ธํ์ต๋๋ค. ์ด ์ ์ฅ์์ README๋ฅผ ํ์ด๋ณด๊ณ ์์ ๋ฅผ ํ์ธํ ํ USAGE.md๋ฅผ ์์ ํ ๋์ณค์ต๋๋ค. USAGE.md ํ์ผ์ ๋ด๊ฐ ์ ํธํ๋ ํ์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ sendgrid.com์ ์ฌ๋ ค์ผํ๋ ํ์ผ์ด์ด์ผํฉ๋๋ค. :) ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํด ์์ง ํ์คํ์ง ์์ง๋ง ์ง์ ์์ ๋ด๊ฑฐ๋ ์ฐพ์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฌธ์.
๋๋ ๊ทธ ํ์ผ์ ์ฐพ์๋ณด๊ณ ํผ๋์ค๋ฌ์ํ๋ ์์์ ์๋ฅผ ์ฐพ์์ต๋๋ค.
var request = sg.emptyRequest()
request.queryParams["start_time"] = '1'
request.queryParams["limit"] = '1'
request.queryParams["end_time"] = '1'
request.queryParams["offset"] = '1'
request.method = 'GET'
request.path = '/v3/suppression/blocks'
sg.API(request, function (response) {
console.log(response.statusCode)
console.log(response.body)
console.log(response.headers)
})
start_time, limit, end_time ๋ฐ offset์ ์ด๋ค ์ ํ์ด๋ฉฐ ์ด๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? queryParams๊ฐ ๋ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ request.body๊ฐ ์๋๊ฐ?
์ฌ์ฉ์ ๊ฐ์ด๋์ ๋ํ ๋งํฌ (์ ํ ๋์์ด๋์ง ์์)๊ฐ ์์ง๋ง https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html ์ ์ ๋ฆฌํ๋ API ๋ฌธ์์ ๋ํ ๋งํฌ๊ฐ ์์ด์ผํฉ๋๋ค
๋ฐ๋ผ์ ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ์ ์์๋ ์์น๋ฅผ ํ์ ํ๊ธฐ ์ํด ์๋ค๋ก ์ด๋ํด์ผํฉ๋๋ค.
@peterkuiper์ ํ๋ฅญํ ํผ๋๋ฐฑ!
๋๋ ๋น์ ์ ๋นผ์๊ณ ์ถ์ต๋๋ค. ํฐ์ ์ธ ์ฌ์ด์ฆ์ ์ฐํธ ์ฃผ์๋ฅผ [email protected]์ผ๋ก ๋ณด๋ด์ฃผ์ธ์
์ฟผ๋ฆฌ ๋ฐ ์๋ต ๋ณธ๋ฌธ์ ๋ํ ์ค๋ช ์ ํฌํจํ๋๋ก USAGE.md ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
ํ ํ๋ฆฟ๊ณผ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ฉ์ผ ์๋ ํฌ์ธํธ์ ๋ํดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์ฐ๋ฏธ๋ฅผ ๋ง๋ค๊ณ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ์๋ฅผ ํฌํจํ๋ ๊ณํ์ด ์์ต๋๋ค. ๋ํ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ ์ฝํ ์ธ ๋ฅผ ์ง์ ํ์ง ์์๋๋๋ ์์ ์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ํฐ ํผ๋์ ์์ฒ์ ๋๋ค.
@thinkingserious ์ฟจ, ๊ฐ์ฌํฉ๋๋ค :) ์ด๋ฉ์ผ์ ๋ณด๋์ต๋๋ค!
๋ด๊ฐ ๊ทธ ๊ณผ์ ์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ํ์ ์ฝ๊ฐ์ ํผ๋์ ์ผ๊ธฐํ๊ณ ์์ต๋๋ค). ๋ด ํ์ ์ค ํ ๋ช ์ด ์ผ๋ถ ๊ธฐ๋ฅ (์ : ์ด๋ฉ์ผ ํ์ธ)์ ๋ํ ํ ํ๋ฆฟ์ ๋ง๋ค๊ณ verify-nl, verify-en ๋ฑ์ ์ถ๊ฐํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํ ํ๋ฆฟ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ์ง๋ง ํ ์คํธ (๋ค๋ฅธ โโ์ธ์ด) ๋ง ๋ค๋ฆ ๋๋ค. ๋๋ <% subject %> en <% body %>๋ฅผ ๋ณด์๊ณ ๊ทธ๊ฒ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์๊ธฐ ๋๋ฌธ์ (TL; DR์ ์๋ง๋ ๋ด ๋ถ๋ถ์์) API๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ด๋ถ ๋์ฒด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
"์ ์์ ์ธ"๊ดํ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ ํ๋ฆฟ์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ง์ ์์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. "ํ ํ๋ฆฟ ํ ํ๋ฆฟ"(์ : ๋จธ๋ฆฌ๊ธ / ๋ฐ๋ฅ ๊ธ / ๋ชจ๋ ๋ถ๋ถ)์ ๋ง๋ค ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋ํ ๋ค์ํ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ 300 ๊ฐ์ ํ ํ๋ฆฟ ์ ํ์ ์ฝ๊ฒ ๋๋ฌ ํ ์ ์์ต๋๋ค (์ด ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค).
์ง๋ฌธ์ด ์ดํด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :)
@peterkuiper ,
๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๊ฐ์ ๋ด๋์์ต๋๋ค. ๋๋ ๋ด๊ฐ ๋ฐ๊ฒฌ ํ ๊ฒ์ผ๋ก ์๋ต ํ ๊ฒ์ด๋ค. ๊ฐ์ฌ!
@thinkingserious ๊ฒฐ๊ตญ 2.0.0
๋ฒ์ ์ ์ฌ์ฉํ๊ฒ ๋์๊ณ ์๋ ๋ฐฉ์์ด ์ ๋ง ๋ง์์
var client = require("sendgrid")("key");
client.send({
to: "[email protected]",
from: "[email protected]",
subject: "subject",
text: "hello"
// Or using the html property:
// html: "Hello <strong>World!</strong>!"
}, fn);
๋ฒ์ 3.x.x
์์ ์ด๋ป๊ฒ ๋ณด์ผ์ง๋ณด๊ณ ์ถ์ต๋๋ค. ํ์ฌ ์์ ๊ฐ ์ ๋ง ํผ๋ ์ค๋ฝ์ต๋๋ค.
@IonicaBizau ์ข์ ํผ๋๋ฐฑ!
์ฐ๋ฆฌ๋ ๋ค์ ๋ฐ๋ณต์ ์ํด ๋น์ ์ ์๊ฐ์ ํ์คํ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ ๊ทธ๋๋ 3.x.x
์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์๊ณ ์ถ์ต๋๋ค.
์ด ํด๋ผ์ด์ธํธ๋ v2 ๋ฉ์ผ ์๋ ํฌ์ธํธ์์ ๋ถ๋ฆฌํ๊ณ v3 ์๋ ํฌ์ธํธ์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์ฒ์๋ถํฐ ๋ค์ ์์ฑ๋์์ผ๋ฏ๋ก ์ผ๋์ผ ๋งคํ์ด ์์ต๋๋ค.
์ฆ, ๋ฉ์ผ ๋์ฐ๋ฏธ์ ๋ชฉ์ ์ v2 ์์์ฒ๋ผ ์ฝ๊ฒ ํธ์ถ ํ ์์๋ ์ง์ ์ ๋๋ฌํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ๊ฑฐ๊ธฐ์ ์์ง ์์์ผ๋ฉฐ ์ฒ์์ผ๋ก ๋์๊ฐ ๋ ๋ง์ ๋ฐ๋ณต์ ๊ธฐ๋ํฉ๋๋ค.
@thinkingserious ๋๋ ๊ทธ๊ฒ์
var
๋๋ let
๋๋ ์ ์ฌํ ํค์๋์์ด ์ ์ธ ๋จ)๊ฐ ์๊ธฐ ๋๋ฌธ์ ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ : from_email = new helper.Email("[email protected]")
๋์ var from_email = ...
new helper.Email
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋น์ฐํธ์ ์
๋๋ค. ์ด๊ฒ์ ์๋ง๋ ๋ชจ๋ ๋ด๋ถ์ ํ์ ์์ค ๊ธฐ๋ฅ์ผ๋ก ๋ํ ๋ ์ ์์ต๋๋ค. Content
, Mail
๋ฑ์ ๋ํด์๋ ๋์ผํฉ๋๋ค.method
, path
๋ฐ body
์๋์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ๋ค์ ๋งค์ฐ ๋น์ฐํธ์ ์
๋๋ค.err, data, ...
ํ์์ด์ด์ผํฉ๋๋ค (์๋ต ๋์ ).์์ปจ๋ IMHO, _quick start_๋ ์ด๋ฉ์ผ ์ ์ก์์ํ ์ ์์ค ๊ตฌํ์ ๋๋ค. ๋ ๊น์ ๊ธฐ๋ฅ์๋ ์ ์ฉ โโํ ์ ์์ง๋ง _ ๋น ๋ฅธ ์์ _์๋ ์ ํฉํ์ง ์์ต๋๋ค. ๐
๋๋ผ์ด ์๋น์ค์ ๋ชจ๋์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. โจ
@IonicaBizau ,
๊ฐ์ฌํฉ๋๋ค!
์ฐ๋ฆฌ๋ ๋ฉ์ผ ๋์ฐ๋ฏธ์ ๋ค์ ๋ฐ๋ณต์ ๊ตฌ์ถ ํ ๋ ๊ทํ์ ์๊ฐ์ ๋ถ๋ช ํ ์ธ๊ธ ํ ๊ฒ์ ๋๋ค.
๋ง์ต๋๋ค.์ด ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ API์ ๋ํ ์์ ๋ํผ์ ๋๋ค. ๊ณํ์ ๋น์ ์ด ํ ์ผ๊ณผ ๊ฐ์ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ง์ ์ผ๋ก ๊ธฐ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์ ๋๋ค!
์ปค๋ฎค๋ํฐ์ ๋ํ ๊ทํ์ ์ง์๊ณผ ๊ธฐ์ฌ๋ฅผ ์ํด ๋ช ๊ฐ์ง ์ฅ์์ ๋ณด๋ด ๋๋ฆฌ๊ณ ์ํฉ๋๋ค. ํฐ์ ์ธ ์ฌ์ด์ฆ์ ์ฐํธ ์ฃผ์๋ฅผ [email protected] ์ผ๋ก ๋ณด๋ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ ์ ํ๋ค๊ณ ํ๋จ๋๋ฉด ์ธ์ ๋ ์ง ์ถ๊ฐ ํผ๋๋ฐฑ์ ์ถ๊ฐํ์ญ์์ค. ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํํ
๋ค์๊ณผ ๊ฐ์ด ํ ์๋ ์์ต๋๋ค.
var sg = require('sendgrid').SendGrid('API_KEY');
var request = sg.emptyRequest()
request.body = {
"content": [
{
"type": "text/html",
"value": "<html><p>Hello, world!</p></html>"
}
],
"from": {
"email": "[email protected]",
"name": "My Name"
},
"personalizations": [
{
"to": [
{
"email": "[email protected]",
"name": "John Doe"
}
]
}
],
"template_id": "TEMPLATE_ID",
};
request.method = 'POST'
request.path = '/v3/mail/send'
sg.API(request, function (response) {
console.log(response.statusCode)
console.log(response.body)
console.log(response.headers)
});
๋์ฐ๋ฏธ ๊ตฌ๋ฌธ๋ณด๋ค์ด ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค. ์์ ๋ฅผ ์ดํด๋ณด๋ฉด ์ ๊ฒ ๋ง์ ๋์์ด๋์์ต๋๋ค.
https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js
HTH
ํธ์ ๋ด์ ๊ฐ๊ธฐ ํ์คํ ํ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๊ธฐ๊บผ์ด ๋์๋๋ฆฝ๋๋ค! ๐
@peterkuiper ์ ๋ ์๋ํ์ง๋ง text/html
๋ฅผ html
๋ก ๋ฐ๊พธ๋ ์ค์๋ฅผ ์ ์ง๋ ๊ณ ๋ด์ฉ์ด ์ฒจ๋ถ ํ์ผ๋ก ๋ํ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฒ์ ์ ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ์ ํ โโ์ ์์ค์ผ๋ก ๋ณด์
๋๋ค ( request.method = ...
, content
๋ฐฐ์ด์์ MIME ์ ํ ์ ์ก, ์ฝ๋ฐฑ์์ response
์ธ์ ๋ฑ).
๊ฐ์ฌํฉ๋๋ค @peterkuiper!
์ง๋์ฃผ์ README์ ์์ ์คํ์ผ์ ์ถ๊ฐํ์ต๋๋ค. :)
@IonicaBizau ,
์, ์ ์์ค ํญ๋ชฉ์ ๊ณง ์จ๊ฒจ ์ง ๊ฒ์ ๋๋ค.
@thinkingserious ์์ฒญ ํญ๋ชฉ์ด ๊ณง ์จ๊ฒจ ์ง ๊ฒ์ด๋ผ๋ ์์์ ๋ฃ๊ณ ๊ธฐ์ฉ๋๋ค ๐
@IonicaBizau ์ ํ๋ฅญํ ์ ์์ ์ด์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ "๊ฐ์ธํ"์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ดํฉ๋๋ค.
var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x);
sg.addBcc(email);
sg.addBcc(email);
sg.addHeader(header);
SDK๋ฅผ ํตํด์ด ์์ค์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ๋ถํ์ ํด ๋ณด์ ๋๋ค.
๋ํ ์ด๊ฒ์ด ์ด๋ฏธ ๊ธฐ๋ฅ์ธ์ง ํ์คํ์ง ์์ง๋ง ์ด๋ฌํ ํธ์ถ์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x)
.addBcc(email)
.addBcc(email)
.addHeader(header)
.send();
๊ฐ์ฌํฉ๋๋ค. ์ข์ ์ผ์ ๊ณ์ํ์ธ์ ๐
@jamesdixon ,
์ถ๊ฐ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ ๋ง์ ๊ตฌํ ์จ๊น์ ํ์ฑํํ๊ธฐ ์ํด ๋ฉ์ผ ๋์ฐ๋ฏธ๋ฅผ ํฅ์์ํฌ ๋๊น์ง @adambuczynski ์ ๋ฉ์ง ํ ์์ฒญ์ ํ์ธํ์ญ์์ค : https://github.com/sendgrid/sendgrid-nodejs/pull/261. ํน์ ์์ด๋์ด๋ฅผ ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ์ง๋ ์์ง๋ง ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๋ ๋จ๊ณ์ ๋๋ค.
@thinkingserious ์ ์์ค ์์ฒญ ํญ๋ชฉ์ด ๊ณง ์จ๊ฒจ ์ง ๊ฒ์ด๋ผ๊ณ ์ธ๊ธํ์ต๋๋ค. ์ด๋ฏธ ๊ณํ๋ ๊ฒ์ด ์์ต๋๊น? ๋๋ ์ด์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์๋๋ฐ, ์ ์ฒด API์ ์ก์ธ์คํ๋ ๊ฒ์ด ์ข์ง๋ง sendgrid-rest
์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒํ๋ฉด์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐํด์ผ ํ ์ผ์ ์ด๋ฉ์ผ์ ๋ณด๋ผ ์ ์๋๋ก ํ์ฉํ๊ณ ์ด๋ฉ์ผ ์ ์ก API ๋ง ๋
ธ์ถํ๋ ๊ฒ์
๋๋ค.
๊ทธ๊ฒ์ ๋น์ ์ด ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌ ํ๊ณ ์ด ํจํค์ง์ ์ด์ ์ ์กฐ๊ธ ์ขํ์ @jamesdixon์ด ์ ์ํ ๊ฒ๊ณผ ๊ฐ์ ์ฒด์ธ ๋ฑ์ผ๋ก ๋ ๊นจ๋ํ API๋ฅผ ํ์ฉํ์ต๋๋ค.
@adambuczynski ,
์ฐ๋ฆฌ์ ๊ณํ์ ํฌํผ๋ฅผ ํตํด ์ถ์ํ ๊ณ์ธต์ ์คํํ๋ ๊ฒ์ ๋๋ค. ๋ฉ์ผ์ด ์ฒซ ๋ฒ์งธ์ด์ง๋ง ๊ฐ๊น์ด ์ฅ๋์ ํ์ ์ฌ์ฉ์ ๊ด๋ฆฌ ๋ฐ ํ ํ๋ฆฟ์์ํ ๋ฉ์ผ์ ์ถ๊ฐ ํ ๊ณํ์ ๋๋ค. ํ์ง๋ง ๋จผ์ ๋ฉ์ผ ๋์ฐ๋ฏธ๋ฅผ ๋ค๋ฌ๊ณ ํ์ค์ผ๋ก ๋ง๋ค์ด์ผํฉ๋๋ค.
๋ง์ต๋๋ค.์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ sendgrid-rest์ ๋นํด ๋งค์ฐ ์์ ๋ ์ด์ด์ด๋ฉฐ ๋จ์ํ ์์ , USAGE ํ์ผ ๋ฐ ๋จ์ ํ ์คํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค (์ด๊ฒ๋ค์ ๋ชจ๋ Swagger ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ๋์ด ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋ ํฌ์ธํธ์ ๋ํ ํฌํผ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ , ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์๋ฃํ๊ณ ํด๋น ๊ธฐ๋ฅ์ ํต์ฌ๋ ์๋ํ ํ ๊ณํ์ ๋๋ค. ์ํฌ ํ๋ก ๋ฐ ์ฌ์ฉ ์ฌ๋ก๋ ์์์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
ํฅํ ๋ช ์ฃผ / ๊ฐ์ ๋์ ์ถ๊ฐ ํผ๋๋ฐฑ์ ์ํด GitHub์์ ๋ก๋๋งต์ ๊ณต๊ฐ ํ ์์ ์ ๋๋ค.
๋ํ 8 ์ ๋ง๊น์ง Incoming Parse Webhook์ ๋ํ ์ง์์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐ ํ ์์ ์ ๋๋ค.
์ด ์ง๋ฌธ์ ํด์ฃผ์ ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ ์ ๋ต๋ณ์ด ๊ทํ์ ์ปค๋ฎค๋ํฐ์ ์ถ๊ฐ ํผ๋๋ฐฑ์ ์ด๋ฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด SendGrid๊ฐ ์ง์ํ๊ณ ์ฃผ๋ํ๋ ์ปค๋ฎค๋ํฐ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@thinkingserious ์ ๋ฐ์ดํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์์ผ๋ก sendgrid nodejs ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ญํ ์ ์ํํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค.
์ด ๋จ๊ณ์์ Parse ์ง์์ ์ถ๊ฐํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ด๋ 1 ์์ Parse ์๋น์ค๊ฐ ์ค๋จ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@thinkingserious ๋ด๊ฐ ์ฌ๊ธฐ์ ๋์ธ ์์๋ ๊ฒ์ด ์๋ค๋ฉด, ๊ทธ๋ฅ ๋๋ฅผ ํํ๋ ๊ฒ์ ์์๋ค. ํ ์๋ง ์๋ค๋ฉด ํดํน ํ ์์์ด ๊ธฐ์ฉ๋๋ค. :๋ฏธ์:
@adambuczynski ์ข์ ์์์ ๋๋ค! ๋ํ ํ ๋ฆฌํ์คํธ๊ฐ ์ ์์ ๊ฐ๊น์์ง๊ณ ์์ต๋๋ค. ๋ค์ ์ฃผ ์ด์ ํฉ๋ณ ๋ ์์์ ๊ฒ ๊ฐ์์.
Parse์ ๊ด๋ จํ์ฌ ์์ง ๊ณต์์ ์ผ๋ก ํ๊ธฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ง ์์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ์ ์งํํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ํ ์คํธ์ ์ผ๋ถ์ ๋๋ค.
@IonicaBizau ,
๊ฐ์ฌํฉ๋๋ค! ๊ทํ์ ์ง์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๋ฉ์ผ ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์ ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๋ helper.Mail(from_email, subject, to_email, content)
๊ฐ ์์ ์๋ฅผ ์ค์ ํ๊ธฐ ์ํด personalization.addTo
์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ ์ฐจ๋ ธ๋ค. ๋๋ ์ด๊ฒ์ด ์์ ์์ ๋ฐฐ์ด์ด ์๋ 1 ๋ช
์ ์์ ์์๊ฒ๋ง ์๋ํ๋ค๊ณ ๋ฏฟ๋๋ค (์๋ง ๋ด๊ฐ ํ๋ ธ์์ง๋ ๋ชจ๋ฅธ๋ค) ๊ทธ๋ฆฌ๊ณ ๋์ฐ๋ฏธ๋ setTo
์ ๊ณตํ์ง ์๋๋ค
let personalization = new helper.Personalization();
์ฌ์ฉํ์ฌ ์ง์ ๊ฐ์ธํ๋ฅผ ์ค์ ํ๋ค๋ฉด personalization.tos = [email, email]//email=new helper.Email(email_address, name)
) ์ํ ํ ์ ์์ต๋๋ค. ์์ ํฉ๋๊น? ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
@ albert-the-creator ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
//Helpers
const Mail = sendgrid.mail.Mail;
const Email = sendgrid.mail.Email;
const Personalization = sendgrid.mail.Personalization;
//Create new mail object
let mail = new Mail();
//Create recipients
let recipients = new Personalization();
recipients.addTo(new Email(data.to, data.toname));
//Set recipients
mail.addPersonalization(recipients);
์๋ฅผ ๋ค์ด ๋ฃจํ์์ recipients.addTo
์ค์ ๋ฐ๋ณตํ์ฌ ์ฌ๋ฌ ์์ ์๋ฅผ ์ถ๊ฐ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๋ฉ์ผ๊ณผ ๊ฐ์ธํ ํด๋์ค๋ก ๋๋์ด ๋งค์ฐ ์ฅํฉํฉ๋๋ค. ๋๋ก๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ถ๊ฐํ์ฌ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๋ณด๋ด๊ณ ์ถ์ ๋๋ ์๋๋ฐ,์ด๋ฅผ ์ํํ๋ ค๋ฉด ๋ง์ ์ฝ๋ ๋ผ์ธ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ albert-the-creator,
์ด ์์ฑ์๋ ์ฌ๋๋ค์ด ํ๋์ ์ด๋ฉ์ผ์ ๋ ์ฝ๊ฒ ๋ณด๋ผ ์ ์๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก "hello email"๊ธฐ๋ฅ์ ๋๋ค.
์ฌ๋ฌ ์ด๋ฉ์ผ์ ๊ฒฝ์ฐ ๋ค์ ์์ ๋ฅผ ๋ฐ๋ฅด๊ณ ์ถ์ ๊ฒ์ ๋๋ค (์ด๋ฏธ ๊ฐ์ธํ๋ฅผ ์ค์ ํ์ฌ์ด ๊ฒฝ๋ก๋ฅผ ์์ ํ์ผ๋ฏ๋ก) : https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail /example.js#L15
https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html์์ ๊ฐ์ธํ์ ๋ํด ์ฝ์ด ๋ณด๋ ๊ฒ๋ ์ ์ฉ ํ ์ ์์ต๋๋ค.
๋์ฐ๋ฏธ๋ ํ์คํ ์งํ ํ ๊ฒ์ด์ง๋ง ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฃผ์ ํฌ์ธํธ ๋ฆด๋ฆฌ์ค๋ก ํ์๋ฉ๋๋ค. ํ์ง๋ง API๊ฐ ๋ง์ด ๋ณ๊ฒฝ ๋ ๊ฒ์ผ๋ก ์์ํ์ง ์์ต๋๋ค.
@adambuczynski ,
์ฐธ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ด์ ๊ฐ์ ์ถ๊ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๊ณ ์๋ฅผ ๋ค์ด ํ ํ๋ฆฟ์ด์๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋๋ก ๋์ฐ๋ฏธ๋ฅผ ์ ๋ฐ์ดํธํด์ผํฉ๋๋ค.
@thinkingserious ํฌํผ API๋ ๋ค์ ์๊ฐ์ด์์ ๋ ๋ฆฌํฉํ ๋ง / ๊ฐ์ ์ ๊ด์ฌ์ด์๋ ๊ฒ์ด ์์ต๋๋ค. :)
@adambuczynski ,
๋ฉ์ง๊ตฐ์. ์์ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ์ ๋ฅผ ํํด์ฃผ์ธ์. ์๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๋น์ ๋ณด๋ค ๋จผ์ ์์ํ๋ฉด ๋ด๊ฐ ๋น์ ์ ํํ ๊ฒ์ ๋๋ค.
@bcootner ์ ์ฝ๋๋ฅผ ์ฌ์ฉ
@otmezger ,
ํ์ ์กฐ์น์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ด๋ฒ ์ฃผ์์ด ์์ ๋ฅผ ์์ ์ค์ด๋ฉฐ README์ ๋งํฌ๋์ด ์์ต๋๋ค.
ํ
ํ๋ฆฟ ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ๋์ฐ๋ฏธ load
๋ฉ์๋๋ฅผ ํตํด HTML ๋ฐ ํ
์คํธ ํ์ ํ
ํ๋ฆฟ๊ณผ ๋ถ๋ถ์๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
/**
* Load an email (both plain text and html)
*/
load(email, data, req) {
//Get filenames
const PARTIAL_HTML = path.resolve('./app/components/' + email + '.html');
const PARTIAL_TEXT = path.resolve('./app/components/' + email + '.txt');
//Append some globals
if (req) {
Object.assign(data, {
app: {
title: req.app.locals.APP_TITLE,
version: req.app.locals.APP_VERSION,
url: req.app.locals.APP_BASE_URL,
},
date: {
year: moment().format('YYYY'),
date: moment().format('DD-MM-YYYY'),
},
});
}
//Return promise
return Promise.all([
Promise.all([
readFile(TEMPLATE_TEXT, 'utf8'),
readFile(PARTIAL_TEXT, 'utf8'),
]).spread((template, partial) => {
return template.replace('{{partial}}', partial);
}),
Promise.all([
readFile(TEMPLATE_HTML, 'utf8'),
readFile(PARTIAL_HTML, 'utf8'),
]).spread((template, partial) => {
return template.replace('{{partial}}', partial);
}),
]).then(result => result.map(contents => replaceData(contents, data)));
},
๊ทธ๋ฐ ๋ค์ Sendgrid์ ํจ๊ป ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ์ป๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
let email = mailer.load('user/emails/verify-email-address', data, req)
.spread((text, html) => ({
to: user.email,
from: req.app.locals.EMAIL_IDENTITY_NOREPLY,
subject: 'Verify your email address',
text, html,
}));
ํธ๋ค ๋ฐ ํ
ํ๋ฆฟ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋๋ก ์์ ๋ฅผ ์ฝ๊ฒ ์ ์ฉ ํ ์ ์์ต๋๋ค. ์์ ์์์ replaceData
๋์ฐ๋ฏธ๋ ํธ๋ค ๋ฐ์ ๊ฐ์ ํ๊ทธ๋ฅผ ์ ๊ณต๋ ๋ฐ์ดํฐ๋ก ๋์ฒดํ๋ ๊ฐ๋จํ ํจ์์
๋๋ค.
์ด๊ฒ์ด ๊ด๋ จ์ฑ์ด ์๋์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ง๋ง "๋ฉ์ผ ๋์ฐ๋ฏธ"๋ฅผ ์ฌ์ฉํ์ง ์์ ํค์๋ฆด ์์๋ ์๊ฐ์ ์ ์ฝํ์ต๋๋ค. ์ด๊ฒ์ ๋๋ฌด ์ค๋งํ ํ ์๋์ ์ผ๋ก 2.0์ผ๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ์ต๋๋ค. ์ ํจํ V3 JSON์ ์์ฑํ๊ธฐ ์ํด ํฉํ ๋ฆฌ ์ ํ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด์ V3 API์ ๊ฐ์ ์ฌํญ์ ๋งค์ฐ ํฅ๋ถํฉ๋๋ค (์ค์ ๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์).
์ด๊ฒ์ ๋ด๊ฐ ์ฒ์์ ์ด๋ ค์์ ๊ฒช์๋ ๊ฒ์
๋๋ค. ์ ์๊ฐ์๋
๋์ฐ๋ฏธ๋ฅผ ๋ ํจ์จ์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋๋
ํต์ฌ sendgrid ๋ชจ๋์ ์ผ๋ถ๊ฐ๋์ด์๋ ์๋๋ค๊ณ ์ฃผ์ฅํ๊ธฐ๋ํฉ๋๋ค.
์ฐ๋ ค ์ฌํญ์ ๋ถ๋ฆฌํ๊ณ ์ฌ๋๋ค์ด์ด๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
๋ค์ ํ๋ฒ ์ดํด๋ณด๊ณ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์๊ฐํด ๋ณผ ์์์ ๊ฒ์
๋๋ค.
์ ์.
2016 ๋ 8 ์ 26 ์ผ ๊ธ์์ผ 05:48 Sean Lindo [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์๋ฅผ ๋ค์ด ์๋์ง ์๋์ง ํ์คํ์ง ์์ง๋ง "๋ฉ์ผ ๋์ฐ๋ฏธ"๋ฅผ ์ฌ์ฉํ์ง ์์์ผ๋ก์จ
๋๋ ํค์๋ฆด ์์๋ ์๊ฐ์ ์ ์ฝํ์ต๋๋ค. ์ด๋ ๊ฒ ๋ ํ์ ๋๋ค
์ผ๋ถ๋ฌ 2.0์ผ๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/sendgrid/sendgrid-nodejs/issues/252#issuecomment -242479491,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAd8Qu5iRLFQwoKlRd2fP5oioT1uLqB6ks5qjdV2gaJpZM4JAiac
.
@seanlindo ,
์๊ฒฌ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ค์์ ๋ฉ์ผ ๋์ฐ๋ฏธ์์ด์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์์ ๋๋ค. https://github.com/sendgrid/sendgrid-nodejs#without -mail-helper-class
๋ฉ์ผ ๋์ฐ๋ฏธ๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ด๋ฉฐ ๋ค์ ๋ฒ์ ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด๋๋๋ก ๊ทํ์ ๊ฐ์ ํผ๋๋ฐฑ์ ์์กดํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ํฐ์ผ์ ๋ง๋ค ์ ์๋๋ก ๋ฐ์ํ ํน์ ๋ฌธ์ ๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ํ ๋๊ธฐ์ด ์๋ก ์ด๋ํ๋ ๋ฐ ๋์์ด๋๋๋ก ๋ฉ์ผ ๋์ฐ๋ฏธ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฐฑ ๋ก๊ทธ ์์ ์ ํฌํ๋ฅผ ์ถ๊ฐํ๊ณ ์์ต๋๋ค. ๊ฐ์ฌ!
@adambuczynski ,
๋๋ ๋น์ ์ ๊ต์ฅํจ์ด ๊ณ์๋๋ ๊ฒ์ ๋ด ๋๋ค :)
์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค!
@julesbou ,
์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ์์ ๋ฅผ ์ ๊ณต ํ USE_CASES.md ํ์ผ์ ์์ํ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ํธ๋์ญ์ ํ ํ๋ฆฟ์ด์์ต๋๋ค. :)
์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค!
๐ป
ํธ์ ๋ด์ ๊ฐ๊ธฐ ํ๋ฃจ ์ ๋๋ง ์ฃผ์๋ฉด ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ค์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ค๋ ๋ ์ค ํ๋์ ๋๋ค. :)
๊ทํ์ ์๊ฒฌ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ ๋ฐ๋ณต์ ๋งค์ฐ ์ค์ ํ ๊ฒ์ด๋ฉฐ, ์ด๋ ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ ์ ์๊ฐ์ด ์์ผ์๋ค๋ฉด ์ ํฌ์ ์ ์์ ๋ณด์๊ฒ ์ต๋๊น? https://github.com/sendgrid/sendgrid-nodejs/issues/290
๊ฐ์ฌ!
@thinkingserious ๋๋์ด v3์ ๋์ ๋ ๋ชจ๋ Sendgrid ๋์ฐ๋ฏธ ํด๋์ค์ ๋ํด ์ ๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ฒ๋์์ต๋๋ค ... ๊ทธ๊ฒ๋ค์ด ๋๋ฌด ๋ง์์ ์ด๋ฉ์ผ์ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
Sendgrid์ ์ฝ๋๋ฅผ ๋ชจ๋ ์ ๊ฒํ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ๋จํ ๋ํผ ์ธ sendgrid-mailer ๋ฅผ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
Sendgrid์ ๋์ฐ๋ฏธ ํด๋์ค๋ ๋ฐฐํ์์ ์ ์ฉํ์ง๋ง ์ด๋ฉ์ผ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ธฐ ์ํด API์ ์ํธ ์์ฉํ๋๋ก ๊ฐ์ํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋
ธ๋ ์ฑ์ ์์ฑํ๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋์ฐ๋ฏธ์ ์ด๋ฆ์ ๋งค์ฐ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Mail
vs Email
.
๊ธฐ๋ณธ ์๊ฐ ๋ฌธ์ ๋ฅผ ์ ์ค๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class
์ด๊ฒ์ "I want to send an email"๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์๋ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ ์ 8 ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ข ์์ฑ์๋ก๋ํ๊ณ 15 ์ค์ ์ฝ๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.
ํฌํผ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ด๋ฉ์ผ JSON ์์ฒญ์ ํ์ ๊ตฌ์กฐ๋ฅผ ์๊ณ ์ง์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฑ์์ผํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ๋์ฉ๋๋ค. ํ ๋ฒ์ ์ค์๋ก ์์ฒญ์ด ์ฝ๊ฒ ์ค๋จ๋ฉ๋๋ค.
๊ทธ๋์ ๋ชจ๋ ๋์ฐ๋ฏธ ํด๋์ค ๋ก์ง์ ๊ฐ๋จํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด API ๋์ฐ๋ฏธ ๋ค์ ์ถ์ํํ์ฌ Sendgrid๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ์ด ๋ค์ ์ฝ๊ณ ์ฌ๋ฏธ์์ด์ง๋๋ค. :)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
//Load mailer and set API key (only needed once)
const mailer = require('sendgrid-mailer').config(API_KEY);
//Create email data
const email = {
to: '[email protected]',
from: 'Someone <[email protected]>',
subject: 'Hello world',
text: 'Hello plain world!',
html: '<p>Hello HTML world!</p>',
};
//Send away
mailer.send(email); //Returns promise
์์ฒญ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ตฌ์ฑ๋๋ฉฐ Sendgrid์ ๋์ฐ๋ฏธ๋ฅผ ํฌ๋ช ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
๋ํ ์ฌ๋ฌ ์ด๋ฉ์ผ ์ ์ก์ ์ง์ํ๊ณ , ์ถ๊ฐ ์ฌ์ฉ์ ์ ์๊ฐ ํ์ํ ๊ฒฝ์ฐ Sendgrid ๊ฐ์ฒด๋ฅผ ๋
ธ์ถํ๊ณ , Sendgrid Mail
์ธ์คํด์ค๋ ํ์ฉํ๊ณ , to / from ํ๋์ ๋ํด ๋ค์ํ ํ์์ ํ์ฉํฉ๋๋ค (์ : Name <[email protected]>
๋๋ ์ด๋ฆ / ์ด๋ฉ์ผ ์์ฑ์ด์๋ ๊ฐ์ฒด. ์์ธํ ๋ด์ฉ์ README ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฌ์ ํ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ง๋ง Sendgrid API๋ฅผ ์๋ํ์ง ์๊ณ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ ์ํด ์ฌ๊ธฐ์์์ด ์๋ฃจ์ ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ๋ ๊ฐ๋จํ API๋ฅผ ๋ ธ์ถํ์ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฏธ๋์ ๋ํ ๋ฐฉํฅ์ ์ ๊ณต ํ ์ ์์ต๋๋ค. :)
cc @julesbou ์กฐ๊ธ ๋ฆ์์ง๋ง ์ฌ์ ํ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@adamreisnz ์ง์งํ๊ฒ, ๊ฐ์ฌํฉ๋๋ค.
sendgrid๋ฅผ ํตํด ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๋ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ด๋ฏธ ์ถฉ๋ถํ ๋ณต์กํ๋ v4.0.7์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๋๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ์ฌํ๊ฒ๋ ๋ชจ๋ ๊ฒ์ด ๋ง๊ฐ์ก์ต๋๋ค. ๋๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ์ด ์ผ๋ง๋ ๋ณต์กํ ์ง์ ๋ํด ๋๋ฌด๋ ๋ต๋ตํด์ ์ ๋ฐ์ดํธ์กฐ์ฐจ๋ํ์ง ์์๋ค.
์ฆ, ์ด๊ฒ์ ๋จ์ํจ์ ์ ํํ ๋ด๊ฐ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ฃผ๋ง์ ํ๋ฒํด๋ณผ ๊ฒ์.
๊ฑด๋ฐฐ!
@jamesdixon ๋๋ ์ฌ์ ํ v3.xx์ ๊ฐํ ์์๊ณ ์ ๊ทธ๋ ์ด๋ํ๊ณ ์ถ์ง ์์์ต๋๋ค. :)
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๋ป๊ฒ ์๋ํ๋์ง ์๋ ค์ฃผ์ธ์. ์ค์ํ ๋๋ฝ ์ฌํญ์ด ์์ผ๋ฉด ๊ฐ์ฌํฉ๋๋ค!
@adamreisnz ,
์ด๊ฒ์ ๊ต์ฅํ๊ณ ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
tldr; ์ฐ๋ฆฌ ๋์ฐ๋ฏธ ์์ ์ด ๋๋์ง ์์๊ณ ๋น์ ์ ์ด๋ฏธ ์ฐ๋ฆฌ๊ฐ ํฅํ๋ ๊ณณ์ผ๋ก ์ฐ๋ฆฌ๋ฅผ ์ด๊ฒผ์ต๋๋ค :)
์ฐ๋ฆฌ๋ ๊ทํ์ ์๊ฐ์ ์ ์ ์ผ๋ก ๋์ํ๋ฉฐ ์ด๊ฒ์ ํ์ฌ 7 ๊ฐ์ ๋ชจ๋ SDK์์ ์์ ์ค์ธ v3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฐ์ดํธ์ ๋จ๊ณ์ ๋๋ค. Node.js ํ๋ก์ ํธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ ์์ Mail Helper Enhancement ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํ์ฌ ์ฐ๋ฆฌ๋ C # ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ณ ์์ต๋๋ค. ์ด Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ๊ณํํ๋ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ณด๋ ค๋ฉด this ๋ฅผ ์ฐธ์กฐ
๊ทธ๋์ ์ ์์ด ์์ต๋๋ค.
์ฌ๊ธฐ์์๋ ๋ฉ์ผ ๋์ฐ๋ฏธ์ ์๋ฃจ์ ์ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น (C #์์ ์ํ ํ ์์ ๊ณผ ์ ์ฌ)? ๋๋ ๋น์ ์ ์์ ์ด ๊ทธ ๊ฒฝ์ฐ ๋ ํฐ ๋๋ฌ ๋ฒ์๋ฅผ ๋ฌ์ฑ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. MIT ๋ผ์ด์ผ์ค๋ก ํ๋ก์ ํธ๋ฅผ ๊ฒ์ ํ์ผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ๋น์ ์ ์ข์ ์์ ์์ ์ฝ๊ฐ ๋น๋ ค ์ฃผ๋ฉด ์ฐ๋ฆฌ๋ฅผ ์ฉ์ํด ์ฃผ์ จ์ผ๋ฉดํฉ๋๋ค;) ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก , ์ฐ๋ฆฌ๋ ๋น์ ์ด ๊ธฐ์ฌํ ๊ฒ์ ๋ํ ํฌ๋ ๋ง์๋ฐ์ ๊ฒ์ ๋๋ค.
์์ ์ ๋ณ๋๋ก ์ ์งํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ ์ปค๋ฎค๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์น์ ์๋์ ๋งํฌ๋ฅผ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ทํ์ ๋๋ผ์ด ์ง์์ ์ธ ์ง์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ฝ!
@thinkingserious ๋น์ ์ด ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ๋ฃ๊ณ ๊ธฐ์ฉ๋๋ค. C # ์์ ๊ฐ ๋ ์ข์ ๋ณด์ด์ง๋ง JS ๊ตฌํ์์๋ ์ฌ์ ํ ๋ค์ ๋ณต์กํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ํญ์ JS์์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
๊ทํ์ ์ ์์ ๊ดํด์๋ ์ฌ์ ํ ๋ด๋ถ์์ ๋์ฐ๋ฏธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด์ํ๋ ๊ฒ์ด ์ค์ ๋ก ์ผ๋ง๋ ์ ์ฉํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ ์๋ง๋ ๋๋์ ์ธ ์ฌ ์์ฑ (์ : v5)์ ๋๊ณ ์๋ก์ด ๊ฒ๋ถํฐ ์์ํ์ฌ ์ฌ์ฉ์์ ๋ ธ๋ ์ปค๋ฎค๋ํฐ์ ์๊ฒฌ์ ๋ฐ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ํ์ํ ๊ฒฝ์ฐ ์ ์ฐํ ๋ฉ์ง API๋ฅผ ๋ด๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๊ทธ๋์ ๋ด ๋ํผ์์ ์ฝ๋๋ฅผ ๋น๋ ค ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๊ผญ ๊ฐ๋ณด์ธ์ :) ํด๋น ํ์ด์ง์์ ๋ด ๋ํผ์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค ๐
์ค์ ๋ก ํ๋ก์ ํธ๋ฅผ API์ ์ํธ ์์ฉํ๊ธฐ์ํ ์์ฒญ ๋ ผ๋ฆฌ๋ฅผ ํฌํจํ๋ ํ์ ์์ค๊ณผ ๋ด๊ฐ ๋ง๋ ๊ฒ๊ณผ ์ ์ฌํ ์ด๋ฉ์ผ ์ ์ก์์ํ ์์ ์์ค์ ๋ ํจํค์ง๋ก ๋ถํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ ์์ค ํจํค์ง๋ API์ ๋ํ ์ ์ฒด ์ก์ธ์ค ๊ถํ์ด ํ์ํ ์ฌ๋๋ค์๊ฒ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ฉ์ผ๋ฌ ํจํค์ง๋ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ค๋ ์ฌ๋๋ค์๊ฒ ์ ํฉํฉ๋๋ค. ๋ฌผ๋ก ๋ด๋ถ์ ์ผ๋ก ๋ฉ์ผ๋ฌ๋ API ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@thinkingserious ๊ทธ๊ฒ์ ๋ํ ๋น์ ์ ์๊ฐ์ ๋ฌด์์ ๋๊น?
@adamreisnz ,
์ธ์ ๋์ฒ๋ผ ์ฌ๋ ค ๊น์ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ์์ ์์ ํ๋ก์ ํธ๋ฅผ ๋ถํ ํด์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ฌ ํฌํผ ๋ชจ๋ธ๋ก ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ ๋ ํฅํ ๋ฒ์ ์์ ์๋ก์ด ์ํคํ ์ฒ๋ฅผ ํ์ ํ ์์๋ ๊ธฐํ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ ์ฌ๋ฌ๋ถ์ด ์ด์ ๋์ฐธํ๊ณ ์ถ์ต๋๋ค.
์ปค๋ฎค๋ํฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฐธ์ฌํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํด ๋ ๊น์ด ์๊ฐํ๊ณ ์ ๋ฐ์ดํธ ๋ ๋ฉ์ผ ๋์ฐ๋ฏธ๋ฅผ ๊ตฌํํ ๋๊ฐ๋๋ฉด ๋ค์ ์ฐธ์ฌํ ๊ฒ์ ๋๋ค.
๊ทํ์ ์ง์๊ณผ ๋ฌธ์์ ๋งํฌ๋ฅผ ์ถ๊ฐํด ์ฃผ์ ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ฐ๋ ค๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฌธ์ ์ ๋๋ค. ๋ฉ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ฝ๊ฒ ๋ฉ์ผ์ ๋ณด๋ผ ์ ์๋๋ก ๋์ฐ๋ฏธ / ๋ํผ๋ฅผ ํฌํจ ํ ์ ์์ง๋ง, ์ ์๊ฐ์๋ ๋ ๋ค์ ์ ์ฌ์ ์ธ ์ํด ๋ ๋ถํ์ํ ํฉ๋ณ์ฆ์ ๋ํด ๋ ๊ฐ์ง ๋ณ๋์ ์ฐ๋ ค๊ฐ ์์ฌ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ๋๋ก ์ ์งํ๋ฉด ์๋น์๊ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (๋๋ ๋ ๋ค)๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ ๋ช ํํ๊ฒ ์ ์ ๋ ๊ฒฝ๊ณ๋ก ์ธํด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ํ ๋ง์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ ํจํค์ง๊ฐ ํน์ ์์ ์ ์ํํ๋๋กํ๋ ๊ฒ์ด Node ๋ฐ npm ๋ชจ๋์ ํน์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (๊ทธ๋ฆฌ๊ณ ์ํด๋ณด์ญ์์ค!). Node๋ฅผ ์ฒ์ ์์ํ์ ๋๋ ์ต์ํด ์ ธ์ผํ์ง๋ง, ์ผ๋จ Node๊ฐ ์ ๊ณตํ๋ ๊นจ๋ํ๊ณ ๊ฐ๋จํ ํจํค์ง๋ฅผ ๊ฐ๋ฐํ ์์๋ ์์ ์ ๋ฅ๋ ฅ์ด ๋ง์์ ๋ค์์ต๋๋ค.
์ปค๋ฎค๋ํฐ์ ์๊ฒฌ์ ๊ธฐ๋ค๋ฆฌ์ญ์์ค.
๊ธ์, ๋น์ ์ ํ์คํ ์ฃผ์ฅ์ผ๋ก ํ์คํ ์ค๋๋ ฅ์ด ์์ต๋๋ค. :)
์๊ฐ์๋ด์ด ์์ธํ ์ค๋ช ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ ์ด๋ฏธ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ ๋ค์ ์์ํ๊ธฐ๋ฅผ ๊ณ ๋ํ๊ณ ์์์ผ๋ฉฐ ์ด์ ์ฌ๋ฌ๋ถ๊ณผ ์ปค๋ฎค๋ํฐ์ ํจ๊ป์ด SDK ์์ ์ ๋ค์ ์์ํ๊ฒ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
์ข์ต๋๋ค. ์์
ํ ๋ ์๋ ค์ฃผ์ธ์. :)
๋๋ 4 ์ฃผ ๋์ ํด๊ฐ๋ฅผ ๋ณด๋ด๊ณ ์์ผ๋ฏ๋ก ๋ง์นจ๋ด ์คํ ์์ค ํ๋ก์ ํธ์ ๋ํ ์์
์ ํ ์์๋ ์ฌ๊ฐ ์๊ฐ์ ๊ฐ๊ฒ ๋ ๊ฒ์
๋๋ค ๐ด
@adamreisnz ,
์ถํํฉ๋๋ค!
ํจ์ฌ ๋ ๋์ ์์ค์ "๋ฉ์ผ๋ฌ ํจํค์ง"๊ฐ ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฉ์ผ์ ๋ณด๋ด๋ฉด๋ฉ๋๋ค.
๋ง์ง๋ง ๋ฒ์ ์์๋ ๋งค์ฐ ๋จ์ํ์ง๋ง ์ด์ ๋ ๊ฑฐ๋ฃฉํ์ง ์์ ์๋ง์ด๋์์ต๋๋ค. "Basic"์์ ์๋ ํ์ฌ 8 ๊ฐ์ var๊ฐ ์ ์๋์ด ์์ผ๋ฉฐ ํน์ ์์ฑ์๊ฐ ํ์ํฉ๋๋ค. ์ฌ์ฉ ํธ์์ฑ ์ธก๋ฉด์์ ํฌ๊ฒ ๋ค๋ก ๋ฌผ๋ฌ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํด์ผํฉ๋๋ค.
sendgrid.send({
from: fromEmail,
fromName: fromName,
to: toEmail,
subject: 'Hello'
...
})
.then(...)
.catch(...)
.finally(...)
๋ฌธ์๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ณต์ฌ ํ ์์๋ ์์ ์ผ๋ฟ์ ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ ํ์๊ฒ SendGrid์ ๊ธฐ๋ณธ ๊ฐ์น์ด๋ฉฐ, ์ํ๊น๊ฒ๋ ํ์ฌ ๋๋ฝ๋์์ต๋๋ค.
@eeosk ๋ https://github.com/sendgrid/sendgrid-nodejs/issues/252#issuecomment -265934147 ๐
@adamreisnz ๋ฉ์ง๋ค์ . ๋งค์ฐ ๋ช ๋ฐฑํ ๋์์ธ ๊ฒฐ์ . SendGrid ๊ธ์ฌ๋ฅผ ๋ฐ์ผ ์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
@thinkingserious ์ฃผ ๋ฌธ์๋ฅผ @adamreisnz ํ๋ก์ ํธ๋ก ๊ฐ๋ฆฌํค๋ ๊ฒ์ ์ง์งํ๊ฒ ๊ณ ๋ คํ์ญ์์ค. ๋ชจ๋ ๊ฒ์ ์๋นํ ๋จ์ํํ๋ฏ๋ก ์ค๋ ์ผ์ฐ ์๊ณ ์์๋ค๋ฉด imho๊ฐ ๊ณผ๋ํ๊ฒ ์์ง๋์ด๋ง ๋ Java- JS์์ ์๊ฐ์ ์ป์ API. ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ํ๋ ๊ฒ์ ์ ๊ณตํ์ญ์์ค :-)
๋ํ V2 API๊ฐ ์ข ๋ฃ๋๊ณ ์ ๊ณ์ ์ด V3 API๋ฅผ ์ฌ์ฉํด์ผํ๋ฏ๋ก ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฌ๊ธฐ์์ ๋ ์์ฃผ ์์ํด๋ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋ด๊ฐ ์๋ํ ์ฒซ ๋ฒ์งธ ์์ ์ ๊ณผ๊ฑฐ์ ์์ญ ๊ฐ์ ํ๋ก์ ํธ์์ ์ด์น์ ๋ง์์ง๋ง ์ด๋ฒ์๋ ์์ ํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ nodemailer (Sendgrid ์ ์ก์ด ์ฌ์ ํ v2์์ ์๋ ํจ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ ธ๋ ์ปค๋ฎค๋ํฐ์์ nodemailer์ ์ธ๊ธฐ๋ฅผ ๊ฐ์ํ ๋ ๋ด๊ฐ ์ถ์ธกํด์ผํ๋ค๋ฉด ์์ผ๋ก ๋ช ๋ฌ ๋์ ์ด๋ฐ ์์ผ๋ก ๋๋ผ๋ ์ ์ผํ ์ฌ๋์ ๋๋ง์ด ์๋ ๊ฒ์ ๋๋ค.
@ fisch0920 ๊ทํ์ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์์ผ๋ก ๋ช ์ฃผ ๋ด์ @thinkingserious ์ ํ๋ ฅํ์ฌ Sendgrid API๋ฅผ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์ฐ๋ฆฌ๋ ์ฌ์ฉํ๊ธฐ ์ฝ์ง๋ง ํ์ํ ๋ ์ถฉ๋ถํ ์ตํต์ฑ์๋ ๊ฒ์ ์๊ฐ ํด๋ผ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
SendGrid Node.js ๋ฉ์ผ ๋์ฐ๋ฏธ์ ์ฌ ์ค๊ณ์ ๊ด์ฌ์ด์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. https://github.com/sendgrid/sendgrid-nodejs/pull/378
๊ทํ์ ์๊ฒฌ์ ๋๋จํ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๋ง์์ ๋ด์,
Elmer
์ ๋ฐ์ดํธ๋ฅผ ์ํด # 378๋ก ์ด๋ํ์ญ์์ค, ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@thinkingserious ๋๋์ด v3์ ๋์ ๋ ๋ชจ๋ Sendgrid ๋์ฐ๋ฏธ ํด๋์ค์ ๋ํด ์ ๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ฒ๋์์ต๋๋ค ... ๊ทธ๊ฒ๋ค์ด ๋๋ฌด ๋ง์์ ์ด๋ฉ์ผ์ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
Sendgrid์ ์ฝ๋๋ฅผ ๋ชจ๋ ์ ๊ฒํ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ๋จํ ๋ํผ ์ธ sendgrid-mailer ๋ฅผ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
Sendgrid์ ๋์ฐ๋ฏธ ํด๋์ค๋ ๋ฐฐํ์์ ์ ์ฉํ์ง๋ง ์ด๋ฉ์ผ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ธฐ ์ํด API์ ์ํธ ์์ฉํ๋๋ก ๊ฐ์ํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ธ๋ ์ฑ์ ์์ฑํ๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋์ฐ๋ฏธ์ ์ด๋ฆ์ ๋งค์ฐ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
Mail
vsEmail
.๊ธฐ๋ณธ ์๊ฐ ๋ฌธ์ ๋ฅผ ์ ์ค๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class
์ด๊ฒ์ "I want to send an email"๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์๋ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ ์ 8 ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ข ์์ฑ์๋ก๋ํ๊ณ 15 ์ค์ ์ฝ๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.
ํฌํผ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ด๋ฉ์ผ JSON ์์ฒญ์ ํ์ ๊ตฌ์กฐ๋ฅผ ์๊ณ ์ง์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฑ์์ผํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ๋์ฉ๋๋ค. ํ ๋ฒ์ ์ค์๋ก ์์ฒญ์ด ์ฝ๊ฒ ์ค๋จ๋ฉ๋๋ค.
๊ทธ๋์ ๋ชจ๋ ๋์ฐ๋ฏธ ํด๋์ค ๋ก์ง์ ๊ฐ๋จํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด API ๋์ฐ๋ฏธ ๋ค์ ์ถ์ํํ์ฌ Sendgrid๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ๊ฒ์ด ๋ค์ ์ฝ๊ณ ์ฌ๋ฏธ์์ด์ง๋๋ค. :)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ฒญ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ตฌ์ฑ๋๋ฉฐ Sendgrid์ ๋์ฐ๋ฏธ๋ฅผ ํฌ๋ช ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
๋ํ ์ฌ๋ฌ ์ด๋ฉ์ผ ์ ์ก์ ์ง์ํ๊ณ , ์ถ๊ฐ ์ฌ์ฉ์ ์ ์๊ฐ ํ์ํ ๊ฒฝ์ฐ Sendgrid ๊ฐ์ฒด๋ฅผ ๋ ธ์ถํ๊ณ , Sendgrid
Mail
์ธ์คํด์ค๋ ํ์ฉํ๊ณ , to / from ํ๋์ ๋ํด ๋ค์ํ ํ์์ ํ์ฉํฉ๋๋ค (์ :Name <[email protected]>
๋๋ ์ด๋ฆ / ์ด๋ฉ์ผ ์์ฑ์ด์๋ ๊ฐ์ฒด. ์์ธํ ๋ด์ฉ์ README ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.์ฌ์ ํ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ง๋ง Sendgrid API๋ฅผ ์๋ํ์ง ์๊ณ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ ์ํด ์ฌ๊ธฐ์์์ด ์๋ฃจ์ ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ, ๋ ๊ฐ๋จํ API๋ฅผ ๋ ธ์ถํ์ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฏธ๋์ ๋ํ ๋ฐฉํฅ์ ์ ๊ณต ํ ์ ์์ต๋๋ค. :)
cc @julesbou ์กฐ๊ธ ๋ฆ์์ง๋ง ์ฌ์ ํ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.