Sendgrid-nodejs: ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์˜ˆ

์— ๋งŒ๋“  2016๋…„ 06์›” 28์ผ  ยท  75์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sendgrid/sendgrid-nodejs

์•ˆ๋…•ํ•˜์„ธ์š”,

readme์— ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 30 ์ค„์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด tbh ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ sendgrid๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ˆ™๋ จ ๋œ ๊ฐœ๋ฐœ์ž๋ผ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ,
์ด ํ™”๋‚œ ์†Œ๋ฆฌ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค

์ถ”์‹  :์ด ์˜ˆ์ œ๋Š” https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html์„ ์ฐพ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

help wanted community enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@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 ์กฐ๊ธˆ ๋Šฆ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  75 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @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_

  • ๋ณด๋‚ธ ์‚ฌ๋žŒ (์˜ˆ : '[email protected]')
  • ๋ฐ›๋Š” ์‚ฌ๋žŒ (์˜ˆ : '[email protected]')
  • ์ฃผ์ œ (์˜ˆ : 'ํ…Œ์ŠคํŠธ ์ฃผ์ œ')
  • ๋ฉ”์‹œ์ง€ (์˜ˆ : 'ํ…Œ์ŠคํŠธ ๋ฉ”์‹œ์ง€')
  • ํ…œํ”Œ๋ฆฟ (์‚ฌ์šฉํ•˜๋ ค๋Š” ํ…œํ”Œ๋ฆฟ ID)
  • templateVariables (๊ฐ์ฒด, ์—ฌ๊ธฐ์„œ ํ‚ค-์ด๋ฉ”์ผ์˜ ๋ณ€์ˆ˜, ๊ฐ’-๋ฐ”๊ฟ€ ๊ฐ’) { ":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 ๊ฐœ์˜ ํ…œํ”Œ๋ฆฟ ์ œํ•œ์— ์‰ฝ๊ฒŒ ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

  • ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค๊ณ  <% body %>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณธ๋ฌธ์„ ์„ค์ •ํ•˜๊ณ  ํ•˜๋‚˜์˜ "๋งˆ์Šคํ„ฐ"ํ…œํ”Œ๋ฆฟ ๋งŒ ์‚ฌ์šฉ (๋˜๋Š” on ํ•˜์œ„ ํƒœ๊ทธ ์‚ฌ์šฉ)

์งˆ๋ฌธ์ด ์ดํ•ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

@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 ๋‚˜๋Š” ๊ทธ๊ฒƒ์„

  1. ์ „์—ญ ๋ณ€์ˆ˜ ( var ๋˜๋Š” let ๋˜๋Š” ์œ ์‚ฌํ•œ ํ‚ค์›Œ๋“œ์—†์ด ์„ ์–ธ ๋จ)๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ : from_email = new helper.Email("[email protected]") ๋Œ€์‹  var from_email = ...
  2. ์ด๋ฉ”์ผ ๋ฆฌ์†Œ์Šค์—๋งŒ new helper.Email ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„์šฐํ˜ธ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋ชจ๋“ˆ ๋‚ด๋ถ€์˜ ํ•˜์œ„ ์ˆ˜์ค€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ž˜ํ•‘ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Content , Mail ๋“ฑ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  3. method , path ๋ฐ body ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์‹œ ๋งค์šฐ ๋น„์šฐํ˜ธ์ ์ž…๋‹ˆ๋‹ค.
  4. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” 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์˜ ๊ธฐ๋ณธ ๊ฐ€์น˜์ด๋ฉฐ, ์•ˆํƒ€๊น๊ฒŒ๋„ ํ˜„์žฌ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@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๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰