Skip to content

Commit dceb08f

Browse files
committed
Normalize fastmail alias subdomains
1 parent 712cd28 commit dceb08f

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ CHANGELOG
1010
* Periods are now removed from `gmail.com` email address local parts when
1111
`hashAddress` is used. For example, `[email protected]` will become
1212
13+
* Fastmail alias subdomain email addresses are now normalized when
14+
`hashAddress` is used. For example, `[email protected]` will become
15+
1316

1417
6.0.0 (2023-12-05)
1518
------------------

src/request/email.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,16 @@ describe('Email()', () => {
158158
md5: md5('[email protected]'),
159159
domain: 'gmail.com',
160160
},
161+
{
162+
163+
md5: md5('[email protected]'),
164+
domain: 'user.fastmail.com',
165+
},
166+
{
167+
168+
md5: md5('[email protected]'),
169+
domain: 'bar.example.com',
170+
},
161171
];
162172

163173
test.each(normalizeTests)('%p', (arg) => {

src/request/email.ts

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,126 @@ export default class Email implements EmailProps {
5656
'ya.ru': 'yandex.ru',
5757
};
5858

59+
private static readonly fastmailDomains: { [key: string]: boolean } = {
60+
'123mail.org': true,
61+
'150mail.com': true,
62+
'150ml.com': true,
63+
'16mail.com': true,
64+
'2-mail.com': true,
65+
'4email.net': true,
66+
'50mail.com': true,
67+
'airpost.net': true,
68+
'allmail.net': true,
69+
'bestmail.us': true,
70+
'cluemail.com': true,
71+
'elitemail.org': true,
72+
'emailcorner.net': true,
73+
'emailengine.net': true,
74+
'emailengine.org': true,
75+
'emailgroups.net': true,
76+
'emailplus.org': true,
77+
'emailuser.net': true,
78+
'eml.cc': true,
79+
'f-m.fm': true,
80+
'fast-email.com': true,
81+
'fast-mail.org': true,
82+
'fastem.com': true,
83+
'fastemail.us': true,
84+
'fastemailer.com': true,
85+
'fastest.cc': true,
86+
'fastimap.com': true,
87+
'fastmail.cn': true,
88+
'fastmail.co.uk': true,
89+
'fastmail.com': true,
90+
'fastmail.com.au': true,
91+
'fastmail.de': true,
92+
'fastmail.es': true,
93+
'fastmail.fm': true,
94+
'fastmail.fr': true,
95+
'fastmail.im': true,
96+
'fastmail.in': true,
97+
'fastmail.jp': true,
98+
'fastmail.mx': true,
99+
'fastmail.net': true,
100+
'fastmail.nl': true,
101+
'fastmail.org': true,
102+
'fastmail.se': true,
103+
'fastmail.to': true,
104+
'fastmail.tw': true,
105+
'fastmail.uk': true,
106+
'fastmail.us': true,
107+
'fastmailbox.net': true,
108+
'fastmessaging.com': true,
109+
'fea.st': true,
110+
'fmail.co.uk': true,
111+
'fmailbox.com': true,
112+
'fmgirl.com': true,
113+
'fmguy.com': true,
114+
'ftml.net': true,
115+
'h-mail.us': true,
116+
'hailmail.net': true,
117+
'imap-mail.com': true,
118+
'imap.cc': true,
119+
'imapmail.org': true,
120+
'inoutbox.com': true,
121+
'internet-e-mail.com': true,
122+
'internet-mail.org': true,
123+
'internetemails.net': true,
124+
'internetmailing.net': true,
125+
'jetemail.net': true,
126+
'justemail.net': true,
127+
'letterboxes.org': true,
128+
'mail-central.com': true,
129+
'mail-page.com': true,
130+
'mailandftp.com': true,
131+
'mailas.com': true,
132+
'mailbolt.com': true,
133+
'mailc.net': true,
134+
'mailcan.com': true,
135+
'mailforce.net': true,
136+
'mailftp.com': true,
137+
'mailhaven.com': true,
138+
'mailingaddress.org': true,
139+
'mailite.com': true,
140+
'mailmight.com': true,
141+
'mailnew.com': true,
142+
'mailsent.net': true,
143+
'mailservice.ms': true,
144+
'mailup.net': true,
145+
'mailworks.org': true,
146+
'ml1.net': true,
147+
'mm.st': true,
148+
'myfastmail.com': true,
149+
'mymacmail.com': true,
150+
'nospammail.net': true,
151+
'ownmail.net': true,
152+
'petml.com': true,
153+
'postinbox.com': true,
154+
'postpro.net': true,
155+
'proinbox.com': true,
156+
'promessage.com': true,
157+
'realemail.net': true,
158+
'reallyfast.biz': true,
159+
'reallyfast.info': true,
160+
'rushpost.com': true,
161+
'sent.as': true,
162+
'sent.at': true,
163+
'sent.com': true,
164+
'speedpost.net': true,
165+
'speedymail.org': true,
166+
'ssl-mail.com': true,
167+
'swift-mail.com': true,
168+
'the-fastest.net': true,
169+
'the-quickest.com': true,
170+
'theinternetemail.com': true,
171+
'veryfast.biz': true,
172+
'veryspeedy.net': true,
173+
'warpmail.net': true,
174+
'xsmail.com': true,
175+
'yepmail.net': true,
176+
'your-mail.com': true,
177+
};
178+
59179
public constructor(email: EmailProps) {
60180
if (email.address != null && !isEmail(email.address)) {
61181
throw new ArgumentError('`email.address` is an invalid email address');
@@ -106,6 +226,22 @@ export default class Email implements EmailProps {
106226
localPart = localPart.replace(/\./g, '');
107227
}
108228

229+
const domainParts = domain.split('.');
230+
if (domainParts.length > 2) {
231+
const possibleDomain = domainParts.slice(1).join('.');
232+
if (
233+
Object.prototype.hasOwnProperty.call(
234+
Email.fastmailDomains,
235+
possibleDomain
236+
)
237+
) {
238+
domain = possibleDomain;
239+
if (localPart !== '') {
240+
localPart = domainParts[0];
241+
}
242+
}
243+
}
244+
109245
return localPart + '@' + domain;
110246
}
111247

0 commit comments

Comments
 (0)