이메일 전달은 SMTP 프로토콜과 SPF, DKIM, DMARC 인증 메커니즘을 이용해 수신자의 받은편지함에 안정적으로 이메일을 전달하는 기술 영역이다.
이메일 인증 삼총사
| 기술 | 역할 | DNS 레코드 |
|---|
| SPF | 허가된 발신 서버 목록 | TXT 레코드 |
| DKIM | 이메일 내용 서명 (변조 방지) | TXT 레코드 |
| DMARC | SPF/DKIM 실패 시 정책 | TXT 레코드 |
DNS 설정 예시
# SPF: 허가된 IP/도메인 목록
example.com. IN TXT "v=spf1 include:sendgrid.net include:amazonses.com -all"
# DKIM: 공개 키 (개인 키로 서명, 공개 키로 검증)
default._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
# DMARC: 정책 설정
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
Node.js: Nodemailer + AWS SES
typescript
import nodemailer from 'nodemailer';
import aws from '@aws-sdk/client-ses';
const ses = new aws.SES({ region: 'us-east-1' });
const transporter = nodemailer.createTransport({
SES: { ses, aws },
sendingRate: 14, // 초당 14개 (SES 제한)
});
// 이메일 발송
async function sendWelcomeEmail(to: string, name: string) {
const info = await transporter.sendMail({
from: '"My App" <noreply@example.com>',
to,
subject: `${name}님, 환영합니다!`,
html: `
<html>
<body>
<h1>안녕하세요, ${name}님!</h1>
<p>가입해주셔서 감사합니다.</p>
<a href="https://example.com/verify?token=...">이메일 인증하기</a>
</body>
</html>
`,
text: `안녕하세요, ${name}님! 이메일 인증: https://example.com/verify?token=...`,
headers: {
'X-Custom-Header': 'value',
},
});
return info.messageId;
}
이메일 전달률 개선
핵심 지표:
- 전달률 (Deliverability): 받은 편지함 도달 비율
- 반송률 (Bounce Rate): 전달 실패 비율
- 스팸 신고율 (Complaint Rate): 스팸 표시 비율
모범 사례:
1. 수신 동의(Double Opt-in) 확인
2. 하드 반송 즉시 제거
3. 발송 도메인과 웹사이트 도메인 일치
4. 비율 유지 (텍스트:이미지 = 60:40)
5. 발송량 점진적 웜업 (Warm-up)
Webhook으로 반송 처리
typescript
// SendGrid Webhook
app.post('/webhooks/sendgrid', (req, res) => {
const events = req.body;
for (const event of events) {
switch (event.event) {
case 'bounce':
handleBounce(event.email, event.type); // hard/soft bounce
break;
case 'spamreport':
unsubscribeUser(event.email);
break;
case 'unsubscribe':
unsubscribeUser(event.email);
break;
}
}
res.status(200).send('OK');
});
관련 개념