https://github.com/lee-lou2/rust-aws-ses-sender
[Rust] AWS SES Email Sender
https://github.com/lee-lou2/rust-aws-ses-sender
aws-ses aws-sns notifications notify rust rust-lang
Last synced: 6 months ago
JSON representation
[Rust] AWS SES Email Sender
- Host: GitHub
- URL: https://github.com/lee-lou2/rust-aws-ses-sender
- Owner: lee-lou2
- Created: 2025-02-17T11:33:12.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-04-10T22:44:36.000Z (6 months ago)
- Last Synced: 2025-04-29T22:42:57.594Z (6 months ago)
- Topics: aws-ses, aws-sns, notifications, notify, rust, rust-lang
- Language: Rust
- Homepage:
- Size: 161 KB
- Stars: 19
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.ko.md
Awesome Lists containing this project
README
# ๐ง AWS SES ์ด๋ฉ์ผ ๋ฐ์ก๊ธฐ
[ํ๊ตญ์ด](README.ko.md) | [English](README.md)
AWS SES์ SNS๋ฅผ ํ์ฉํ ๊ณ ์ฑ๋ฅ ๋๋ ์ด๋ฉ์ผ ๋ฐ์ก ๋ฐ ๋ชจ๋ํฐ๋ง ์๋ฒ์ ๋๋ค.
Rust์ Tokio๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์ด ๋์ ์ฒ๋ฆฌ๋๊ณผ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.## ๐ ์์คํ ์ํคํ ์ฒ
### ๊ธฐ์ ์คํ
- ๐ฆ **Backend**: Rust + Axum
- ๐จ **Email Service**: AWS SES
- ๐ **Notification**: AWS SNS
- ๐ **Async Runtime**: Tokio
- ๐พ **Database**: SQLite### ๋์ ๋ฐฉ์
#### ์ฆ์ ๋ฐ์ก ํ๋ก์ธ์ค
1. API ์์ฒญ ์์ (`/v1/messages`)
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ก ์์ฒญ ์ ์ฅ
3. Tokio ์ฑ๋์ ํตํด ๋ฐ์ก๊ธฐ๋ก ์ฆ์ ์ ๋ฌ
4. AWS SES ๋ฐ์ก ์๋ ์ ํ์ ๋ง์ถฐ ์์ฐจ ์ฒ๋ฆฌ
5. ๋ฐ์ก ๊ฒฐ๊ณผ ๋น๋๊ธฐ ์ ์ฅ#### ์์ฝ ๋ฐ์ก ํ๋ก์ธ์ค
1. API ์์ฒญ ์์ (scheduled_at ํฌํจ)
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฝ ์ ๋ณด ์ ์ฅ
3. ์ค์ผ์ค๋ฌ๊ฐ 1๋ถ ์ฃผ๊ธฐ๋ก ์์ฝ๋ ์์ ํ์ธ
4. ๋ฐ์ก ์๊ฐ์ด ๋ ๋ฉ์ผ์ ๋ฐ์ก๊ธฐ๋ก ์ ๋ฌ
5. ์ฆ์ ๋ฐ์ก๊ณผ ๋์ผํ ํ๋ก์ธ์ค๋ก ์ฒ๋ฆฌ### ์ฑ๋ฅ ์ต์ ํ
- Tokio ๊ธฐ๋ฐ ๋น๋๊ธฐ ๋ฐํ์ ํ์ฉ
- ๊ฒฝ๋ ์ค๋ ๋๋ก ๋ฆฌ์์ค ์ฌ์ฉ ์ต์ํ
- ์ฑ๋ ๊ธฐ๋ฐ ํจ์จ์ ํ์คํฌ ๋ถ๋ฐฐ
- AWS SES ๋ฐ์ก ์๋ ์ ํ ์๋ ์ค์
## โจ ์ฃผ์ ๊ธฐ๋ฅ
- ๐ ๋๋ ์ด๋ฉ์ผ ๋ฐ์ก ๋ฐ ์์ฝ ๋ฐ์ก
- ๐ ์ค์๊ฐ ๋ฐ์ก ๊ฒฐ๊ณผ ๋ชจ๋ํฐ๋ง
- ๐ ์ด๋ฉ์ผ ์ด๋ ์ถ์
- โธ ๋๊ธฐ ์ค์ธ ์ด๋ฉ์ผ ๋ฐ์ก ์ทจ์
- ๐ ๋ฐ์ก ํต๊ณ ๋ฐ ๊ฒฐ๊ณผ ๋ถ์## ๐ง ์ค์ ๊ฐ์ด๋
### AWS SES ์ค์ ํ๊ธฐ
[๐ ์์ธํ ๋ณด๊ธฐ: ํด๋น ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์](https://lee-lou2.notion.site/19d4d6ae33b58092a019ee88de9ca8a0?pvs=4)
#### 1๏ธโฃ ์๋๋ฐ์ค ๋ชจ๋ ํด์ (ํ๋ก๋์ ํ๊ฒฝ)
- AWS SES๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋๋ฐ์ค ๋ชจ๋๋ก ์์
- ํ๋ก๋์ ํ๊ฒฝ์ ์ํด [AWS Support Center์์ ์๋๋ฐ์ค ํด์ ์์ฒญ](https://docs.aws.amazon.com/ses/latest/dg/request-production-access.html) ํ์#### 2๏ธโฃ ๋๋ฉ์ธ ์ธ์ฆ
- AWS SES ์ฝ์์์ ๋๋ฉ์ธ ๋ฑ๋ก
- DNS์ DKIM, SPF ๋ ์ฝ๋ ์ถ๊ฐ (์ ๊ณต๋ ๋ ์ฝ๋ ์ฌ์ฉ)
- ์ธ์ฆ ์๋ฃ๊น์ง ์ต๋ 72์๊ฐ ์์#### 3๏ธโฃ ์ด๋ฉ์ผ ์ฃผ์ ์ธ์ฆ (์๋๋ฐ์ค ๋ชจ๋)
- AWS SES ์ฝ์์์ ๋ฐ์ ์ ์ด๋ฉ์ผ ๋ฑ๋ก
- ์ธ์ฆ ์ด๋ฉ์ผ์ ํ์ธ ๋งํฌ๋ก ์ธ์ฆ ์๋ฃ### AWS SNS ์ค์ ํ๊ธฐ (์ ํ์ฌํญ)
#### 1๏ธโฃ SNS ์ฃผ์ ์์ฑ
- AWS SNS ์ฝ์์์ ์ ์ฃผ์ ์์ฑ
- ์๋ฆผ์ ๋ฐ์ ์ฃผ์ ์ด๋ฆ ์ค์ #### 2๏ธโฃ SES ์ด๋ฒคํธ ์ค์
- SES Configuration Sets์์ ์ ์ค์ ์์ฑ
- SNS ์ด๋ฒคํธ ๋์ ์ถ๊ฐ
- ์ด๋ฒคํธ: Bounce, Complaint, Delivery
- ์์ฑํ SNS ์ฃผ์ ์ฐ๊ฒฐ#### 3๏ธโฃ SNS ๊ตฌ๋ ์ค์
- SNS ์ฃผ์ ์ ๊ตฌ๋ ์ถ๊ฐ (HTTP/HTTPS, Email, SQS)
- ๊ตฌ๋ ํ์ธ ์ ์ฐจ ์๋ฃ
- HTTP/HTTPS: ์๋ํฌ์ธํธ์์ ํ์ธ ์์ฒญ ์ฒ๋ฆฌ
- Email: ํ์ธ ๋งํฌ ํด๋ฆญ
## โ๏ธ ํ๊ฒฝ ๋ณ์
```env
# AWS ์ค์
AWS_REGION=ap-northeast-2
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
AWS_SES_FROM_EMAIL=your_verified_email# ์๋ฒ ์ค์
SERVER_URL=http://localhost:3000
SERVER_PORT=3000
DATABASE_URL=sqlite://sqlite3.db
JWT_SECRET=your_secret_key # Optional
MAX_SEND_PER_SECOND=12SENTRY_DSN=your_sentry_dsn # Optional
```## ๐ก API ๊ฐ์ด๋
### ์ด๋ฉ์ผ ๋ฐ์ก
```http
POST /v1/messages
```๋๋ ์ด๋ฉ์ผ ๋ฐ์ก ๋ฐ ์์ฝ ๋ฐ์ก์ ์ฒ๋ฆฌํฉ๋๋ค.
```json
{
"messages": [
{
"topic_id": "newsletter_2024_01", // ์ปค์คํ ์๋ณ์
"emails": ["user@example.com"],
"subject": "1์ ๋ด์ค๋ ํฐ",
"content": "์๋ ํ์ธ์..." // HTML ํ์
}
],
"scheduled_at": "2024-01-01 09:00:00" // ์ ํ์ฌํญ
}
```### ๋ฐ์ก ๊ฒฐ๊ณผ ์ถ์
#### ๐จ SNS ์ด๋ฒคํธ ์์
```http
POST /v1/events/results
```
AWS SES๋ก๋ถํฐ ์ค์๊ฐ ๋ฐ์ก ๊ฒฐ๊ณผ๋ฅผ ์์ ํฉ๋๋ค:
- โ Delivery: ๋ฐ์ก ์ฑ๊ณต
- โ Bounce: ๋ฐ์ก ์คํจ
- โ ๏ธ Complaint: ์คํธ ์ ๊ณ#### ๐ ์ด๋ฉ์ผ ์ด๋ ํ์ธ
```http
GET /v1/events/open?request_id={request_id}
```
1x1 ํฌ๋ช ์ด๋ฏธ์ง๋ฅผ ํตํด ์ด๋ฉ์ผ ์ด๋ ์ฌ๋ถ๋ฅผ ์ถ์ ํฉ๋๋ค.
- ์ด๋ฉ์ผ ๋ณธ๋ฌธ ํ๋จ์ ์๋ ํฌํจ
- ์ด๋ฉ์ผ ์ด๋ ์ ์๋์ผ๋ก ์๋ฒ์ ๊ธฐ๋ก
- request_id๋ก ๊ฐ๋ณ ์์ ์ ํ์ธ ๊ฐ๋ฅ### ๋ชจ๋ํฐ๋ง & ๊ด๋ฆฌ
#### ๐ ๋ฐ์ก ํ๋ ํ์ธ
```http
GET /v1/events/counts/sent
```
AWS SES ์ผ์ผ ๋ฐ์ก ํ๋ ๋ฐ ์์ฌ ์๋์ ํ์ธํฉ๋๋ค.#### ๐ ํ ํฝ๋ณ ๊ฒฐ๊ณผ ์กฐํ
```http
GET /v1/topics/{topic_id}
```
topic_id ๊ธฐ์ค์ผ๋ก ๋ฐ์ก ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํฉ๋๋ค:
- ์ด ๋ฐ์ก ์
- ์ฑ๊ณต/์คํจ ์
- ์ด๋ ์#### โน ๋ฐ์ก ์ทจ์
```http
DELETE /v1/topics/{topic_id}
```
๋๊ธฐ ์ค์ธ ์ด๋ฉ์ผ ๋ฐ์ก์ ์ทจ์ํฉ๋๋ค.
- topic_id์ ํด๋นํ๋ ๋ชจ๋ ๋๊ธฐ ๋ฉ์ผ ์ทจ์
- ์ด๋ฏธ ๋ฐ์ก๋ ๋ฉ์ผ์ ์ทจ์ ๋ถ๊ฐ## ๐ ์ฐธ๊ณ ์๋ฃ
- [AWS SES ๊ฐ๋ฐ์ ๊ฐ์ด๋](https://docs.aws.amazon.com/ses/latest/dg/Welcome.html)
- [AWS SNS ๊ฐ๋ฐ์ ๊ฐ์ด๋](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)