calckey/packages/backend/src/services/validate-email-for-account.ts

46 lines
1.3 KiB
TypeScript
Raw Normal View History

2023-01-13 04:40:33 +00:00
import { validate as validateEmail } from "deep-email-validator";
import { UserProfiles } from "@/models/index.js";
import { fetchMeta } from "@/misc/fetch-meta.js";
2021-11-07 11:16:01 +00:00
export async function validateEmailForAccount(emailAddress: string): Promise<{
available: boolean;
2023-01-13 04:40:33 +00:00
reason: null | "used" | "format" | "disposable" | "mx" | "smtp";
2021-11-07 11:16:01 +00:00
}> {
const meta = await fetchMeta();
const exist = await UserProfiles.countBy({
2021-11-07 11:16:01 +00:00
emailVerified: true,
email: emailAddress,
});
2023-01-13 04:40:33 +00:00
const validated = meta.enableActiveEmailValidation
? await validateEmail({
email: emailAddress,
validateRegex: true,
validateMx: true,
validateTypo: false, // TLDを見ているみたいだけどclubとか弾かれるので
validateDisposable: true, // 捨てアドかどうかチェック
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
})
: { valid: true };
2021-11-07 11:16:01 +00:00
const available = exist === 0 && validated.valid;
return {
available,
2023-01-13 04:40:33 +00:00
reason: available
? null
: exist !== 0
? "used"
: validated.reason === "regex"
? "format"
: validated.reason === "disposable"
? "disposable"
: validated.reason === "mx"
? "mx"
: validated.reason === "smtp"
? "smtp"
: null,
2021-11-07 11:16:01 +00:00
};
}