이메일
앱에서 트랜잭션 이메일을 발송하세요. 앱의 Admin > Email에서 발신자 ID를 관리하고 전송 현황을 추적할 수 있습니다.
모든 Proyecta 앱은 트랜잭션 이메일을 발송할 수 있습니다. 발신자 ID를 인증한 후 앱 코드에서 바로 발송하세요 — 별도의 이메일 서비스 계정은 필요하지 않습니다.
이메일 섹션
섹션 제목: “이메일 섹션”builder에서 Admin > Email을 열거나, 배포된 사이트의 /admin으로 이동하세요. 두 가지 영역으로 구성되어 있습니다:
| 영역 | 용도 |
|---|---|
| Identities | 발신자 이메일 주소 또는 도메인을 추가하고 인증합니다 |
| Sent | 전송된 이메일과 전송 상태(sent, delivered, bounced 등)를 확인합니다 |
코드를 작성하지 않고도 새 발신자 ID를 추가하고 이메일 전송 내역을 확인할 수 있습니다.
2단계 설정
섹션 제목: “2단계 설정”- 발신자 ID 생성 및 인증 — 관리 패널에서 이메일 주소 또는 도메인을 등록합니다
- 발송 — 앱에서
useSendEmail()을 사용하거나, 관리 패널에서 직접 발송합니다
공유 주소로 발송하기 (@proyectamail.com)
섹션 제목: “공유 주소로 발송하기 (@proyectamail.com)”가장 간단한 방법은 Proyecta의 공유 발송 도메인인 @proyectamail.com에서 주소를 하나 생성하는 것입니다. 플랫폼이 이미 해당 도메인을 소유하고 있으므로 DNS 레코드를 설정할 필요 없이 생성 즉시 인증이 완료됩니다.
앱 관리 패널의 Emails 섹션에서 원하는 주소를 입력하면 바로 사용할 수 있습니다.
단일 주소는 @proyectamail.com에서만 사용할 수 있습니다. 다른 도메인(예: hello@myapp.com)으로 요청하면 거부됩니다 — 자체 도메인에서 발송하려면 도메인 전체를 인증해야 합니다(아래 참고). 공유 주소는 전역적으로 예약되므로 동일한 @proyectamail.com 발신자로 두 앱이 동시에 발송할 수 없습니다.
자체 도메인 인증 (Pro)
섹션 제목: “자체 도메인 인증 (Pro)”자체 도메인의 모든 주소(hello@, support@, noreply@ 등)에서 발송하려면 도메인 전체를 인증해야 합니다. 공유 @proyectamail.com 주소와 달리, 커스텀 도메인은 즉시 인증되지 않습니다.
동일한 Emails 섹션에서 도메인을 추가하세요. 이메일 서비스에 등록되며, DNS에 게시해야 하는 SPF, DKIM, DMARC 레코드가 표시됩니다. 레코드가 전파되고 서비스에서 확인되기 전까지 발신자는 pending 상태를 유지하다가, 확인이 완료되면 verified로 전환됩니다 — 레코드를 게시한 후 재확인 버튼을 사용하세요.
DNS 기반 도메인 인증은 완전히 구현되어 있습니다 — 레코드는 서비스에 의해 생성되며, 재확인할 때마다 상태가 다시 조회됩니다.
내부 동작 방식: Proyecta는 이메일 ID 서비스(Resend)를 통해 발송 도메인을 인증하고, 트랜잭션 서비스(SendGrid)를 통해 메시지를 전달합니다. 두 서비스 모두 직접 계정을 관리할 필요가 없습니다.
앱에서 이메일 발송하기
섹션 제목: “앱에서 이메일 발송하기”앱의 페이지에서는 useSendEmail() 훅을 사용해 이메일을 발송합니다. 템플릿을 선택하고 변수를 전달하면, 플랫폼이 앱 언어에 맞게 메시지를 렌더링하여 발송합니다:
import { useSendEmail } from '@/hooks/useEmail.ts';
function ConfirmButton({ booking }) { const { send, isPending, error } = useSendEmail();
return ( <button disabled={isPending} onClick={() => send({ template: 'booking_confirmation', variables: { date: booking.date, service: booking.service }, }) } > Email me the details </button> );}주목할 점은 전달하지 않는 값입니다: 수신자, 제목, HTML이 없습니다. 각 템플릿은 자체적으로 대상을 정의합니다:
self(예약/주문 확인, 환영 메시지) → 세션에서 가져온 로그인 사용자 본인의 주소owner(owner_alert) → 앱의 관리자
두 경우 모두 로그인 세션이 필요합니다. 이는 의도된 설계이며 누락이 아닙니다: 요청을 인증하는 공개 키가 페이지 소스에 포함되어 있어, 임의 수신자에게 발송을 허용하면 누구든 앱을 스팸 릴레이로 악용할 수 있습니다. 익명 방문자로부터 알림을 받으려면 폼을 사용하세요 — 폼 제출 시 이미 소유자에게 이메일이 발송되고 제출자에게 확인 메일이 자동으로 전송되며, 이 경로는 브라우저에서 위조할 수 없습니다.
오류는 PlatformApiError로 전달됩니다: 401(세션 필요), 403(이 앱에서 템플릿이 비활성화됨), 429(요청 한도 초과 — 메시지를 표시하고 재시도 옵션 제공), 422(등록된 주소 없음).
전송 현황 추적
섹션 제목: “전송 현황 추적”관리 패널의 Sent 탭에는 앱이 발송한 모든 이메일과 최신 전송 이벤트(delivered, opened, clicked, bounced, complained)가 표시되므로, 대부분의 경우 별도의 코드가 필요하지 않습니다.
각 항목은 sent, delivered, opened, clicked, bounced, complained 중 하나의 상태를 가지며, 메시지를 열면 실제로 발송된 HTML 및 텍스트 내용을 확인할 수 있습니다. 전송이 실패하는 경우 가장 먼저 이곳을 확인하세요.
AI로 빠르게 연결하기
섹션 제목: “AI로 빠르게 연결하기”직접 코드를 작성할 필요가 없습니다:
"Verify hello@myapp.com as a sending identity.""Email the customer a confirmation after they finish booking.""After a successful checkout, send the customer their receipt.""Show me the last 20 emails we've sent and whether they bounced."
주의사항
섹션 제목: “주의사항”from주소는 반드시 인증된 ID여야 합니다. 인증되지 않은 주소로 발송하면 오류가 반환됩니다.- 월별 한도는 Proyecta 플랜에 따라 적용됩니다.
출시 예정
섹션 제목: “출시 예정”- 템플릿 편집기 — builder에서 트랜잭션 템플릿을 시각적으로 디자인
- 대량/일괄 발송 endpoint — 대규모 메일 발송 지원