AWS SES 기반 Golang 이메일 발송 서비스
aws-ses-sender-go
는 AWS Simple Email Service(SES)를 활용하여 이메일을 효율적으로 발송하는 Golang 기반 서비스입니다. 이메일 발송 요청 처리, 상태 추적, 예약 발송 및 결과 분석 기능을 제공합니다.
- AWS SES 연동 이메일 발송: AWS SES를 통한 안정적인 대량 이메일 발송
- 이메일 스케줄링: 특정 시간에 이메일 발송 예약 기능
- 안정적인 발송: AWS SES의 초당 발송 수를 고려하여 안정적으로 균등하게 발송
- 발송 상태 관리: 이메일 생성, 처리, 발송, 실패, 중단 등 상태 관리
- 결과 추적 및 분석:
- 이메일 오픈 이벤트 추적 (1x1 픽셀 이미지 활용)
- AWS SES 발송 결과(전달, 실패, 바운스) 저장 및 분석
- 토픽별/시간별 발송 결과 및 통계 조회 API
- Sentry 연동: 에러 모니터링 지원
- API 서버가 이메일 발송 요청 수신
- 스케줄러가 DB에서 발송 대기 요청 주기적 조회
- 센더가 AWS SES를 통해 이메일 발송
- AWS SNS를 통해 발송 결과 수신 및 DB 저장
- 오픈 트래킹으로 이메일 열람 이벤트 기록
- API를 통한 발송 결과 및 통계 조회
flowchart TD
A[클라이언트] -->|이메일 발송 요청| B[API 서버]
B -->|DB 저장| C[스케줄러]
C -->|발송 대기 조회| D[센더]
D -->|SES 발송| E[AWS SES]
E -->|이메일 수신| F[수신자]
E -->|SNS 콜백| G[API 서버]
G -->|DB 저장| H[결과/통계]
F -->|오픈 트래킹| I[API 서버]
I -->|DB 저장| J[오픈 이벤트]
H -->|통계/결과 조회| K[클라이언트]
J -->|통계/결과 조회| K[클라이언트]
필드 | 타입 | 설명 |
---|---|---|
ID | uint (PK) | 내용 고유 식별자 |
TopicId | string (index) | 이메일 주제 식별자 |
Subject | string (not null) | 이메일 제목 |
Content | text (not null) | 이메일 내용 |
필드 | 타입 | 설명 |
---|---|---|
ID | uint (PK) | 요청 고유 식별자 |
TopicId | string (index) | 이메일 주제 식별자 |
MessageId | string (index) | SES 메시지 식별자 |
To | string (not null) | 수신자 이메일 |
ContentId | uint (FK, index) | Content ID 참조 |
ScheduledAt | timestamp (index) | 예약 발송 시간 |
Status | smallint (not null) | 상태 코드 |
Error | string | 오류 메시지 |
CreatedAt | timestamp | 생성 시간 |
UpdatedAt | timestamp | 수정 시간 |
DeletedAt | timestamp | 삭제 시간 |
필드 | 타입 | 설명 |
---|---|---|
ID | uint (PK) | 결과 고유 식별자 |
RequestId | uint (FK, index) | Request ID 참조 |
Status | string (not null, index) | 발송 결과 상태 |
Raw | json | 원시 결과 데이터 |
CreatedAt | timestamp | 생성 시간 |
UpdatedAt | timestamp | 수정 시간 |
DeletedAt | timestamp | 삭제 시간 |
- 0: 생성 완료 (Created)
- 1: 처리 중 (Processing)
- 2: 발송 완료 (Sent)
- 3: 실패 (Failed)
- 4: 중단 (Stopped)
aws-ses-sender-go/
├── main.go # 애플리케이션 진입점
├── api/ # HTTP API 관련 코드
│ ├── handler.go # API 핸들러 함수
│ ├── route.go # API 라우팅 설정
│ ├── server.go # HTTP 서버 설정/실행
│ └── middlewares.go # API 인증 미들웨어
├── cmd/ # 백그라운드 작업 코드
│ ├── scheduler.go # 발송 대기 이메일 스케줄러
│ └── sender.go # SES 이메일 발송 처리
├── config/ # 애플리케이션 설정
│ ├── env.go # 환경 변수 관리
│ └── db.go # 데이터베이스 연결 설정
├── model/ # 데이터베이스 모델
│ └── email.go # GORM 모델 정의
└── pkg/aws/ # AWS 서비스 연동
└── ses.go # SES 이메일 발송
- Go 언어 개발 환경
- AWS 계정 및 SES 서비스 설정
- 발신자 이메일/도메인 인증
- IAM 사용자 생성 및 SES 권한 부여
- PostgreSQL 데이터베이스
- (선택) Sentry DSN
.env
파일을 프로젝트 루트에 생성하여 다음 환경 변수를 설정하세요:
# AWS 관련
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_REGION=ap-northeast-2
EMAIL_SENDER=sender@example.com
# 서버 및 API
SERVER_PORT=3000
API_KEY=your_api_key
SERVER_HOST=http://localhost:3000
# 데이터베이스 (PostgreSQL)
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME=postgres
# 초당 발송 수
EMAIL_RATE=14
# Sentry (선택)
SENTRY_DSN=your_sentry_dsn
-
저장소 복제:
git clone <저장소_URL> cd aws-ses-sender-go
-
의존성 설치:
go mod tidy
-
애플리케이션 실행:
go run main.go
모든 요청에는 x-api-key
헤더가 필요합니다(일부 예외).
POST /v1/messages
요청 본문 예시:
{
"messages": [
{
"topicId": "promotion-event-2024",
"emails": ["recipient1@example.com", "recipient2@example.com"],
"subject": "특별 프로모션 안내",
"content": "<h1>안녕하세요!</h1><p>특별 프로모션 내용을 확인하세요.</p>",
"scheduledAt": "2024-12-25T10:00:00+09:00"
}
]
}
GET /v1/topics/:topicId
GET /v1/events/open?requestId={requestId}
GET /v1/events/counts/sent?hours={hours}
POST /v1/events/results
- 저장소 포크
- 기능 브랜치 생성 (
git checkout -b feature/기능명
) - 변경사항 커밋 (
git commit -m '기능 추가'
) - 브랜치에 푸시 (
git push origin feature/기능명
) - Pull Request 생성
이 프로젝트는 MIT 라이센스 하에 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.