← 홈으로 돌아가기

SendGrid 설정 가이드 - Rankly (rankly.kr)

📋 체크리스트


1️⃣ SendGrid 도메인 인증 설정

Step 1: SendGrid 콘솔 접속

  1. https://app.sendgrid.com 접속
  2. SendGrid 계정으로 로그인

Step 2: Sender Authentication 메뉴

  1. 좌측 메뉴 → SettingsSender Authentication 클릭
  2. "Authenticate Your Domain" 섹션 찾기
  3. 파란색 "Get Started" 또는 "Authenticate Your Domain" 버튼 클릭

Step 3: DNS 호스트 선택

  1. "Select your DNS host""Other Host" 선택
  2. 가비아는 목록에 없으므로 Other Host 선택
  3. Next 클릭

Step 4: 도메인 정보 입력

  1. "What domain would you like to authenticate?"
  2. 입력: rankly.kr

  3. Advanced Settings (선택사항, 기본값 사용 권장):

  4. ✅ Use automated security (DKIM 자동 회전, 권장)
  5. ❌ Custom return path
  6. ❌ Link branding

  7. Next 클릭

Step 5: DNS 레코드 정보 받기

SendGrid가 3개의 CNAME 레코드를 제공합니다. 반드시 메모하거나 화면 캡처하세요!

예시:

Host                                    Type    Data/Value
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
em1234.rankly.kr                        CNAME   u12345.wl123.sendgrid.net
s1._domainkey.rankly.kr                 CNAME   s1.domainkey.u12345.wl123.sendgrid.net
s2._domainkey.rankly.kr                 CNAME   s2.domainkey.u12345.wl123.sendgrid.net

⚠️ 주의: 위 값들은 예시입니다. SendGrid에서 제공하는 실제 값을 사용해야 합니다!


2️⃣ 가비아 DNS 레코드 추가

Step 1: 가비아 DNS 관리 페이지 접속

  1. https://www.gabia.com 로그인
  2. My가비아 클릭
  3. 서비스 관리도메인 메뉴
  4. rankly.kr 도메인 찾기
  5. 관리도구DNS 정보 (또는 DNS 관리) 클릭

Step 2: CNAME 레코드 추가

SendGrid에서 제공한 3개의 레코드를 각각 추가합니다.

레코드 1: Email 브랜딩

타입: CNAME
호스트: em1234          (SendGrid에서 제공한 값의 .rankly.kr 앞부분만)
값/위치: u12345.wl123.sendgrid.net     (SendGrid에서 제공한 값)
TTL: 3600 (1시간) 또는 기본값

레코드 2: DKIM 서명 1

타입: CNAME
호스트: s1._domainkey
값/위치: s1.domainkey.u12345.wl123.sendgrid.net
TTL: 3600

레코드 3: DKIM 서명 2

타입: CNAME
호스트: s2._domainkey
값/위치: s2.domainkey.u12345.wl123.sendgrid.net
TTL: 3600

Step 3: SPF 레코드 추가 (권장)

기존 SPF 레코드 확인

먼저 현재 SPF 레코드가 있는지 확인:

nslookup -type=TXT rankly.kr

Case A: SPF 레코드가 없는 경우

새로 추가:

타입: TXT
호스트: @
값: v=spf1 include:_spf.daum.net include:sendgrid.net ~all
TTL: 3600

Case B: SPF 레코드가 이미 있는 경우

기존 레코드에 include:sendgrid.net 추가:

Before:

v=spf1 include:_spf.daum.net ~all

After:

v=spf1 include:_spf.daum.net include:sendgrid.net ~all

Step 4: 저장 및 전파 대기

  1. 모든 레코드 저장
  2. DNS 전파 대기 (10분~1시간, 최대 48시간)

3️⃣ DNS 전파 확인

Windows에서 확인

# CNAME 레코드 확인
nslookup -type=CNAME em1234.rankly.kr
nslookup -type=CNAME s1._domainkey.rankly.kr
nslookup -type=CNAME s2._domainkey.rankly.kr

# SPF 레코드 확인
nslookup -type=TXT rankly.kr

온라인 도구로 확인

성공 예시:

em1234.rankly.kr → u12345.wl123.sendgrid.net

실패 예시:

Non-existent domain (아직 전파 안 됨)

4️⃣ SendGrid 도메인 인증 완료

Step 1: 인증 확인

  1. SendGrid 콘솔 → Sender Authentication 페이지
  2. 대기 중인 도메인 인증 찾기
  3. "Verify" 버튼 클릭

Step 2: 인증 결과 확인

Step 3: 인증 완료 확인

인증이 완료되면: - noreply@rankly.kr에서 이메일 발송 가능 - 도메인 신뢰도 향상 (스팸 방지)


5️⃣ 이메일 발송 테스트

방법 1: Python 테스트 스크립트 실행

cd mysite
python test_sendgrid_email.py

테스트 항목: 1. 기본 이메일 발송 2. OTP 이메일 발송 (실제 OTP 코드 생성) 3. Reply-To 헤더 확인

입력 예시:

테스트 이메일 주소를 입력하세요: your-email@example.com

방법 2: Django Shell

cd mysite
python manage.py shell
from django.core.mail import send_mail
from django.conf import settings

# 간단한 테스트
send_mail(
    subject='[Rankly] 테스트',
    message='SendGrid 연동 테스트입니다.',
    from_email=settings.DEFAULT_FROM_EMAIL,
    recipient_list=['your-email@example.com'],
    fail_silently=False,
)
print("✅ 발송 완료! 이메일함을 확인하세요.")

방법 3: API 엔드포인트 테스트

서버 실행:

cd mysite
python manage.py runserver

OTP 발송:

curl -X POST "http://localhost:8000/api/v1/accounts/otp/send" \
  -H "Content-Type: application/json" \
  -d '{"email": "your-email@example.com"}'

성공 응답:

{
  "detail": "OTP가 발송되었습니다.",
  "expires_at": "2025-12-09T13:00:00+09:00"
}

6️⃣ 도메인 인증 전 임시 발송 방법

도메인 인증이 완료되기 전에 테스트하려면 Single Sender Verification 사용:

Single Sender 인증

  1. SendGrid 콘솔 → Settings → Sender Authentication
  2. "Verify a Single Sender" 섹션
  3. "Create New Sender" 클릭
  4. 정보 입력:
  5. From Name: Rankly
  6. From Email Address: admin@rankly.kr 또는 개인 Gmail
  7. Reply To: admin@rankly.kr
  8. Company Address, City, State, Zip, Country: 회사 정보
  9. Create 클릭
  10. 입력한 이메일로 인증 메일 발송 → 링크 클릭하여 인증

주의: Single Sender는 1개 이메일만 인증 가능. 도메인 인증 완료 후에는 불필요.


7️⃣ 트러블슈팅

문제 1: "Authentication failed"

원인: SendGrid API 키가 잘못되었거나 만료됨
해결:
  1. .live1.env 파일의 SENDGRID_API_KEY 확인
  2. SendGrid 콘솔 → Settings → API Keys에서 새 키 생성
  3. 환경변수 업데이트 후 서버 재시작

문제 2: "Unverified sender"

원인: 발신 이메일 주소가 인증되지 않음
해결:
  1. Single Sender Verification으로 임시 인증 (admin@rankly.kr)
  2. 또는 도메인 인증 완료 대기

문제 3: "Connection refused" 또는 "Timeout"

원인: 네트워크 또는 방화벽 문제
해결:
  1. 포트 587이 열려 있는지 확인
  2. 방화벽 설정 확인
  3. 프록시 설정 확인
  4. VPN 연결 시 해제 후 재시도

문제 4: 이메일이 스팸으로 분류됨

원인: 도메인 신뢰도 부족 또는 SPF/DKIM 미설정
해결:
  1. SPF 레코드 확인
  2. DKIM 인증 완료 확인 (도메인 인증 시 자동)
  3. 도메인 Warm-up 필요 (처음에는 소량 발송)
  4. 이메일 내용 개선 (스팸 키워드 제거)

문제 5: DNS 레코드가 확인되지 않음

원인: DNS 전파 미완료
해결:
  1. 10분~1시간 대기
  2. DNS 캐시 초기화:
     Windows: ipconfig /flushdns
  3. 레코드 값 재확인 (오타 여부)
  4. TTL 값 확인 (3600 권장)

8️⃣ 현재 설정 상태

환경변수 (.live1.env)

SENDGRID_API_KEY=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
DEFAULT_FROM_EMAIL=noreply@rankly.kr
REPLY_TO_EMAIL=admin@rankly.kr

Django Settings

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey'
EMAIL_HOST_PASSWORD = os.environ.get("SENDGRID_API_KEY")
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'noreply@rankly.kr'
REPLY_TO_EMAIL = 'admin@rankly.kr'

이메일 주소 구조


9️⃣ 단계별 실행 가이드

Phase 1: Single Sender 인증 (즉시 테스트용)

도메인 인증 완료 전에 빠르게 테스트하려면:

  1. SendGrid → Settings → Sender Authentication
  2. Verify a Single SenderCreate New Sender
  3. 정보 입력: From Name: Rankly From Email: admin@rankly.kr Reply To: admin@rankly.kr
  4. admin@rankly.kr 이메일함에서 인증 링크 클릭
  5. .live1.env 수정: env DEFAULT_FROM_EMAIL=admin@rankly.kr # 임시
  6. 테스트 스크립트 실행: bash cd mysite python test_sendgrid_email.py

Phase 2: 도메인 인증 (프로덕션용)

도메인 전체를 인증하여 noreply@rankly.kr 등 모든 주소 사용:

  1. SendGrid 도메인 인증 시작 (위 1️⃣ 참고)
  2. DNS 레코드 추가 (위 2️⃣ 참고)
  3. DNS 전파 대기 (10분~1시간)
  4. SendGrid에서 Verify 클릭
  5. .live1.env 수정: env DEFAULT_FROM_EMAIL=noreply@rankly.kr # 프로덕션 REPLY_TO_EMAIL=admin@rankly.kr

🔟 테스트 실행

터미널에서 테스트

cd mysite
python test_sendgrid_email.py

입력 프롬프트:

테스트 이메일 주소를 입력하세요: admin@rankly.kr

예상 출력:

╔══════════════════════════════════════════════════════════╗
║               Rankly SendGrid 테스트                     ║
╚══════════════════════════════════════════════════════════╝

📧 수신 이메일: admin@rankly.kr
📤 발신 이메일: noreply@rankly.kr
💬 답장 이메일: admin@rankly.kr
🔑 API 키: 설정됨 (SG.zJMBIHI...)

Enter를 눌러 테스트를 시작하세요...

══════════════════════════════════════════════════════════
1. 기본 이메일 발송 테스트
══════════════════════════════════════════════════════════
발신: noreply@rankly.kr
수신: admin@rankly.kr
✅ 발송 성공! (발송 수: 1)
   이메일함을 확인하세요 (스팸 폴더도 확인)

══════════════════════════════════════════════════════════
2. OTP 이메일 발송 테스트
══════════════════════════════════════════════════════════
테스트 사용자: 귀여운토끼123 (admin@rankly.kr)
✅ OTP 발송 성공!
   - OTP 코드: 123456
   - 만료 시간: 2025-12-09 13:00:00+09:00
   - 이메일함을 확인하세요

══════════════════════════════════════════════════════════
3. Reply-To 헤더 테스트
══════════════════════════════════════════════════════════
✅ 발송 성공!
   - From: noreply@rankly.kr
   - Reply-To: admin@rankly.kr

══════════════════════════════════════════════════════════
테스트 결과 요약
══════════════════════════════════════════════════════════
기본 이메일: ✅ 성공
OTP 이메일: ✅ 성공
Reply-To 헤더: ✅ 성공

총 3개 테스트 중 3개 성공

💡 OTP 코드: 123456
   이 코드로 회원가입을 테스트할 수 있습니다.

이메일함 확인

admin@rankly.kr 이메일함에서 3개의 이메일 확인: 1. [Rankly] SendGrid 테스트 2. [Rankly] 이메일 인증 코드 (OTP 포함) 3. [Rankly] Reply-To 테스트


1️⃣1️⃣ 프로덕션 배포 전 최종 확인

체크리스트

환경변수 최종 확인

cat .live1.env | grep -E "SENDGRID|EMAIL"

예상 출력:

SENDGRID_API_KEY=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
DEFAULT_FROM_EMAIL=noreply@rankly.kr
REPLY_TO_EMAIL=admin@rankly.kr

1️⃣2️⃣ SendGrid 모니터링

Activity Feed

Stats

Alerts 설정

  1. Settings → Alerts
  2. 다음 알림 설정 권장:
  3. Usage limit alert (발송량 80% 도달 시)
  4. Bounce rate alert (반송률 5% 초과 시)

1️⃣3️⃣ 다음 단계

도메인 인증 완료 후

  1. ✅ 테스트 스크립트 실행
  2. ✅ 실제 회원가입 플로우 테스트
  3. ✅ 여러 이메일 서비스에서 수신 확인 (Gmail, Naver, Daum 등)
  4. ✅ 스팸 점수 확인: https://www.mail-tester.com

추가 개선사항


❓ FAQ

Q: noreply@rankly.kr 이메일을 받을 수 있나요? - 아니요. noreply@는 발송 전용입니다. 사용자가 답장하면 admin@rankly.kr로 전달됩니다.

Q: 도메인 인증 없이 발송할 수 있나요? - Single Sender Verification으로 1개 이메일만 가능합니다. - 프로덕션에서는 반드시 도메인 인증 필요합니다.

Q: 하루에 몇 개까지 발송 가능한가요? - SendGrid 무료 플랜: 하루 100개 - 유료 플랜: 플랜에 따라 다름 (Essentials 50K/월부터)

Q: 이메일이 스팸으로 분류됩니다. - 도메인 인증 완료 확인 - SPF/DKIM 설정 확인 - 처음에는 소량 발송으로 시작 (Warm-up) - 이메일 내용에 스팸 키워드 제거

Q: DNS 레코드 추가 후 얼마나 기다려야 하나요? - 보통 10분~1시간 - 최대 48시간까지 걸릴 수 있음 - 온라인 도구로 주기적으로 확인


📞 문의


작성일: 2025-12-09
프로젝트: Rankly
도메인: rankly.kr