- aws-ses-setup.md: AWS SES email configuration - anvil-ses-final-setup.md: Anvil SES final setup - n8n-setup-guide.md: n8n workflow automation - gitea-setup.md: Gitea server installation - cloudflare-vault-integration.md: Cloudflare + Vault integration Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
195 lines
5.4 KiB
Markdown
195 lines
5.4 KiB
Markdown
# AWS SES 완벽 설정 완료 - anvil.it.com
|
||
|
||
## 🎉 설정 완료 상태
|
||
**Mail-Tester 점수: 10/10 (만점)** ✅
|
||
|
||
설정 완료일: 2025-09-06
|
||
도메인: anvil.it.com
|
||
리전: ap-northeast-2 (Seoul)
|
||
|
||
## 📧 SMTP 설정 정보
|
||
|
||
```yaml
|
||
SMTP_HOST: email-smtp.ap-northeast-2.amazonaws.com
|
||
SMTP_PORT: 587
|
||
SMTP_TLS: true
|
||
SMTP_USERNAME: [Vault: secret/aws/ses/smtp -> smtp_username]
|
||
SMTP_PASSWORD: [Vault: secret/aws/ses/smtp -> smtp_password]
|
||
SMTP_FROM: noreply@anvil.it.com
|
||
```
|
||
|
||
### Vault에서 인증 정보 조회
|
||
```bash
|
||
# 전체 설정 조회
|
||
vault kv get secret/aws/ses/smtp
|
||
|
||
# SMTP Password만 조회
|
||
vault kv get -field=smtp_password secret/aws/ses/smtp
|
||
```
|
||
|
||
## 🔐 DNS 레코드 설정
|
||
|
||
### 1. SPF 레코드 (TXT)
|
||
```
|
||
anvil.it.com TXT "v=spf1 include:_spf.mx.cloudflare.net include:amazonses.com ~all"
|
||
```
|
||
|
||
### 2. DKIM 레코드 (CNAME × 3)
|
||
```
|
||
dgcehnldehfmfgpvrrbc6drwasiibhnp._domainkey.anvil.it.com CNAME dgcehnldehfmfgpvrrbc6drwasiibhnp.dkim.amazonses.com
|
||
spopdscdt2sxngqzl5ir66k3ed6og7ut._domainkey.anvil.it.com CNAME spopdscdt2sxngqzl5ir66k3ed6og7ut.dkim.amazonses.com
|
||
55l5wnmktvacgyfpt6sovcgb2rqexrpy._domainkey.anvil.it.com CNAME 55l5wnmktvacgyfpt6sovcgb2rqexrpy.dkim.amazonses.com
|
||
```
|
||
|
||
### 3. DMARC 레코드 (TXT)
|
||
```
|
||
_dmarc.anvil.it.com TXT "v=DMARC1;p=quarantine;pct=25;rua=mailto:908761dcafa547a981e283a21768d69f@dmarc-reports.cloudflare.net,mailto:dmarc-reports@anvil.it.com;ruf=mailto:dmarc-failures@anvil.it.com"
|
||
```
|
||
|
||
### 4. MAIL FROM 도메인 설정
|
||
```
|
||
# MX 레코드
|
||
bounce.anvil.it.com MX 10 feedback-smtp.ap-northeast-2.amazonses.com
|
||
|
||
# SPF 레코드
|
||
bounce.anvil.it.com TXT "v=spf1 include:amazonses.com ~all"
|
||
```
|
||
|
||
### 5. 도메인 검증 (TXT)
|
||
```
|
||
_amazonses.anvil.it.com TXT "0cuw9v32N+aeFiNlTh2Poxglgzf3BlmFRjVOjeLEdy4="
|
||
```
|
||
|
||
## ✅ AWS SES 상태
|
||
|
||
### 도메인 검증
|
||
- **Status**: Success ✅
|
||
- **DKIM**: Success & Enabled ✅
|
||
- **MAIL FROM**: bounce.anvil.it.com (Success) ✅
|
||
|
||
### 발송 한도
|
||
- **일일 최대**: 50,000통
|
||
- **초당 최대**: 14통
|
||
- **현재 환경**: Production Ready
|
||
|
||
## 🎯 컴플라이언스 달성 상태
|
||
|
||
| 요구사항 | 상태 | 점수 |
|
||
|---------|------|------|
|
||
| SPF Authentication | ✅ Compliant | Pass |
|
||
| DKIM Authentication | ✅ Compliant | Pass |
|
||
| DMARC Authentication | ✅ Quarantine (25%) | Pass |
|
||
| From Header Alignment | ✅ Compliant | Pass |
|
||
| DNS Records | ✅ Compliant | Pass |
|
||
| Encryption | ✅ TLS Required | Pass |
|
||
| One-click Unsubscribe | ✅ RFC 8058 | Pass |
|
||
| Honor Unsubscribe | ✅ Compliant | Pass |
|
||
|
||
**최종 점수: 8/8 (완전 준수)** 🏆
|
||
|
||
## 📱 애플리케이션 통합 예시
|
||
|
||
### Node.js (nodemailer)
|
||
```javascript
|
||
const nodemailer = require('nodemailer');
|
||
|
||
const transporter = nodemailer.createTransporter({
|
||
host: 'email-smtp.ap-northeast-2.amazonaws.com',
|
||
port: 587,
|
||
secure: false,
|
||
auth: {
|
||
user: process.env.SMTP_USERNAME, // SMTP Username
|
||
pass: process.env.SMTP_PASSWORD // SMTP Password (변환된 값)
|
||
}
|
||
});
|
||
|
||
// RFC 8058 호환 메일 발송
|
||
const mailOptions = {
|
||
from: 'noreply@anvil.it.com',
|
||
to: 'user@example.com',
|
||
subject: 'Welcome!',
|
||
html: '<h1>Welcome!</h1>',
|
||
headers: {
|
||
'List-Unsubscribe': '<mailto:unsubscribe@anvil.it.com>, <https://anvil.it.com/unsubscribe>',
|
||
'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click'
|
||
}
|
||
};
|
||
```
|
||
|
||
### Python (smtplib)
|
||
```python
|
||
import smtplib
|
||
from email.mime.multipart import MIMEMultipart
|
||
from email.mime.text import MIMEText
|
||
|
||
msg = MIMEMultipart()
|
||
msg['From'] = 'noreply@anvil.it.com'
|
||
msg['To'] = 'user@example.com'
|
||
msg['Subject'] = 'Welcome!'
|
||
msg['List-Unsubscribe'] = '<mailto:unsubscribe@anvil.it.com>, <https://anvil.it.com/unsubscribe>'
|
||
msg['List-Unsubscribe-Post'] = 'List-Unsubscribe=One-Click'
|
||
|
||
server = smtplib.SMTP('email-smtp.ap-northeast-2.amazonaws.com', 587)
|
||
server.starttls()
|
||
server.login(smtp_username, smtp_password)
|
||
server.send_message(msg)
|
||
server.quit()
|
||
```
|
||
|
||
## 🚀 성과 요약
|
||
|
||
1. **완벽한 인증 체계**: SPF, DKIM, DMARC 모두 통과
|
||
2. **최고 수준 컴플라이언스**: RFC 8058 One-click Unsubscribe 구현
|
||
3. **Gmail 최적화**: Postmaster Tools 준비 완료
|
||
4. **확장 가능한 구조**: 일일 50K 발송 지원
|
||
5. **보안 강화**: 단계적 DMARC 정책 (quarantine 25%)
|
||
|
||
## 📊 모니터링 및 관리
|
||
|
||
### Gmail Postmaster Tools
|
||
- URL: https://postmaster.google.com
|
||
- 도메인 등록: anvil.it.com
|
||
- 데이터 확인: 1-2일 후부터
|
||
|
||
### DMARC 리포트
|
||
- **집계 리포트**: dmarc-reports@anvil.it.com
|
||
- **실패 리포트**: dmarc-failures@anvil.it.com
|
||
- **Cloudflare**: 자동 대시보드 제공
|
||
|
||
### AWS SES 모니터링
|
||
```bash
|
||
# 발송 통계
|
||
aws ses get-send-statistics --region ap-northeast-2
|
||
|
||
# 발송 한도 확인
|
||
aws ses get-send-quota --region ap-northeast-2
|
||
```
|
||
|
||
## 🔄 향후 개선 계획
|
||
|
||
### 1단계 (완료): 기본 설정
|
||
- ✅ 도메인 검증
|
||
- ✅ DKIM 활성화
|
||
- ✅ SPF 설정
|
||
- ✅ DMARC 모니터링
|
||
|
||
### 2단계 (완료): 컴플라이언스
|
||
- ✅ DMARC quarantine (25%)
|
||
- ✅ One-click Unsubscribe
|
||
- ✅ RFC 8058 준수
|
||
|
||
### 3단계 (2주 후): 정책 강화
|
||
- DMARC: p=quarantine;pct=100
|
||
- 평판 안정화 후 p=reject 고려
|
||
- Gmail Postmaster 데이터 분석
|
||
|
||
### 4단계 (1개월 후): 고도화
|
||
- 발송량 점진적 증가 (Warm-up)
|
||
- A/B 테스트 기반 최적화
|
||
- 고급 모니터링 구축
|
||
|
||
---
|
||
|
||
**🎯 결과: anvil.it.com 메일 시스템은 업계 최고 수준으로 설정되었습니다!**
|
||
|
||
Mail-Tester 10/10 점수는 모든 주요 메일 서비스에서 anvil.it.com을 신뢰할 수 있는 발신자로 인식한다는 의미입니다. |