managed-alias-utils.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. (function attachManagedAliasUtils(root, factory) {
  2. root.MultiPageManagedAliasUtils = factory();
  3. })(typeof self !== 'undefined' ? self : globalThis, function createManagedAliasUtilsModule() {
  4. const GMAIL_PROVIDER = 'gmail';
  5. const MAIL_2925_PROVIDER = '2925';
  6. const PROVIDER_CONFIGS = {
  7. [GMAIL_PROVIDER]: {
  8. baseLabel: 'Gmail 原邮箱',
  9. basePlaceholder: '例如 yourname@gmail.com',
  10. label: 'Gmail +tag 邮箱',
  11. parseBaseEmail(rawValue = '') {
  12. const value = String(rawValue || '').trim().toLowerCase();
  13. const match = value.match(/^([^@\s+]+)@((?:gmail|googlemail)\.com)$/i);
  14. if (!match) return null;
  15. return {
  16. localPart: match[1],
  17. domain: match[2].toLowerCase(),
  18. };
  19. },
  20. matchesProviderDomain(domain = '') {
  21. return /^(?:gmail|googlemail)\.com$/i.test(String(domain || '').trim());
  22. },
  23. matchesAliasLocalPart(baseLocalPart = '', candidateLocalPart = '') {
  24. return String(candidateLocalPart || '').split('+')[0] === String(baseLocalPart || '');
  25. },
  26. buildAlias(parsedBaseEmail, tag) {
  27. return `${parsedBaseEmail.localPart}+${tag}@${parsedBaseEmail.domain}`;
  28. },
  29. generationHint: '先填写 Gmail 原邮箱后点“生成”,也可以直接手动填写完整的 Gmail 邮箱。',
  30. registrationPlaceholder: '点击生成 Gmail +tag 邮箱,或手动填写完整邮箱',
  31. },
  32. [MAIL_2925_PROVIDER]: {
  33. baseLabel: '2925 基邮箱',
  34. basePlaceholder: '例如 yourname@2925.com',
  35. label: '2925 邮箱',
  36. parseBaseEmail(rawValue = '') {
  37. const value = String(rawValue || '').trim().toLowerCase();
  38. const match = value.match(/^([^@\s+]+)@(2925\.com)$/i);
  39. if (!match) return null;
  40. return {
  41. localPart: match[1],
  42. domain: match[2].toLowerCase(),
  43. };
  44. },
  45. matchesProviderDomain(domain = '') {
  46. return String(domain || '').trim().toLowerCase() === '2925.com';
  47. },
  48. matchesAliasLocalPart(baseLocalPart = '', candidateLocalPart = '') {
  49. const normalizedBaseLocalPart = String(baseLocalPart || '');
  50. const normalizedCandidateLocalPart = String(candidateLocalPart || '');
  51. return normalizedCandidateLocalPart === normalizedBaseLocalPart
  52. || normalizedCandidateLocalPart.startsWith(normalizedBaseLocalPart);
  53. },
  54. buildAlias(parsedBaseEmail, tag) {
  55. return `${parsedBaseEmail.localPart}${tag}@${parsedBaseEmail.domain}`;
  56. },
  57. generationHint: '先填写 2925 基邮箱后点“生成”,也可以直接手动填写完整的 2925 邮箱。',
  58. registrationPlaceholder: '点击生成 2925 邮箱,或手动填写完整邮箱',
  59. },
  60. };
  61. function getManagedAliasProviderConfig(provider = '') {
  62. return PROVIDER_CONFIGS[String(provider || '').trim().toLowerCase()] || null;
  63. }
  64. function isManagedAliasProvider(provider = '') {
  65. return Boolean(getManagedAliasProviderConfig(provider));
  66. }
  67. function parseEmailParts(rawValue = '') {
  68. const value = String(rawValue || '').trim().toLowerCase();
  69. const match = value.match(/^([^@\s]+)@([^@\s]+\.[^@\s]+)$/);
  70. if (!match) return null;
  71. return {
  72. localPart: match[1],
  73. domain: match[2],
  74. };
  75. }
  76. function parseManagedAliasBaseEmail(rawValue, provider = '') {
  77. const config = getManagedAliasProviderConfig(provider);
  78. return config?.parseBaseEmail(rawValue) || null;
  79. }
  80. function isManagedAliasEmail(value, provider = '', baseEmail = '') {
  81. const config = getManagedAliasProviderConfig(provider);
  82. if (!config) return false;
  83. const parsedEmail = parseEmailParts(value);
  84. if (!parsedEmail || !config.matchesProviderDomain(parsedEmail.domain)) {
  85. return false;
  86. }
  87. const parsedBaseEmail = parseManagedAliasBaseEmail(baseEmail, provider);
  88. if (!parsedBaseEmail) {
  89. return true;
  90. }
  91. return parsedEmail.domain === parsedBaseEmail.domain
  92. && config.matchesAliasLocalPart(parsedBaseEmail.localPart, parsedEmail.localPart);
  93. }
  94. function buildManagedAliasEmail(provider = '', baseEmail = '', tag = '') {
  95. const config = getManagedAliasProviderConfig(provider);
  96. if (!config) {
  97. throw new Error(`Unsupported managed alias provider: ${provider}`);
  98. }
  99. const parsedBaseEmail = parseManagedAliasBaseEmail(baseEmail, provider);
  100. if (!parsedBaseEmail) {
  101. throw new Error(`${config.baseLabel}格式不正确`);
  102. }
  103. const normalizedTag = String(tag || '').trim();
  104. if (!normalizedTag) {
  105. throw new Error(`${config.label}生成标签为空`);
  106. }
  107. return config.buildAlias(parsedBaseEmail, normalizedTag);
  108. }
  109. function getManagedAliasProviderUiCopy(provider = '') {
  110. const config = getManagedAliasProviderConfig(provider);
  111. if (!config) return null;
  112. return {
  113. baseLabel: config.baseLabel,
  114. basePlaceholder: config.basePlaceholder,
  115. buttonLabel: '生成',
  116. successVerb: '生成',
  117. label: config.label,
  118. placeholder: config.registrationPlaceholder,
  119. hint: config.generationHint,
  120. };
  121. }
  122. return {
  123. buildManagedAliasEmail,
  124. getManagedAliasProviderConfig,
  125. getManagedAliasProviderUiCopy,
  126. isManagedAliasEmail,
  127. isManagedAliasProvider,
  128. parseEmailParts,
  129. parseManagedAliasBaseEmail,
  130. };
  131. });