검색 K
밝은/어두운 배경
밝은/어두운 배경
게시물 정보
이메일 발송은 api/_mailer.ts 한 파일에서 전담합니다. 발송 서비스로 Resend를 사용합니다.
| 변수 | 설명 |
|---|---|
RESEND_API_KEY | Resend API 키 |
ADMIN_EMAIL | 운영자 수신 이메일 주소 |
REVIEW_BASE_URL | 이메일 내 링크의 기준 URL (예: https://briefingk.vercel.app) |
| 함수 | 수신자 | 발송 시점 |
|---|---|---|
sendAdminBatchEmail | 운영자 | 피드 등록 신청 접수 시 |
sendBatchResultEmail | 사용자 | 배치 전체 등록 검토 완료 시 |
sendWithdrawAdminEmail | 운영자 | 피드 철회 신청 접수 시 |
sendWithdrawResultEmail | 사용자 | 배치 전체 철회 검토 완료 시 |
sendReminderEmail | 운영자 | 3일 이상 미처리 신청 재알림 시 |
모든 함수는 내부 sendEmail() 헬퍼를 통해 발송하며, 실패 시 예외를 throw하지 않고 false를 반환합니다.
제목: [RSS 등록 신청] {folderName} — {N}개 피드
1. 신청 계정 정보
2. 신청자 메모 (있는 경우)
3. [전체 승인] 버튼 + [전체 반려] 버튼들
4. 피드별 카드 (각각 개별 승인/반려 버튼 포함)
- 피드 제목, RSS URL, 웹사이트, RSS 검증 결과 배지제목: [RSS 철회 신청] {folderName} — {N}개 피드
1. 신청 계정 정보
2. [전체 철회 승인] 버튼 + [전체 철회 반려] 버튼
3. 피드별 카드 (개별 확인/거부 버튼 포함)제목: [RSS 재알림 {N}회] {feedTitle} ({folderName}) — {N}일 경과
- 대기 일수 및 재알림 회차 표시
- 신청 상세 정보 (신청자, 피드 정보)
- [승인] 버튼 + [반려] 버튼들운영자 이메일의 반려 버튼은 사유 코드를 쿼리 파라미터로 전달합니다. _ops.ts의 consumeReviewToken()이 코드를 레이블로 변환하여 DB에 저장합니다.
코드 (reason=) | DB 저장값 |
|---|---|
unreachable | RSS URL에 접근할 수 없습니다. |
inappropriate | 부적절한 콘텐츠가 포함되어 있습니다. |
invalid_format | RSS 형식이 올바르지 않습니다. |
반려 사유를 추가하려면 _mailer.ts의 REJECT_LABELS 객체에 항목을 추가합니다. 코드(key)는 URL 쿼리 파라미터로 사용되므로 영문 소문자와 언더스코어만 사용합니다.
_html.ts) 메일 HTML의 인라인 스타일은 _html.ts의 styles 객체에서 중앙 관리합니다.
| 스타일 키 | 용도 |
|---|---|
container | 최외곽 래퍼 (max-width 540px) |
card | 피드 정보 카드 |
btnGreen | 승인 계열 전체 너비 버튼 |
btnRed | 철회 승인 계열 전체 너비 버튼 |
btnGray | 반려/거부 계열 전체 너비 버튼 |
btnSmall | 피드 카드 내 개별 처리 버튼 |
label | 필드명 레이블 (대문자, 작은 글씨) |
value | 필드값 텍스트 |
badge(ok) | 승인/반려 상태 배지 (ok 여부에 따라 색상 분기) |
divider | 구분선 |
메일 디자인을 변경할 때는 _html.ts만 수정하면 모든 메일 템플릿에 반영됩니다.
scripts/send-reminders.ts) 3일 이상 처리되지 않은 등록 신청에 대해 운영자에게 재알림 이메일을 보내는 스크립트입니다. GitHub Actions 스케줄로 실행됩니다.
실행 조건 (모두 충족 시):
status = 'pending'requested_at < NOW() - 3 daysreminder_count < 5 (MAX_REMINDER_COUNT)last_reminded_at IS NULL OR last_reminded_at < NOW() - 3 days카운트 갱신 정책: 이메일 발송이 성공한 경우에만 reminder_count와 last_reminded_at을 갱신합니다. 발송 실패 시 다음 실행에서 재시도합니다.
종료 코드: 실패 건이 1건 이상이면 process.exit(1)로 종료하여 GitHub Actions에서 실패로 감지할 수 있습니다.