์๋ ํ์ธ์,
sendgrid๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ผ ๋ณธ๋ฌธ๊ณผ ํจ๊ป iCal(ics) ํ์ผ์ ์ฒจ๋ถํฉ๋๋ค. ics ํ์ผ์ ์ฝํ ์ธ ์ ํ์ "text/calendar"๋ก ์ค์ ํ ์ ์์ง๋ง ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ฒจ๋ถ ํ์ผ์ ์บ๋ฆฐ๋ ์ด๋ฒคํธ๋ก ์ธ์ํ์ง ๋ชปํ๊ฒ ํ๋ "method=REQUEST" ์ถ๊ฐ ํค๋๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค.
๊ฐ ์ฒจ๋ถ ํ์ผ์ ๋ํด ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ค์ ํ ์ ์์ต๋๊น?
๋ฌธ์ ์ธ์ฌ
์๋ ํ์ธ์ @mindnuts ์ ๋๋ค .
์ดํด๊ฐ ์ ์๋๋ค์. ์ ๊ฐ ์ดํดํ๋์ง ํ์ธํ๊ฒ ์ต๋๋ค:
๊ฐ์ฌ ํด์!
@thinkingserious
์ด๋ฉ์ผ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋์ ์ฐ๋ฆฌ๋ ํ์ผ์ ๋ฐฐ์ด์ ์์ฑํ๋ ๋ผ ์์ .ics ํ์ผ์ ๋ํ "ํ ์คํธ / ๋ฌ๋ ฅ"์ "์ contentType"๋ก ์ค์ . Outlook์์ ics ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์งํ๋ ค๋ฉด ํค๋์ method=REQUEST๊ฐ ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค.
Content-Type: text/calendar; charset=UTF-8; method=REQUEST
์ด๊ฒ์ด ์ผ๋๊ทธ๋ฆฌ๋ ํด๋ผ์ด์ธํธ์์ ๊ฐ๋ฅํ ๊น์?
์ด ํค๋ ์ธํธ๋ฅผ ์ฌ์ฉ ์ค์ธ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
@thinkingserious ์ฌ๊ธฐ ์์ต๋๋ค:
var sendgrid = require('sendgrid')('YOUR_SENDGRID_API_KEY');
var email = new sendgrid.Email({
to: '[email protected]',
from: '[email protected]',
subject: 'Hello World',
html: 'My first email <b>through SendGrid.</b>',
text: 'My first email through SendGrid.'
});
email.addFile({
filename: 'calendar.ics',
path: './calendar.ics',
contentType: 'text/calendar'
});
sendgrid.send(email, function(err, json) {
if (err) { return console.error(err); }
console.log(json);
});
๋ค์์ ์ด ์ฒจ๋ถ ํ์ผ์ ๋ํด Sendgrid์์ ์์ฑํ ํค๋์ ๋๋ค.
Content-Disposition: attachment; filename="calendar.ics"
Content-Transfer-Encoding: base64
Content-Type: text/calendar; charset=utf-8; name="calendar.ics"
๋ด๊ฐ ๊ฐ๊ณ ์ถ์ ๊ฒ์ (REQUEST๋ ๋จ์ง ์์ผ ๋ฟ์ ๋๋ค):
Content-Type: text/calendar; charset=utf-8; method=REQUEST; name="calendar.ics"
๊ฐ์ฌํฉ๋๋ค. ๊ทธ ์๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
headers
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋๋ฅผ ์ง์ ์ค์ ํ๋ ค๊ณ ํ์ต๋๊น?
@thinkingserious ๋๋ ์ด๋ฉ์ผ์ ํค๋๋ฅผ ์ค์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ด๋ฉ์ผ์ ์ถ๊ฐ๋ ์ฒจ๋ถ ํ์ผ(์ ๊ฒฝ์ฐ์๋ .ics ํ์ผ)์ ๋ํ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ค์ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๋ฌธ์ ์ธ์ฌ
๋ฏธ๋์
์ ๋ฐ์ดํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋ ์ด์ v3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ํ์ฌ๋ก์๋ ํด๋น ํค๋๋ฅผ ์ค์ ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ SMTPAPI๋ฅผ ํตํ๋ ๊ฒ์ ๋๋ค. https://github.com/sendgrid/smtpapi-nodejs
@thinkingserious ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. V3์ ETA๋ ๋ฌด์์ ๋๊น?
๋ช ๊ฐ์์ ๋์ง ์์์ผ ํฉ๋๋ค.
@mindnuts ,
์ฐ๋ฆฌ๋ ๋น์ ์ด ์ฌ๊ธฐ์ V3 / ๋ฉ์ผ ๋ณด๋ด๊ธฐ / ์๋ ํฌ์ธํธ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค, ๋ช ์ฃผ ๋จ์ด์ ธ ์ง๊ธ์ด๋ค : https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html ์ฌ๊ธฐ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ฒ์ : HTTPS //github.com/sendgrid/sendgrid-nodejs/tree/v3beta
์ง์ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์๋ ํ์ธ์ @thinkingserious ,
๋๋ ๋ชจ๋๊ฐ ์ฌ์ ํ ํด๊ฒฐ์ฑ
์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค!
๋ํ ๋ฉ์๋๋ฅผ REQUEST๋ก ์ค์ ํ๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์ถ์ต๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? 2๋ฌ์ด ๋์์ด์!
๊ฐ์ฌ ํด์,
์ข์ ํ๋ฃจ ๋์ธ์,
์ ๋ ๋ฏธ
์๋ ํ์ธ์ @thinkingserious ,
์ด ๋ฌธ์ ๋ก ์ธํด ์ฌ์ ํ ์ ๊ฒจ ์์ต๋๋ค!
์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ด๋ค ์๋ฃจ์
?
๊ฐ์ฌ ํด์,
์ ๋ ๋ฏธ
๋ค์ @thinkingserious ์ด ๋ฌธ์ ๋ฅผ ๊ณง ํด๊ฒฐํ ๊ณํ์
๋๊น?
์ฐ๋ฆฌ๋ ์ ๋ง ํ์ํฉ๋๋ค!
+1
response: {
"statusCode": 400,
"body": {
"errors": [
{
"message": "The attachment type cannot contain ';', or CRLF characters.",
"field": "attachments.0.type",
"help": "http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.attachments.type"
}
]
},
"headers": {
"server": "nginx",
"date": "Wed, 01 Mar 2017 04:43:59 GMT",
"content-type": "application/json",
"content-length": "216",
"connection": "close",
"x-frame-options": "DENY",
"access-control-allow-origin": "https://sendgrid.api-docs.io",
"access-control-allow-methods": "POST",
"access-control-allow-headers": "Authorization, Content-Type, On-behalf-of, x-sg-elas-acl",
"access-control-max-age": "600",
"x-no-cors-reason": "https://sendgrid.com/docs/Classroom/Basics/API/cors.html"
}
}
}
๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น? ์ ์๋ ์๋ฃจ์ ์ ๋ฌด์์ ๋๊น? ์ด๊ฒ ์ ๋ซํ์์ด?
@ํ์ค์นผ๋กํผ์ธ
์ด๊ฒ์ ๋ซ์ง ๋ง์์ด์ผ ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ค์ @thinkingserious ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๊น?!
์๋ ํ์ธ์ @ataraxido ,
์ด ๋ฌธ์ ๋ ์ ํ ๋ก๋๋งต์ ์์ง๋ง ์ธ์ ๋ฐฐ์ก๋ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ต๊ทผ์ ์ด ๊ธฐ๋ฅ์ ๋ํด ๋ช ๊ฐ์ง ์๋ก์ด ํฌํ๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ๋ด ๋๋ง๋ค ์ฐ์ ์์๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋๋๋ก ์ ํ ํ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋ง์์ ๋ด์,
์๋จธ
@thinkingserious ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ๋ ์ ๋ง ์ค์ํ ๊ธฐ๋ฅ์ด๋ผ๊ณ
@hdornier ์ ๋์
@thinkingserious , ๋น์ ์ ์ด๊ฒ์ด
์๋ ํ์ธ์ @e99cog ์ ๋๋ค .
์ด์ ์ ์ ๊ทธ๋ ๊ฒ ๋งํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. :(
์ด๊ฒ์ด SMTPAPI๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ค์์ ์ฌ์ฉ ๋ฐฉ๋ฒ ์ ์ ์ ๋๋ค.
๋ง์์ ๋ด์,
์๋จธ
์ฌ๊ธฐ๋ +1
๊ฒฐ๊ตญ MIME์ ๋ช ์์ ์ผ๋ก ๋ณด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ mailgun๊ณผ ์ฌ๊ธฐ์ ํฌํจ๋ message.mime ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ์ต๋๋ค.
sendgrid๋ ๋ชจ๋ API์์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๊น?
์๋ ๋ชจ๋๋ค!
์ ๋ SendGrid์ ๊ฐ๋ฐ์ ๊ฒฝํ ์ ํ ๊ด๋ฆฌ์์ธ Matt์ ๋๋ค. MIME ์ ํ์์ ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์์ธํ ์๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด ์์ ์ Google ํ์์์ผ๋ก ์ํํ๋ฏ๋ก ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก์ ๊ทํ๊ฐ ํ์๋ก ํ๋ ์ฌํญ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
๋ด ์บ๋ฆฐ๋์์ ์์ ๋กญ๊ฒ ์๊ฐ์ ์ก์์ฃผ์ธ์ - https://calendly.com/matt-bernier/mail-send-mime-types
๊ฐ์ฌ ํด์!!
ํฅํ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด์ ๋ํ ์ํ๊ฐ ์์ต๋๊น? 2๋ ์ด ์ง๋ฌ์ต๋๋ค.
+1
์ด๊ฒ์ ๋ํ ๋ชจ๋ ETA?
์ ๋ ์ด๊ฒ์ ๊ด์ฌ์ด ๋ง์ต๋๋ค. ๋ฌผ๋ก ์ง๊ธ์ฏค์ด๋ฉด ๋ต์ ์ป์ ์ ์์ ๊ฒ์ ๋๋ค.
์ํ๊ณ ์ถ์ง๋ ์์ง๋ง, ๋ฒ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ฐฐํฌํ๋ ๋ฐ _๋งค์ฐ__ ๊ฐ๊น์์ก๋ค๊ณ ๋งํ์ต๋๋ค. :) ์ ๋ฐ์ดํธ๊ฐ ์์๋๋ฉด ์ฌ๊ธฐ์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
์ฌ๋ฌ๋ถ, ์๋ ํ์ธ์!
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ผ๋ฉฐ ์์ ์ฌํญ์ด ํ๋ก๋์ ๋จ๊ณ์ ์์์ ์๋ฆฌ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค! ์๋ํด ๋ณด์๊ณ ์ถ๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค์ฃผ์ธ์.
๊ธฐ๋ค๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ง์์ ๋ด์,
์๋จธ
@thinkingserious ์ข์ ์์์ ๋๋ค! ๋ค์์ ์ทจํด์ผ ํ ์กฐ์น๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๊น? ์ถ๊ฐ ํค๋ > method=REQUEST์ ๋ํ ์ง์์ด ์ ๊ณต๋์์ต๋๊น?
์๋ ํ์ธ์ @thinkingserious
๋ฐฉ๊ธ ์๋ํ์ง๋ง ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค(API ์ฌ์ฉ).
{"errors":[{"message":"์ฒจ๋ถ ํ์ผ ์ ํ์ ';' ๋๋ CRLF ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.","field":"attachments.0.type","help":" http://sendgrid. com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.attachments.type "},{"message":"์ฒจ๋ถ ํ์ผ ์ ํ์ ';' ๋๋ CRLF ๋ฌธ์๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.","field":"์ฒจ๋ถ ํ์ผ. 1.์ ํ","๋์๋ง":" http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.attachments.type "}]}
๋ค์์ API API๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ๋ ์์ ์ ๋๋ค.
$attachment->setType('ํ ์คํธ/์บ๋ฆฐ๋; charset="UTF-8"; ๋ฉ์๋=REQUEST');
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๊ฐ์ฌ ํด์
@ataraxido ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค
"attachments": [{
"content": "QkVHSU46....EQVINCg==",
"type": "text/calendar; method=REQUEST",
"filename": "file1.ics"
}]
202๋ฅผ ๋ฐํํ๊ณ ๋ฉ์ผ์ ๋ณด๋์ต๋๋ค.
Hey @ataraxido SendGrid๊ฐ ์๋์ผ๋ก ์ด ํ๋๋ฅผ ์ถ๊ฐํ๋ฏ๋ก ๋ฌธ์ ์งํฉ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค(text/html, text/plain์๋ ๋์ผํ๊ฒ ์ ์ฉ๋จ). ํ ๋ฒ ๋ ์๋ํด ๋ณด๊ณ ์ด๊ฒ์ด ํจ๊ณผ๊ฐ ์๋์ง ์๋ ค์ฃผ์ธ์ ๐ค
@์ํ๋ฝ์๋ ,
์ด๋์์ ์๋์ํฌ ์ ์์ต๋๊น?
์๋ ํ์ธ์ @abhilashabhatia ,
์, ์ด์ "type": "text/calendar; method=REQUEST"
ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ ค์ฃผ์ธ์.
์๋ ํ์ธ์ @thinkingserious
"header" method=REQUEST๋ฅผ ๋ณด๋ผ ์ ์์์ง๋ง Outlook ๋ด์์ ์ ๋๋ก ์๋ํ๋ ์ธ๋ผ์ธ ICS๋ฅผ ๋ณด๋ผ ์ ์์์ต๋๋ค.
์ด ์ฌ์ฉ์ ์ ์ "ํค๋"์ ํจ๊ป ์ธ๋ผ์ธ์์๋ ์ด๋ฒคํธ๋ ์ฒจ๋ถ๋ ICS๋ฅผ ์๊ธฐ์ํต๋๋ค.
๊ทํ์ ๋ชจ๋ ๊ณ ๊ฐ์๊ฒ ๋งค์ฐ ๊ด๋ฒ์ํ ์ฌ์ฉ ์ฌ๋ก๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ค์ ์ฌ๋ก๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฐ์ฌ ํด์
@ataraxido ์ ๋๊ธ์ +1 -- @thinkingserious ์์ ๋ฅผ ์ป์ ์
@ataraxido @tetreault ,
๋ช ํํํ๊ธฐ ์ํด ์ฒจ๋ถ ํ์ผ๋ก ๋ณด๋ด๊ธฐ๋ Outlook์์ ์๋ํ์ง๋ง ์ธ๋ผ์ธ์์๋ ์๋ํ์ง ์์ต๋๊น?
์ด๊ฒ์ ์ด์ ๋ฐฑ๋ก๊ทธ์ ์์ผ๋ฉฐ ์ปค๋ฎค๋ํฐ์ ๋๊ตฐ๊ฐ๊ฐ PR์ ์ ๊ณตํ๊ณ ์ถ์ดํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค.
@thinkingserious๋ ์ค์ ๋ก ICS๊ฐ ์ด๋ฉ์ผ์ ์ธ๋ผ์ธ๋์ด ์์ง๋ง Outlook์ ์ด๋ฅผ ์ฒจ๋ถ ํ์ผ๋ก ๊ฐ์ฃผํ๋ฏ๋ก ์ด๋ฉ์ผ ์ธ๋ผ์ธ ์ด๋ฒคํธ์ ์์ ๋์/ํ์๊ฐ ์์ต๋๋ค.
์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค. ๋ง์ ๊ฒ์ ์๋ํ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ICS ์ธ๋ผ์ธ์ด 7๋นํธ์ ์๋ ๋ฐ๋ฉด ์ธ๋ผ์ธ ํญ๋ชฉ์ base64๋ก ์ธ์ฝ๋ฉํ๋๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ ํ์ธ์ @ataraxido ,
์์ธํ ์ค๋ช ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ธ์ฝ๋ฉ๊ณผ ๊ด๋ จํ์ฌ ๋ญ๊ฐ๋ฅผ ํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.