-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Expand file tree
/
Copy pathmail-config.js
More file actions
82 lines (73 loc) · 3.11 KB
/
mail-config.js
File metadata and controls
82 lines (73 loc) · 3.11 KB
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { promises as dns } from 'dns';
import URL from 'url-parse';
import middleware from './_common/middleware.js';
// TODO: Fix.
const mailConfigHandler = async (url, event, context) => {
try {
const domain = new URL(url).hostname || new URL(url).pathname;
// Get MX records
const mxRecords = await dns.resolveMx(domain);
// Get TXT records
const txtRecords = await dns.resolveTxt(domain);
// Filter for only email related TXT records (SPF, DKIM, DMARC, and certain provider verifications)
const emailTxtRecords = txtRecords.filter(record => {
const recordString = record.join('');
return (
recordString.startsWith('v=spf1') ||
recordString.startsWith('v=DKIM1') ||
recordString.startsWith('v=DMARC1') ||
recordString.startsWith('protonmail-verification=') ||
recordString.startsWith('google-site-verification=') || // Google Workspace
recordString.startsWith('MS=') || // Microsoft 365
recordString.startsWith('zoho-verification=') || // Zoho
recordString.startsWith('titan-verification=') || // Titan
recordString.includes('bluehost.com') // BlueHost
);
});
// Identify specific mail services
const mailServices = emailTxtRecords.map(record => {
const recordString = record.join('');
if (recordString.startsWith('protonmail-verification=')) {
return { provider: 'ProtonMail', value: recordString.split('=')[1] };
} else if (recordString.startsWith('google-site-verification=')) {
return { provider: 'Google Workspace', value: recordString.split('=')[1] };
} else if (recordString.startsWith('MS=')) {
return { provider: 'Microsoft 365', value: recordString.split('=')[1] };
} else if (recordString.startsWith('zoho-verification=')) {
return { provider: 'Zoho', value: recordString.split('=')[1] };
} else if (recordString.startsWith('titan-verification=')) {
return { provider: 'Titan', value: recordString.split('=')[1] };
} else if (recordString.includes('bluehost.com')) {
return { provider: 'BlueHost', value: recordString };
} else {
return null;
}
}).filter(record => record !== null);
// Check MX records for Yahoo
const yahooMx = mxRecords.filter(record => record.exchange.includes('yahoodns.net'));
if (yahooMx.length > 0) {
mailServices.push({ provider: 'Yahoo', value: yahooMx[0].exchange });
}
// Check MX records for Mimecast
const mimecastMx = mxRecords.filter(record => record.exchange.includes('mimecast.com'));
if (mimecastMx.length > 0) {
mailServices.push({ provider: 'Mimecast', value: mimecastMx[0].exchange });
}
return {
mxRecords,
txtRecords: emailTxtRecords,
mailServices,
};
} catch (error) {
if (error.code === 'ENOTFOUND' || error.code === 'ENODATA') {
return { skipped: 'No mail server in use on this domain' };
} else {
return {
statusCode: 500,
body: { error: error.message },
};
}
}
};
export const handler = middleware(mailConfigHandler);
export default handler;