summaryrefslogtreecommitdiff
path: root/packages/backend/src/services/validate-email-for-account.ts
blob: 132168fb313bac6dd97fd4652dbc3c023eba9c1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { validate as validateEmail } from 'deep-email-validator';
import { UserProfiles } from '@/models/index.js';

export async function validateEmailForAccount(emailAddress: string): Promise<{
	available: boolean;
	reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
}> {
	const exist = await UserProfiles.countBy({
		emailVerified: true,
		email: emailAddress,
	});

	const validated = await validateEmail({
		email: emailAddress,
		validateRegex: true,
		validateMx: true,
		validateTypo: false, // TLDを見ているみたいだけどclubとか弾かれるので
		validateDisposable: true, // 捨てアドかどうかチェック
		validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
	});

	const available = exist === 0 && validated.valid;

	return {
		available,
		reason: available ? null :
			exist !== 0 ? 'used' :
			validated.reason === 'regex' ? 'format' :
			validated.reason === 'disposable' ? 'disposable' :
			validated.reason === 'mx' ? 'mx' :
			validated.reason === 'smtp' ? 'smtp' :
			null,
	};
}