๐ ๋ฐฐ๊ฒฝ ์ํฉ
์ง๊ธํ๋ ํ๋ก์ ํธ์๋ ๋ฉ์ผ ๊ตฌ๋ ์๋น์ค ๊ธฐ๋ฅ์ด ์๋ค. ๊ฐ์ธ์ ๋ณด๋ณดํธ ํ์์ ํด๋น ๊ธฐ๋ฅ ๊ฒํ ํ ๋ณด์ ์์ฒญ์ด ๋ค์ด์๋ค. ๊ธฐ๋ฅ ์๊ฑด๊ณผ ๋ณด์ ์๊ฑด์ ๊ฐ์ด ๋์ดํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ตฌ๋ ์ทจ์ ๋ฐ ์์ ์ฐจ๋จ ๊ธฐ๋ฅ์ด ์กด์ฌ ํด์ผํ๋ค.
- ๊ตฌ๋ ์ทจ์ ๋ฉ์ผ ์ฃผ์๋ฅผ ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ฉด ์๋๋ค.
- ๊ด๊ณ ์ฑ/์ ๋ณด์ฑ ๋ฉ์ผ์ ๊ตฌ๋ถํด์ ๊ด๋ฆฌํด์ผํ๋ค. ์ฆ ๊ด๊ณ ์ฑ ์ ๋ณด ์์ ์ฐจ๋จ๊ณผ ๋ชจ๋ ๋ฉ์ผ ์์ ์ฐจ๋จ์ ๊ตฌ๋ถ๋์ด์ผ ํ๋ค.
- ํด๋น ํ๋ก์ ํธ๋ ์ฌ์ฉ์, ์ฆ ๋ก๊ทธ์ธ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ์์ ์ฐจ๋จ ์ค์ ์ ์๋ค.
ํด๋น ์๊ฑด์ ๋ง์กฑํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง ์๋๋ฅผ ํ๋๋ฐ, ์ด ๋ฐฉ๋ฒ๋ค ์ค ์ด๋ค ๋ฐฉ๋ฒ์ด ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์์ด ๋ ์๋ ์์ง ์์๊น ํด์ ๊ณต์ ๋ชฉ์ ์ผ๋ก ๊ธ์ ์ฐ๊ธฐ๋ก ๋ง์ ๋จน์๋ค.
1๏ธโฃ ์ฒซ ๋ฒ์งธ ์๋
์ฒซ ๋ฒ์งธ ์๋์ ์๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฉ์ผ ์์ ์ฐจ๋จ ๊ธฐ๋ฅ์ ์ ๊ฒฝ ์ฐ๊ณ ์ถ์ง ์๋ค๋ ๊ฒ์ด๋ค. ๋ด๋ถ DB์์ ์ฐจ๋จ ๋ชฉ๋ก๊ณผ ๊ฐ์ด ์ฐจ๋จํ ์ฌ์ฉ์์ ์ด๋ฉ์ผ์ ๊ด๋ฆฌํ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ณ ์๋ ๋ฉ์ผ Third-Party์ธ SendGrid์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
1. sendgrid ์ค์ ํ์ด์ง์์ Unsubscribe Groups ๋ฅผ ์ถ๊ฐํ๋ค

2. Subscription Tracking ๊ธฐ๋ฅ์ OFF ๋ก ์ค์ ํ๋ค.

3. sendgrid์ send API์์ asm ํ๋๋ฅผ ์ถ๊ฐํ๋ค. [์ฐธ๊ณ ๋ฌธ์]
val asm = ASM().apply {
groupId = 33868
}
val mail = Mail().apply {
this.from = from
this.subject = "local-test"
this.content = mutableListOf(content)
this.asm = asm
}
val sendGrid = SendGrid(sendGridKey)
val request = Request().apply {
method = Method.POST
endpoint = "mail/send"
body = mail.build()
}
val response = sendGrid.api(request)
4. mail message์ unsubscribe์ global-unsubscribe ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ค. [์ฐธ๊ณ ๋ฌธ์]
<a href='<%asm_unsubscribe_raw_url%>'>๊ตฌ๋
์ทจ์</a>
<a href='<%asm_global_unsubscribe_raw_url%>'>์์ ๊ฑฐ๋ถ</a>
์ด๋ ๊ฒ ์ค์ ํ๋ฉด 1๋ฒ ๋จ๊ณ์์ ๋ง๋ group์ ๊ด๊ณ ์ฑ ๋ฉ์ผ ์์ ์ฐจ๋จ ๊ทธ๋ฃน์ผ๋ก, global ์์ ์ฐจ๋จ ๊ทธ๋ฃน์ ๋ชจ๋ ๋ฉ์ผ ์์ ์ฐจ๋จ ๊ทธ๋ฃน์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
๊ฒฐ๊ณผ๋ฌผ์ ์๋ ๊ทธ๋ฆผ์ด๋ค.
์ผ์ชฝ์ ์์ ์ฐจ๋จ ๊ธฐ๋ฅ, ์ค๋ฅธ์ชฝ์ ๊ด๊ณ ์ฑ ๋ฉ์ผ ์ฐจ๋จ ๊ธฐ๋ฅ์ด๋ค.

ํด๋น ์ด๋ฉ์ผ ํ ํ๋ฆฟ์ ๋ณ๊ฒฝ ํด๋ณด๋ ค๊ณ ์๊ฐ์ ๊ฝค ์ผ์ง๋ง, sendgrid์์ ๋ง๋ค์ด์ ๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ผ ์ปค์คํ ํ๊ฒ ์ค์ ํ ์ ์๋ค. ์๋ฌด๋๋ B2C ์๋น์ค์ด๋ค ๋ณด๋ ๋๋ฌด ๋ชป์๊ธฐ๊ณ ์์ด๋ก ๋์ด ์์ด์ ์ ํ ๋ฐ์ง ๋ชปํ์๋ค.
2๏ธโฃ ๋ ๋ฒ์งธ ์๋
๋ ๋ฒ์งธ ์๋๋ถํฐ๋ ์์ ๋์์๋ฅผ DB์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ์ ์ ์ด๋ค. ์ด๋ ๊ฒ ์ ํ ์ด์ ๋ ๊ฐ์ธ์ ๋ณด๋ณดํธ ํ์์ ์จ๋ํํฐ์์ ๊ด๋ฆฌ๋๋ ์ด๋ฉ์ผ๋ ์กด์ฌํด์๋ ์๋๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์์ ์ฐจ๋จ ์ด๋ฉ์ผ์ ๊ด๋ฆฌํ์ง ์๊ณ , ์์ ๋์ํ ์ด๋ฉ์ผ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ํํ์๋ค. (์์ ๋์์๋ ์ด๋ฉ์ผ ์์ง์ ์ ํํ์๊ธฐ ๋๋ฌธ์ ๋ฒ์ ๋ฌธ์ ๊ฐ ์๋ค.)
๋ฐ๋ผ์ ํฐ์ผ์ ๊ตฌ๋งคํ ๋ ๊ด๊ณ ์ฑ ์์ ๋์๋ฅผ ์ ํํ๊ฑฐ๋, ๊ด๊ณ ์ฑ ์ ๋ณด ๊ตฌ๋ ์ ํ ์ฌ์ฉ์๋ ํด๋น ์์ ๋์์ ํ ์ด๋ธ์ ์ด๋ฉ์ผ์ด ์ ์ฅ๋๋ค. ๊ทธ๋ผ ๊ด๊ณ ์ฑ ์ด๋ฉ์ผ์ ์ ์กํ ๋ ํด๋น ํ ์ด๋ธ์ ์กด์ฌํ๋ ์ฌ์ฉ์์๊ฒ๋ง ์ ์กํ๋ฉด ๋๋ค.
๊ทธ๋ผ ์์ ์ฐจ๋จ์ด ๋ฌธ์ ์ธ๋ฐ, ๊ด๊ณ ์ฑ ์ ๋ณด ์์ ์ฐจ๋จ์ API๋ฅผ ํธ์ถํ์ฌ ์์ ๋์์๋ฅผ ์ง์ฐ๋ ๋ฐฉ๋ฒ์ ์ ํํ์๊ณ , ๋ชจ๋ ๋ฉ์ผ ์์ ์ฐจ๋จ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๊ธฐ๋ก ํ์๋ค. ์ฌ์ฉ์๊ฐ ์คํธ ๋ฉ์ผํจ์ผ๋ก ๋ณด๋ด๋ ๊ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ ์๋ฏธ๊ฐ ์๋ค๊ณ ํ๋จํ์๋ค. (๋ฉ์ผ ์ก์ ์์ ํ๊ฐ ์ ์๊ฐ ๋จ์ด์ง ์ ์๋ค๊ณ ๊ณต์ ํ์ง๋ง ์ ๊ฒฝ ์์ด๋ค๊ณ ํ๋ค...!)
๋ ๋ฒ์งธ ์๋์ ๋ชฉ์ ์ ์ฌ์ฉ์๊ฐ ๋งํฌ๋ง ๋๋ฅด๋ฉด ์๋์ผ๋ก ์์ ์ฐจ๋จ์ด ๋๋๋ก ํ๋ ๊ฒ์ด๋ค.
1. ์์ฝ๋ ๋์ฒด๋ฌธ์ ์ฌ์ฉ
sendgrid๊ฐ ์ฌ์ฉ์ ๋ณ๋ก ๊ตฌ๋ ์ทจ์ ์ ๋ค๋ฅธ url์ ์ค ์ ์๋ค๋ ๊ฒ(์ฒซ ๋ฒ์งธ ์๋ ์ฐธ๊ณ )์ ์ด๋ฉ์ผ ๋ณธ๋ฌธ์ ์ฌ์ฉ์ ์ด๋ฉ์ผ์ ๋ฃ์ ์ ์๋ค๊ณ ํ๋จํ์๋ค.
send API ์ฌ์ฉ ์ personalizations ๊ฐ์ ๊ฐ์ด ์ ์กํ์ฌ ์ฌ์ฉ์ ๋ณ๋ก ๋ค๋ฅธ ๊ฐ์ ์ ๋ฌํ ์ ์๋ค. substitution์ ์ฌ์ฉํด์ ๋์ฒด๋ฌธ์๋ ๊ฐ๋ฅํ๋ค. [๊ด๋ จ ๋ฌธ์]
val personalizations = toEmails.map {
Personalization().apply {
addTo(Email(it))
addSubstitution(":email:", it)
}
}
val mail = Mail().apply {
this.from = from
this.subject = "local-test"
this.content = mutableListOf(content)
this.personalization = personalizations
}
2. mail message์ ๋์ฒด๋ฌธ์ ์ฝ์ ํ ์ ์ก
<a href='https:/test.com/?email=:email:'>๊ตฌ๋
์ทจ์</a>
:email: ์ด ๋ง์ต๋๊น?
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.

์ข ๋ ์ด์๊ฒ ๊พธ๋ฏธ๋ฉด ์ด๋๋ก ์ฌ์ฉํด๋ ๋ ๊ฒ ๊ฐ๋ค. ๋ง์ฝ email์ด url์ query string์ผ๋ก ๋ ธ์ถ๋๋ ๊ฒ์ด ๊ฑฑ์ ๋๋ค๋ฉด ๋ฒํผ์ ๋ง๋ค์ด์ POST ์์ฒญ์ผ๋ก request body์ ๋ฃ์ด์ ๋ณด๋ด๋๋ก ์ค์ ํ๋ฉด ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ
ํ๋ฌดํ๊ฒ๋ ์ด๊ฒ์ ๊ฒ ์๋ํด๋ดค์ง๋ง ๊ฒฐ๊ตญ ๋ฉ์ผ ์ปจํ ์ธ ์์ ์์ ์ฐจ๋จ ํ ์ ์๋ ํ๋ก ํธ ํ์ด์ง URL์ ๋งํฌ๋ก ๋ฃ์ด์ ๋ณด๋ด๋ ๊ฒ์ผ๋ก ๊ฒฐ์ ๋์๋ค. ์ด์ ๋, ๋ฉ์ผ ์ ์ก ๊ธฐ๋ฅ์ ๋ํ์ฌ์์ ์ฌ์ฉํ๋๋ฐ ์ด ๋ ๋์ฒด๋ฌธ์ ๊ฐ์ ๋ณต์กํ ์์ ์ ๋ฆฌ์คํฌ๊ฐ ์ปค์ ์ด๋ ต๋ค๋ ์๊ฒฌ์ด ์์๋ค. ๋ฐ๋ผ์ ํ๋ก ํธ์์ ์์ ์ฐจ๋จ ๋ฑ๋กํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ , ํด๋น ํ์ด์ง๋ก redirect ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ ์ด๋ฉ์ผ์ ์ ๋ ฅํ์ฌ ์์ ์ฐจ๋จ ํ ์ ์๋๋ก ํ์๋ค.
๋น๋ก ๋ฉ์ง๊ฒ ๊ธฐ๋ฅ์ ๋ง๋ค์ง ๋ชปํ์ง๋ง, ์ด ์ฌ์ ์ค์ sendgrid ๊ธฐ๋ฅ์ ๋ํด ์ฐพ๊ธฐ ์ด๋ ต๊ณ ํํธํ ๋ ์ ๋ณด๋ฅผ ์ด๋๊ฐ ๋ชจ์ ์ฃผ๋ฉด ์ข๊ฒ ๋ค๋ผ๋ ์๊ฐ์ ํ์๋ค. ๊ทธ๋์ ์ด๋ ๊ฒ ๋ธ๋ก๊ทธ ๊ธ์ด๋ผ๋ ์จ์ ๋จ๊ฒจ๋๊ธฐ๋ก ํ๋ค. ๋!