이메일 유효성 검사 API 연동: MX 확인부터 가입 오류 처리까지

회원가입 폼에서 이메일 모양만 맞는지 확인하는 정규식은 쉽게 붙일 수 있습니다. 하지만 도메인에 메일 수신 설정이 없는 주소까지 걸러내기는 어렵습니다. B2B 문의 접수나 계정 등록 단계에서는 형식 확인에 더해 도메인의 수신 가능 상태를 확인하는 단계가 도움이 됩니다.
APICK 이메일 유효성 검사 API는 이메일 형식과 도메인 MX 정보를 제공합니다. 결과를 활용할 때 중요한 점은 확인한 범위를 정확히 설명하는 것입니다. 문서에 안내된 유효성은 형식과 도메인 수신 가능 여부이며, 특정 사용자의 받은편지함 존재나 소유권을 보증하는 값은 아닙니다.
반환값을 가입 정책에 연결하는 방법
POST https://apick.app/rest/check_email_valid에 email을 보냅니다. data.유효성, data.도메인상태, data.일회용이메일여부 등이 반환됩니다. 도메인상태에는 ok, invalid, no-service, no-mail, resolv-error가 있습니다. 각 상태의 의미는 공식 응답 명세에서 확인할 수 있습니다.
- 잘못된 입력: 사용자가 오타를 고칠 수 있도록 주소 확인 문구를 보여줍니다.
- 일시적 DNS 문제: 검증을 보류하고 다시 시도할 수 있게 합니다. 즉시 계정을 영구 차단하지 않습니다.
- 일회용 주소: 서비스의 가입 정책에 따라 별도 확인이나 안내를 추가합니다.
- 정상 도메인: 다음 단계로 이메일 확인 링크를 보내 실제 수신과 소유 여부를 확인합니다.
1. cURL로 확인 요청 만들기
아래 EMAIL_TO_CHECK 변수에는 이용 목적과 처리 권한이 확인된 이메일을 넣습니다. 문법 예제를 위해 실제 타인의 주소를 임의로 사용하지 마세요. API 호출이 외부 서비스에 주소를 전달한다는 점도 가입 화면의 개인정보 처리 안내와 맞춰야 합니다.
curl --fail-with-body --request POST 'https://apick.app/rest/check_email_valid' \
--header "Authorization: Bearer ${APICK_API_KEY:?서버 인증키가 필요합니다}" \
--form-string "email=${EMAIL_TO_CHECK:?확인할 이메일이 필요합니다}" \
--connect-timeout 10 --max-time 302. Node.js에서 검증 보류 상태까지 반환하기
export async function validateEmail(email) {
const key = process.env.APICK_API_KEY;
if (!key) throw new Error("APICK_API_KEY가 필요합니다");
const value = String(email).trim();
if (!value) throw new Error("이메일을 입력하세요");
const form = new FormData();
form.set("email", value);
const response = await fetch("https://apick.app/rest/check_email_valid", {
method: "POST", headers: { Authorization: `Bearer ${key}` },
body: form, signal: AbortSignal.timeout(30_000)
});
if (!response.ok) throw new Error(`이메일 검사 HTTP ${response.status}`);
const result = await response.json();
if (result.api?.success !== true || result.data?.success !== 1) {
throw new Error("이메일 검사가 완료되지 않았습니다");
}
const data = result.data;
let state = "review";
if (data["도메인상태"] === "resolv-error") state = "retry_later";
else if (data["유효성"] === false) state = "check_input";
else if (data["유효성"] === true) state = "verification_email_needed";
return {
state,
domainStatus: data["도메인상태"],
disposable: data["일회용이메일여부"],
freeProvider: data["무료이메일여부"],
personalAddress: data["개인용이메일여부"],
costPoints: result.api.cost
};
}state는 이 예제에서 서비스 화면을 위해 만든 내부 값입니다. APICK의 원본 응답 필드가 아닙니다. verification_email_needed 역시 이메일을 자동 발송한다는 뜻이 아니라, 별도 확인 절차로 넘어갈 수 있다는 표시입니다. 유료 API 호출 예제와 외부 발송 코드를 분리해 두면 어떤 단계에서 비용이 발생하는지 추적하기 쉽습니다.
유효성 검사에서 놓치기 쉬운 세 가지
첫째, 무료 이메일이라는 이유만으로 업무용 문의가 아니라고 단정하지 않습니다. 개인사업자나 작은 팀은 무료 메일을 업무에 사용할 수 있습니다. 둘째, 개인용이메일여부=false는 공용 주소 형식이나 일회용 도메인과 관련된 분류입니다. support 같은 공용 주소를 실제로 사용 중인 조직이 있을 수 있습니다. 셋째, DNS 오류를 사용자 실수로 처리하면 정상 사용자의 가입을 막을 수 있습니다.
운영 화면에서는 검사 결과, 검사 시각, 이후 확인메일 인증 여부를 분리해 기록하세요. 메일 주소 원문을 디버그 로그에 반복 기록할 필요는 없습니다. 회원 ID와 상태 코드 위주로 관찰하고, 원문을 저장해야 한다면 필요한 범위와 보관 기간을 먼저 정하는 것이 좋습니다. 명세상 MX-IP는 null일 수 있으므로 없다는 이유만으로 프로그램을 실패시키지 않습니다.
비용과 문서 예시의 차이를 확인하세요
2026-10-11 공식 요금표에는 이메일 유효성 검사가 건당 10P로 표시돼 있습니다. 같은 단가의 과금 요청 2,000건은 20,000P입니다. 개발가이드의 정적 응답 예시에는 api.cost가 5로 남아 있어, 예시 응답 숫자를 현재 단가로 사용하면 안 됩니다. 도입 예산은 최신 요금표를 기준으로 하고 실제 청구는 호출 응답과 사용 내역으로 확인하세요.
가입 화면에서 입력 도중 여러 번 호출하기보다 이메일 입력을 마친 시점에 검사하는 흐름이 합리적입니다. 재시도도 횟수와 대기 간격을 제한하세요. 포인트의 원화 환산과 세금 조건은 이 글에서 확인하지 않았으므로 결제 화면의 최신 조건을 확인해야 합니다.
자주 묻는 질문
Q. 유효성=true면 그 사람에게 메일이 반드시 도착하나요?
그렇게 보장할 수 없습니다. 도메인 수신 가능 확인과 실제 주소 소유 확인은 별도 단계입니다.
Q. 일회용 이메일은 모두 막아야 하나요?
서비스의 목적과 가입 정책에 따라 결정할 사항입니다. API는 판단에 쓸 신호를 제공하며, 차단 정책을 대신 정하지 않습니다.
Q. 예제의 5P와 요금표의 10P 중 무엇으로 계산하나요?
현재 공개 요금표의 10P를 기준으로 예산을 잡고, 실제 사용 내역과 적용 조건을 확인하세요. 이 차이는 정적 예제 검증 시 발견한 문서 불일치입니다.
공식 문서에서 다음 단계 확인하기
APICK 이메일 유효성 검사 개발가이드에서 전체 필드와 최신 조건을 확인해 보세요. 먼저 비식별 테스트 입력으로 응답 분기를 검토한 뒤, 서버 연동과 사용량 집계를 붙이는 순서가 좋습니다.
문서·요금 확인일: 2026-10-11 (UTC). 공식 요금표 · 인증·연동 시작하기 · 공식 Node.js SDK 가이드. 이 글의 코드는 공개 명세를 바탕으로 만든 설명용 예제이며 실제 API 호출로 실행 검증하지 않았습니다. 실제 개인정보나 인증키를 예제에 넣지 않았습니다.
댓글
댓글 쓰기