# Show GN: 이메일 발송 시스템 오픈소스 (AWS SQS, SES, SNS 등을 활용한 Golang 프로젝트)

> Clean Markdown view of GeekNews topic #18936. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=18936](https://news.hada.io/topic?id=18936)
- GeekNews Markdown: [https://news.hada.io/topic/18936.md](https://news.hada.io/topic/18936.md)
- Type: show
- Author: [leelou2](https://news.hada.io/@leelou2)
- Published: 2025-01-27T21:08:55+09:00
- Updated: 2025-01-27T21:08:55+09:00
- Original source: [github.com/lee-lou2](https://github.com/lee-lou2/email-go)
- Points: 7
- Comments: 8

## Summary

Golang을 사용하여 AWS SES에 맞춰 설계된 이메일 발송 시스템은 AWS SQS를 통해 이메일 발송 요청을 받고, Dispatcher가 이를 수집하여 Sender에게 전달하여 발송을 처리합니다. Sender는 메시지를 데이터베이스에 저장하고 AWS SES의 발송 제한을 고려하여 발송하며, 발송 결과는 AWS SNS를 통해 서버로 전달되어 저장됩니다. 이 시스템은 안정적이며 최소한의 리소스로 운영 가능하며, 이메일 발송 시스템이 없는 곳이나 개인적인 발송 필요 시 유용한 해결책이 될 수 있습니다.

## Topic Body

안녕하세요,  
Golang 을 이용해서 구축한 이메일 발송 시스템을 소개합니다 🙇‍♂️  
(참고로, 이 프로젝트는 AWS SES 에 맞춰 설계/개발 되었습니다)  
  
- Github : https://github.com/lee-lou2/email-go  
  
### 프로젝트 구조  
1. Client  
AWS SQS 를 이용해서 이메일 발송을 요청합니다.  
큐를 직접 쌓거나 HTTP 요청 모두 사용가능합니다.  
  
2. Dispatcher  
AWS Client 를 연결해서 SQS 의 큐를 컨슈밍합니다.  
1개의 컨슈머로 메시지를 수집합니다.  
수집된 메시지는 즉시 Sender 에게 전달합니다.  
  
3. Sender  
전달 받은 메시지를 데이터베이스에 준비 상태로 저장합니다.  
그리고 AWS SES 의 초당 발송 제한을 고려한 채널에 전달합니다.  
이메일이 발송되거나 발송 실패하면 그 상태를 다시 상태 관리 채널로 전달합니다.  
이 채널에선 1000개를 묶거나 10초 동안 묶인 결과를 일괄로 데이터베이스에 업데이트합니다.  
(1개의 고루틴으로 메시지를 발송하고 결과를 업데이트 하기때문에 데이터 경합이 일어나지 않습니다)  
  
AWS SES 초당 발송 제한이 있기 때문에 분산 설계를 하지 않아도 충분히 발송 속도를 유지할 수 있습니다  
  
4. Results  
AWS SNS 를 이용해서 SES 로 발송한 이메일의 발송 결과를 웹훅으로 서버로 전달합니다.  
서버에선 결과를 저장합니다.  
  
5. Statistics  
이메일 발송 요청 시 PlanID 라는 이메일 묶음 단위의 고유 값을 함께 전달합니다.  
이 값을 이용해서 HTTP API 를 호출하면 해당 묶음의 발송 수, 실패 수, 중지 수 등 다양한 결과를 확인할 수 있습니다.  
AWS SES 의 일별 발송량이 제한되어 있기 때문에 최근 24시간 동안 발송한 이메일 수를 조회하는 API 를 따로 추가하였습니다.  
  
---  
  
현재 AI 로 번역/요약하는 해커 뉴스 발송을 위 프로젝트로 진행하고 있습니다.  
(https://news.hada.io/topic?id=18666)  
충분히 안정적이며 최소한의 리소스로 발송되고 있습니다.  
  
아직 보완해야할 부분이 많지만 이메일 발송 시스템이 구축되어있지 않은 곳이나 개인적으로 발송이 필요한 경우 충분한 해결책이 될 수 있다고 생각합니다.  
  
AWS SES 나 SQS, SNS 를 설정하는 방법 등에 대해선 따로 작성해두지 않았습니다.  
혹시 구축이 필요하신 분이 계시다면 아래 메일로 문의주시면 당연히 무료로 지원해드립니다.  
  
개선이 필요한 부분에 대해선 적극적으로 제안 주시면 빠르게 반영하겠습니다 🙏  
  
감사합니다 👏  
  
- email : lee@lou2.kr  
- linkedIn : linkedin.com/in/lou2

## Comments



### Comment 34053

- Author: rainystar
- Created: 2025-02-03T09:51:31+09:00
- Points: 1

메일로 모니터링 리포트를 매일 발송합니다. 참고로 전 문과출신이다 보니 js나 python을 좀 다루는 정도입니다.  그래서 golang으로 개발하셨다고 하니 접근이 어려울것 같아서 겁부터 나는데요. 혹시 golang으로 하신 것은 성능이 가장 큰 이유인지 궁금합니다.

### Comment 34081

- Author: leelou2
- Created: 2025-02-03T13:18:10+09:00
- Points: 1
- Parent comment: 34053
- Depth: 1

일단은 바로 사용할 수 있게 대부분 구현되어있는 상태입니다 혹시 자세한 사용 방법을 원하신다면 이메일 주시면 답변드릴게요 🙇‍♂️

### Comment 34080

- Author: leelou2
- Created: 2025-02-03T13:17:17+09:00
- Points: 1
- Parent comment: 34053
- Depth: 1

안녕하세요 🙇‍♂️ 아아 제가 고퍼입니다ㅋㅋ사실 AWS SES 의 경우 일일 한도량, 초당 발송 가능 수가 정해져있어서 아무리 성능이 좋아도 퍼포먼스를 내기엔 한계가있습니다 하지만 같은 속도라도 사용하는 리소스가 python 대비 훨씬 적게 들어서 golang 을 선택한 것도 있습니다

### Comment 33908

- Author: kikikeke84
- Created: 2025-01-28T04:27:49+09:00
- Points: 1

메일드렸어요 좋은 프로젝트 감사합니다

### Comment 33909

- Author: leelou2
- Created: 2025-01-28T05:13:30+09:00
- Points: 1
- Parent comment: 33908
- Depth: 1

감사합니다👍 답변 보냈습니다

### Comment 33902

- Author: leelou2
- Created: 2025-01-27T21:13:58+09:00
- Points: 1

자세한 내용은 아래 README 를 참고해주세요 🎉  
https://github.com/lee-lou2/email-go/blob/main/README.ko.md

### Comment 33915

- Author: boriggori
- Created: 2025-01-28T09:50:09+09:00
- Points: -1

마침 필요했는데ㅋㅋ

### Comment 33921

- Author: leelou2
- Created: 2025-01-28T11:19:22+09:00
- Points: 1
- Parent comment: 33915
- Depth: 1

잘 쓰시고 궁금한 점 있으시면 메일 주세요 👏
