mxroute-cli 0.3.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +281 -11
  2. package/dist/commands/accounts-search.d.ts +1 -0
  3. package/dist/commands/accounts-search.js +66 -0
  4. package/dist/commands/accounts-search.js.map +1 -0
  5. package/dist/commands/accounts.js +39 -9
  6. package/dist/commands/accounts.js.map +1 -1
  7. package/dist/commands/aliases-sync.d.ts +1 -0
  8. package/dist/commands/aliases-sync.js +162 -0
  9. package/dist/commands/aliases-sync.js.map +1 -0
  10. package/dist/commands/autoresponder.js +7 -6
  11. package/dist/commands/autoresponder.js.map +1 -1
  12. package/dist/commands/backup.d.ts +1 -0
  13. package/dist/commands/backup.js +170 -0
  14. package/dist/commands/backup.js.map +1 -0
  15. package/dist/commands/bulk.js +52 -9
  16. package/dist/commands/bulk.js.map +1 -1
  17. package/dist/commands/catchall.js +2 -2
  18. package/dist/commands/catchall.js.map +1 -1
  19. package/dist/commands/cleanup.d.ts +1 -0
  20. package/dist/commands/cleanup.js +234 -0
  21. package/dist/commands/cleanup.js.map +1 -0
  22. package/dist/commands/config.js +9 -2
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/credentials-export.d.ts +13 -0
  25. package/dist/commands/credentials-export.js +142 -0
  26. package/dist/commands/credentials-export.js.map +1 -0
  27. package/dist/commands/deprovision.d.ts +1 -0
  28. package/dist/commands/deprovision.js +125 -0
  29. package/dist/commands/deprovision.js.map +1 -0
  30. package/dist/commands/dns-setup.js +20 -3
  31. package/dist/commands/dns-setup.js.map +1 -1
  32. package/dist/commands/export-import.js +22 -1
  33. package/dist/commands/export-import.js.map +1 -1
  34. package/dist/commands/filters.js +2 -2
  35. package/dist/commands/filters.js.map +1 -1
  36. package/dist/commands/fix.js +1 -1
  37. package/dist/commands/fix.js.map +1 -1
  38. package/dist/commands/forwarders-validate.d.ts +1 -0
  39. package/dist/commands/forwarders-validate.js +190 -0
  40. package/dist/commands/forwarders-validate.js.map +1 -0
  41. package/dist/commands/forwarders.js +6 -5
  42. package/dist/commands/forwarders.js.map +1 -1
  43. package/dist/commands/lists.js +7 -6
  44. package/dist/commands/lists.js.map +1 -1
  45. package/dist/commands/mail.d.ts +15 -0
  46. package/dist/commands/mail.js +998 -0
  47. package/dist/commands/mail.js.map +1 -0
  48. package/dist/commands/migrate.js.map +1 -1
  49. package/dist/commands/onboard.js +11 -4
  50. package/dist/commands/onboard.js.map +1 -1
  51. package/dist/commands/password-audit.d.ts +1 -0
  52. package/dist/commands/password-audit.js +304 -0
  53. package/dist/commands/password-audit.js.map +1 -0
  54. package/dist/commands/password.d.ts +1 -0
  55. package/dist/commands/password.js +96 -0
  56. package/dist/commands/password.js.map +1 -0
  57. package/dist/commands/provision.d.ts +13 -0
  58. package/dist/commands/provision.js +306 -0
  59. package/dist/commands/provision.js.map +1 -0
  60. package/dist/commands/quota-policy.d.ts +3 -0
  61. package/dist/commands/quota-policy.js +192 -0
  62. package/dist/commands/quota-policy.js.map +1 -0
  63. package/dist/commands/quota.js +1 -1
  64. package/dist/commands/quota.js.map +1 -1
  65. package/dist/commands/rate-limit.d.ts +2 -0
  66. package/dist/commands/rate-limit.js +121 -0
  67. package/dist/commands/rate-limit.js.map +1 -0
  68. package/dist/commands/reputation.d.ts +1 -0
  69. package/dist/commands/reputation.js +265 -0
  70. package/dist/commands/reputation.js.map +1 -0
  71. package/dist/commands/schedule.d.ts +3 -0
  72. package/dist/commands/schedule.js +270 -0
  73. package/dist/commands/schedule.js.map +1 -0
  74. package/dist/commands/send.js +2 -1
  75. package/dist/commands/send.js.map +1 -1
  76. package/dist/commands/setup.js +22 -0
  77. package/dist/commands/setup.js.map +1 -1
  78. package/dist/commands/share.js +20 -10
  79. package/dist/commands/share.js.map +1 -1
  80. package/dist/commands/smtp-debug.d.ts +1 -0
  81. package/dist/commands/smtp-debug.js +188 -0
  82. package/dist/commands/smtp-debug.js.map +1 -0
  83. package/dist/commands/spam.js +3 -3
  84. package/dist/commands/spam.js.map +1 -1
  85. package/dist/commands/ssl-check.d.ts +1 -0
  86. package/dist/commands/ssl-check.js +145 -0
  87. package/dist/commands/ssl-check.js.map +1 -0
  88. package/dist/commands/status.js +53 -1
  89. package/dist/commands/status.js.map +1 -1
  90. package/dist/commands/templates.d.ts +4 -0
  91. package/dist/commands/templates.js +310 -0
  92. package/dist/commands/templates.js.map +1 -0
  93. package/dist/commands/test-delivery.d.ts +1 -0
  94. package/dist/commands/test-delivery.js +87 -0
  95. package/dist/commands/test-delivery.js.map +1 -0
  96. package/dist/commands/usage-history.d.ts +1 -0
  97. package/dist/commands/usage-history.js +173 -0
  98. package/dist/commands/usage-history.js.map +1 -0
  99. package/dist/commands/webhook.js +18 -3
  100. package/dist/commands/webhook.js.map +1 -1
  101. package/dist/commands/welcome-send.d.ts +11 -0
  102. package/dist/commands/welcome-send.js +163 -0
  103. package/dist/commands/welcome-send.js.map +1 -0
  104. package/dist/index.js +362 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/mcp.js +1940 -10
  107. package/dist/mcp.js.map +1 -1
  108. package/dist/utils/config.js +1 -1
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/directadmin.js +23 -2
  111. package/dist/utils/directadmin.js.map +1 -1
  112. package/dist/utils/imap.d.ts +61 -0
  113. package/dist/utils/imap.js +426 -0
  114. package/dist/utils/imap.js.map +1 -0
  115. package/dist/utils/mime.d.ts +50 -0
  116. package/dist/utils/mime.js +369 -0
  117. package/dist/utils/mime.js.map +1 -0
  118. package/dist/utils/shared.d.ts +10 -0
  119. package/dist/utils/shared.js +28 -1
  120. package/dist/utils/shared.js.map +1 -1
  121. package/package.json +1 -1
@@ -38,6 +38,7 @@ const http = __importStar(require("http"));
38
38
  const theme_1 = require("../utils/theme");
39
39
  const config_1 = require("../utils/config");
40
40
  const api_1 = require("../utils/api");
41
+ const MAX_BODY_SIZE = 1024 * 1024; // 1MB max request body
41
42
  async function webhookCommand(options) {
42
43
  const config = (0, config_1.getConfig)();
43
44
  if (!config.server || !config.username || !config.password) {
@@ -57,8 +58,12 @@ async function webhookCommand(options) {
57
58
  console.log(theme_1.theme.muted(' Optional: "from" (defaults to configured account)'));
58
59
  console.log('');
59
60
  const server = http.createServer(async (req, res) => {
60
- // CORS headers
61
- res.setHeader('Access-Control-Allow-Origin', '*');
61
+ // CORS headers — restrict to localhost only
62
+ const origin = req.headers.origin || '';
63
+ const allowedOrigins = [`http://localhost:${port}`, 'http://localhost', 'http://127.0.0.1'];
64
+ if (allowedOrigins.some((o) => origin.startsWith(o))) {
65
+ res.setHeader('Access-Control-Allow-Origin', origin);
66
+ }
62
67
  res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
63
68
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
64
69
  if (req.method === 'OPTIONS') {
@@ -68,7 +73,7 @@ async function webhookCommand(options) {
68
73
  }
69
74
  if (req.method === 'GET' && req.url === '/health') {
70
75
  res.writeHead(200, { 'Content-Type': 'application/json' });
71
- res.end(JSON.stringify({ status: 'ok', server: `${config.server}.mxrouting.net`, from: config.username }));
76
+ res.end(JSON.stringify({ status: 'ok' }));
72
77
  return;
73
78
  }
74
79
  if (req.method !== 'POST' || req.url !== '/send') {
@@ -77,10 +82,20 @@ async function webhookCommand(options) {
77
82
  return;
78
83
  }
79
84
  let body = '';
85
+ let bodyTooLarge = false;
80
86
  req.on('data', (chunk) => {
81
87
  body += chunk;
88
+ if (body.length > MAX_BODY_SIZE) {
89
+ bodyTooLarge = true;
90
+ req.destroy();
91
+ }
82
92
  });
83
93
  req.on('end', async () => {
94
+ if (bodyTooLarge) {
95
+ res.writeHead(413, { 'Content-Type': 'application/json' });
96
+ res.end(JSON.stringify({ success: false, message: 'Request body too large (max 1MB)' }));
97
+ return;
98
+ }
84
99
  try {
85
100
  const data = JSON.parse(body);
86
101
  if (!data.to || !data.subject || !data.body) {
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wCAkGC;AAvGD,2CAA6B;AAC7B,0CAAuC;AACvC,4CAA4C;AAC5C,sCAAyC;AAElC,KAAK,UAAU,cAAc,CAAC,OAA0B;IAC7D,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,KAAK,CACT,OAAO,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,6BAA6B,aAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,WAAW,CACzG,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,IAAI,OAAO,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,eAAe;QACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAAC;QAC/D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3G,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACjD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE9B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAC,CAAC;oBACnG,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAA,eAAS,EAAC;oBAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,gBAAgB;oBACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ;oBAClC,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;gBAEH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,KAAK,SAAS,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBAEvF,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAClF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,OAAO,CAAC,KAAK,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,qCAAqC,IAAI,UAAU,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface WelcomeResult {
2
+ email: string;
3
+ success: boolean;
4
+ message: string;
5
+ }
6
+ export declare function welcomeSend(domain?: string): Promise<void>;
7
+ export declare function welcomeSendBulk(accounts: {
8
+ email: string;
9
+ password?: string;
10
+ }[], companyName?: string): Promise<WelcomeResult[]>;
11
+ export {};
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.welcomeSend = welcomeSend;
7
+ exports.welcomeSendBulk = welcomeSendBulk;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ const theme_1 = require("../utils/theme");
12
+ const config_1 = require("../utils/config");
13
+ const api_1 = require("../utils/api");
14
+ const shared_1 = require("../utils/shared");
15
+ const directadmin_1 = require("../utils/directadmin");
16
+ function buildWelcomeHtml(email, domain, companyName, password) {
17
+ const heading = companyName || 'Your Email Account';
18
+ const passwordSection = password
19
+ ? `<tr><td style="padding:8px 0;color:#888;">Password</td><td style="padding:8px 0;"><code>${password}</code></td></tr>
20
+ <tr><td colspan="2" style="padding:4px 0;color:#e74c3c;font-size:13px;">Please change your password after first login.</td></tr>`
21
+ : '';
22
+ return `<div style="font-family:sans-serif;max-width:600px;margin:0 auto;color:#333;">
23
+ <h2 style="color:#6C63FF;">${heading}</h2>
24
+ <p>Welcome! Your email account has been set up and is ready to use.</p>
25
+ <table style="width:100%;border-collapse:collapse;margin:16px 0;">
26
+ <tr><td style="padding:8px 0;color:#888;">Email</td><td style="padding:8px 0;font-weight:bold;">${email}</td></tr>
27
+ ${passwordSection}
28
+ </table>
29
+ <h3 style="color:#6C63FF;">Server Settings</h3>
30
+ <table style="width:100%;border-collapse:collapse;margin:16px 0;">
31
+ <tr><td style="padding:6px 0;color:#888;">IMAP</td><td style="padding:6px 0;">server.mxrouting.net — Port 993 (SSL/TLS)</td></tr>
32
+ <tr><td style="padding:6px 0;color:#888;">SMTP</td><td style="padding:6px 0;">server.mxrouting.net — Port 465 (SSL/TLS)</td></tr>
33
+ <tr><td style="padding:6px 0;color:#888;">Username</td><td style="padding:6px 0;">${email}</td></tr>
34
+ </table>
35
+ <h3 style="color:#6C63FF;">Webmail Access</h3>
36
+ <p><a href="https://mail.${domain}">https://mail.${domain}</a></p>
37
+ <h3 style="color:#6C63FF;">Setup Tips</h3>
38
+ <ul style="line-height:1.8;">
39
+ <li><strong>Outlook</strong> — Add an IMAP account with the server settings above.</li>
40
+ <li><strong>Apple Mail</strong> — Go to Settings → Mail → Add Account → Other and enter the IMAP/SMTP details.</li>
41
+ <li><strong>Thunderbird</strong> — Add a new account; Thunderbird may auto-detect settings, otherwise enter them manually.</li>
42
+ </ul>
43
+ <p style="color:#888;font-size:13px;margin-top:24px;">If you have any questions, contact your email administrator.</p>
44
+ </div>`;
45
+ }
46
+ async function welcomeSend(domain) {
47
+ const creds = (0, shared_1.getCreds)();
48
+ const targetDomain = await (0, shared_1.pickDomain)(creds, domain);
49
+ console.log(theme_1.theme.heading(`Welcome Emails: ${targetDomain}`));
50
+ const spinner = (0, ora_1.default)({ text: 'Fetching accounts...', spinner: 'dots12', color: 'cyan' }).start();
51
+ try {
52
+ const accounts = await (0, directadmin_1.listEmailAccounts)(creds, targetDomain);
53
+ spinner.stop();
54
+ if (accounts.length === 0) {
55
+ console.log(theme_1.theme.muted(' No email accounts found.\n'));
56
+ return;
57
+ }
58
+ const { selected } = await inquirer_1.default.prompt([
59
+ {
60
+ type: 'checkbox',
61
+ name: 'selected',
62
+ message: 'Select accounts to send welcome emails to:',
63
+ choices: accounts.map((a) => ({ name: `${a}@${targetDomain}`, value: a })),
64
+ },
65
+ ]);
66
+ if (selected.length === 0) {
67
+ console.log(theme_1.theme.muted('\n No accounts selected.\n'));
68
+ return;
69
+ }
70
+ const { companyName } = await inquirer_1.default.prompt([
71
+ {
72
+ type: 'input',
73
+ name: 'companyName',
74
+ message: theme_1.theme.secondary('Company name (optional, for branding):'),
75
+ },
76
+ ]);
77
+ const config = (0, config_1.getConfig)();
78
+ if (!config.server || !config.username || !config.password) {
79
+ console.log(theme_1.theme.error(` ${theme_1.theme.statusIcon('fail')} Not configured. Run ${theme_1.theme.bold('mxroute config smtp')} first.\n`));
80
+ process.exit(1);
81
+ }
82
+ const from = config.username;
83
+ let sent = 0;
84
+ let failed = 0;
85
+ for (let i = 0; i < selected.length; i++) {
86
+ const user = selected[i];
87
+ const email = `${user}@${targetDomain}`;
88
+ const emailSpinner = (0, ora_1.default)({
89
+ text: `[${i + 1}/${selected.length}] Sending welcome email to ${email}...`,
90
+ spinner: 'dots12',
91
+ color: 'cyan',
92
+ }).start();
93
+ try {
94
+ const result = await (0, api_1.sendEmail)({
95
+ server: `${config.server}.mxrouting.net`,
96
+ username: config.username,
97
+ password: config.password,
98
+ from,
99
+ to: email,
100
+ subject: `Welcome to ${companyName || 'Your New Email Account'}`,
101
+ body: buildWelcomeHtml(email, targetDomain, companyName || undefined),
102
+ });
103
+ if (result.success) {
104
+ emailSpinner.succeed(`${email}`);
105
+ sent++;
106
+ }
107
+ else {
108
+ emailSpinner.fail(`${email}: ${result.message}`);
109
+ failed++;
110
+ }
111
+ }
112
+ catch (err) {
113
+ emailSpinner.fail(`${email}: ${err.message}`);
114
+ failed++;
115
+ }
116
+ }
117
+ console.log('');
118
+ console.log(theme_1.theme.success(` ${sent} welcome email${sent !== 1 ? 's' : ''} sent`));
119
+ if (failed > 0)
120
+ console.log(theme_1.theme.error(` ${failed} failed`));
121
+ console.log('');
122
+ }
123
+ catch (err) {
124
+ spinner.fail(chalk_1.default.red('Failed to fetch accounts'));
125
+ console.log(theme_1.theme.error(` ${err.message}\n`));
126
+ }
127
+ }
128
+ async function welcomeSendBulk(accounts, companyName) {
129
+ const config = (0, config_1.getConfig)();
130
+ if (!config.server || !config.username || !config.password) {
131
+ throw new Error('SMTP not configured. Run "mxroute config smtp" first.');
132
+ }
133
+ const from = config.username;
134
+ const results = [];
135
+ for (const account of accounts) {
136
+ const domain = account.email.split('@')[1] || '';
137
+ try {
138
+ const result = await (0, api_1.sendEmail)({
139
+ server: `${config.server}.mxrouting.net`,
140
+ username: config.username,
141
+ password: config.password,
142
+ from,
143
+ to: account.email,
144
+ subject: `Welcome to ${companyName || 'Your New Email Account'}`,
145
+ body: buildWelcomeHtml(account.email, domain, companyName, account.password),
146
+ });
147
+ results.push({
148
+ email: account.email,
149
+ success: result.success,
150
+ message: result.message,
151
+ });
152
+ }
153
+ catch (err) {
154
+ results.push({
155
+ email: account.email,
156
+ success: false,
157
+ message: err.message,
158
+ });
159
+ }
160
+ }
161
+ return results;
162
+ }
163
+ //# sourceMappingURL=welcome-send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome-send.js","sourceRoot":"","sources":["../../src/commands/welcome-send.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -767,6 +767,286 @@ program
767
767
  const { troubleshootCommand } = await Promise.resolve().then(() => __importStar(require('./commands/troubleshoot')));
768
768
  await troubleshootCommand();
769
769
  });
770
+ // ─── SSL Check ──────────────────────────────────────────
771
+ program
772
+ .command('ssl-check [server]')
773
+ .alias('ssl')
774
+ .description('Check SSL certificate expiry, chain, and protocols')
775
+ .action(async (server) => {
776
+ const { sslCheckCommand } = await Promise.resolve().then(() => __importStar(require('./commands/ssl-check')));
777
+ await sslCheckCommand(server);
778
+ });
779
+ // ─── Test Delivery ──────────────────────────────────────
780
+ program
781
+ .command('test-delivery')
782
+ .description('Send test email and measure delivery timing')
783
+ .action(async () => {
784
+ const { testDeliveryCommand } = await Promise.resolve().then(() => __importStar(require('./commands/test-delivery')));
785
+ await testDeliveryCommand();
786
+ });
787
+ // ─── Rate Limit ─────────────────────────────────────────
788
+ program
789
+ .command('rate-limit')
790
+ .alias('rate')
791
+ .description('Show current sending rate vs 400/hr limit')
792
+ .action(async () => {
793
+ const { rateLimitCommand } = await Promise.resolve().then(() => __importStar(require('./commands/rate-limit')));
794
+ await rateLimitCommand();
795
+ });
796
+ // ─── Accounts Search ────────────────────────────────────
797
+ accountsCmd
798
+ .command('search <query>')
799
+ .alias('find')
800
+ .description('Search accounts across all domains')
801
+ .action(async (query) => {
802
+ const { accountsSearch } = await Promise.resolve().then(() => __importStar(require('./commands/accounts-search')));
803
+ await accountsSearch(query);
804
+ });
805
+ // ─── Forwarders Validate ────────────────────────────────
806
+ forwardersCmd
807
+ .command('validate [domain]')
808
+ .alias('check')
809
+ .description('Check all forwarder destinations are reachable')
810
+ .action(async (domain) => {
811
+ const { forwardersValidate } = await Promise.resolve().then(() => __importStar(require('./commands/forwarders-validate')));
812
+ await forwardersValidate(domain);
813
+ });
814
+ // ─── SMTP Debug ─────────────────────────────────────────
815
+ program
816
+ .command('smtp-debug')
817
+ .alias('smtp')
818
+ .description('Full SMTP session log showing EHLO/AUTH conversation')
819
+ .action(async () => {
820
+ const { smtpDebugCommand } = await Promise.resolve().then(() => __importStar(require('./commands/smtp-debug')));
821
+ await smtpDebugCommand();
822
+ });
823
+ // ─── Backup ─────────────────────────────────────────────
824
+ program
825
+ .command('backup [domain]')
826
+ .description('Generate IMAP mailbox backup commands (imapsync)')
827
+ .action(async (domain) => {
828
+ const { backupCommand } = await Promise.resolve().then(() => __importStar(require('./commands/backup')));
829
+ await backupCommand(domain);
830
+ });
831
+ // ─── Templates ──────────────────────────────────────────
832
+ const templatesCmd = program.command('templates').alias('tpl').description('Email template library');
833
+ templatesCmd
834
+ .command('list')
835
+ .alias('ls')
836
+ .description('List saved templates')
837
+ .action(async () => {
838
+ const { templatesList } = await Promise.resolve().then(() => __importStar(require('./commands/templates')));
839
+ await templatesList();
840
+ });
841
+ templatesCmd
842
+ .command('save')
843
+ .alias('add')
844
+ .description('Save a new email template')
845
+ .action(async () => {
846
+ const { templatesSave } = await Promise.resolve().then(() => __importStar(require('./commands/templates')));
847
+ await templatesSave();
848
+ });
849
+ templatesCmd
850
+ .command('send [name]')
851
+ .description('Send email using a template')
852
+ .action(async (name) => {
853
+ const { templatesSend } = await Promise.resolve().then(() => __importStar(require('./commands/templates')));
854
+ await templatesSend(name);
855
+ });
856
+ templatesCmd
857
+ .command('delete [name]')
858
+ .alias('rm')
859
+ .description('Delete a template')
860
+ .action(async (name) => {
861
+ const { templatesDelete } = await Promise.resolve().then(() => __importStar(require('./commands/templates')));
862
+ await templatesDelete(name);
863
+ });
864
+ // ─── Cleanup ────────────────────────────────────────────
865
+ program
866
+ .command('cleanup')
867
+ .description('Find unused accounts, orphaned forwarders, redundant configs')
868
+ .action(async () => {
869
+ const { cleanupCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cleanup')));
870
+ await cleanupCommand();
871
+ });
872
+ // ─── Reputation ─────────────────────────────────────────
873
+ program
874
+ .command('reputation [domain]')
875
+ .alias('rep')
876
+ .description('Check sender reputation (SPF, DKIM, DMARC, blacklists)')
877
+ .action(async (domain) => {
878
+ const { reputationCommand } = await Promise.resolve().then(() => __importStar(require('./commands/reputation')));
879
+ await reputationCommand(domain);
880
+ });
881
+ // ─── Usage History ──────────────────────────────────────
882
+ program
883
+ .command('usage-history')
884
+ .alias('usage')
885
+ .description('Track quota usage over time with trends')
886
+ .action(async () => {
887
+ const { usageHistoryCommand } = await Promise.resolve().then(() => __importStar(require('./commands/usage-history')));
888
+ await usageHistoryCommand();
889
+ });
890
+ // ─── Schedule ───────────────────────────────────────────
891
+ const scheduleCmd = program.command('schedule').description('Schedule autoresponder enable/disable by date');
892
+ scheduleCmd
893
+ .command('create [domain]')
894
+ .alias('add')
895
+ .description('Schedule an autoresponder for a date range')
896
+ .action(async (domain) => {
897
+ const { scheduleCreate } = await Promise.resolve().then(() => __importStar(require('./commands/schedule')));
898
+ await scheduleCreate(domain);
899
+ });
900
+ scheduleCmd
901
+ .command('list')
902
+ .alias('ls')
903
+ .description('List scheduled autoresponders')
904
+ .action(async () => {
905
+ const { scheduleList } = await Promise.resolve().then(() => __importStar(require('./commands/schedule')));
906
+ await scheduleList();
907
+ });
908
+ scheduleCmd
909
+ .command('check')
910
+ .description('Process pending schedule changes')
911
+ .action(async () => {
912
+ const { scheduleCheck } = await Promise.resolve().then(() => __importStar(require('./commands/schedule')));
913
+ await scheduleCheck();
914
+ });
915
+ // ─── Password Audit ─────────────────────────────────────
916
+ program
917
+ .command('password-audit')
918
+ .alias('passwd-audit')
919
+ .description('Test password strength and bulk-reset weak passwords')
920
+ .action(async () => {
921
+ const { passwordAuditCommand } = await Promise.resolve().then(() => __importStar(require('./commands/password-audit')));
922
+ await passwordAuditCommand();
923
+ });
924
+ // ─── Aliases Sync ───────────────────────────────────────
925
+ aliasesCmd
926
+ .command('sync')
927
+ .description('Sync domain aliases across profiles/servers')
928
+ .action(async () => {
929
+ const { aliasesSyncCommand } = await Promise.resolve().then(() => __importStar(require('./commands/aliases-sync')));
930
+ await aliasesSyncCommand();
931
+ });
932
+ // ─── Mail (Full Client) ─────────────────────────────────
933
+ const mailCmd = program
934
+ .command('mail')
935
+ .alias('email')
936
+ .description('Full email client — read, compose, reply, search, manage folders');
937
+ mailCmd
938
+ .command('inbox [folder]')
939
+ .alias('ls')
940
+ .description('List recent messages in inbox or folder')
941
+ .action(async (folder) => {
942
+ const { mailInbox } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
943
+ await mailInbox(folder);
944
+ });
945
+ mailCmd
946
+ .command('read <uid>')
947
+ .alias('show')
948
+ .description('Read a specific email by UID')
949
+ .action(async (uid) => {
950
+ const { mailRead } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
951
+ await mailRead(uid);
952
+ });
953
+ mailCmd
954
+ .command('compose')
955
+ .alias('new')
956
+ .description('Compose and send email with CC/BCC/attachments')
957
+ .action(async () => {
958
+ const { mailCompose } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
959
+ await mailCompose();
960
+ });
961
+ mailCmd
962
+ .command('reply <uid>')
963
+ .description('Reply to an email')
964
+ .action(async (uid) => {
965
+ const { mailReply } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
966
+ await mailReply(uid);
967
+ });
968
+ mailCmd
969
+ .command('forward <uid>')
970
+ .alias('fwd')
971
+ .description('Forward an email')
972
+ .action(async (uid) => {
973
+ const { mailForward } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
974
+ await mailForward(uid);
975
+ });
976
+ mailCmd
977
+ .command('delete <uid>')
978
+ .alias('rm')
979
+ .description('Delete an email')
980
+ .action(async (uid) => {
981
+ const { mailDelete } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
982
+ await mailDelete(uid);
983
+ });
984
+ mailCmd
985
+ .command('search <query>')
986
+ .alias('find')
987
+ .description('Search emails by subject, sender, or body')
988
+ .action(async (query) => {
989
+ const { mailSearch } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
990
+ await mailSearch(query);
991
+ });
992
+ mailCmd
993
+ .command('folders')
994
+ .description('List all mailbox folders')
995
+ .action(async () => {
996
+ const { mailFolders } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
997
+ await mailFolders();
998
+ });
999
+ mailCmd
1000
+ .command('folder-create [name]')
1001
+ .description('Create a new folder')
1002
+ .action(async (name) => {
1003
+ const { mailFolderCreate } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1004
+ await mailFolderCreate(name);
1005
+ });
1006
+ mailCmd
1007
+ .command('folder-delete [name]')
1008
+ .description('Delete a folder')
1009
+ .action(async (name) => {
1010
+ const { mailFolderDelete } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1011
+ await mailFolderDelete(name);
1012
+ });
1013
+ mailCmd
1014
+ .command('move <uid> [folder]')
1015
+ .description('Move email to a different folder')
1016
+ .action(async (uid, folder) => {
1017
+ const { mailMove } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1018
+ await mailMove(uid, folder);
1019
+ });
1020
+ mailCmd
1021
+ .command('save-attachment <uid>')
1022
+ .alias('save')
1023
+ .description('Save email attachments to disk')
1024
+ .action(async (uid) => {
1025
+ const { mailSaveAttachment } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1026
+ await mailSaveAttachment(uid);
1027
+ });
1028
+ mailCmd
1029
+ .command('unread')
1030
+ .alias('count')
1031
+ .description('Show unread message count')
1032
+ .action(async () => {
1033
+ const { mailUnread } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1034
+ await mailUnread();
1035
+ });
1036
+ mailCmd
1037
+ .command('mark-read <uid>')
1038
+ .description('Mark a message as read')
1039
+ .action(async (uid) => {
1040
+ const { mailMarkRead } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1041
+ await mailMarkRead(uid);
1042
+ });
1043
+ mailCmd
1044
+ .command('mark-unread <uid>')
1045
+ .description('Mark a message as unread')
1046
+ .action(async (uid) => {
1047
+ const { mailMarkUnread } = await Promise.resolve().then(() => __importStar(require('./commands/mail')));
1048
+ await mailMarkUnread(uid);
1049
+ });
770
1050
  // ─── Quick Actions ───────────────────────────────────────
771
1051
  program
772
1052
  .command('test')
@@ -810,6 +1090,88 @@ program
810
1090
  }
811
1091
  console.log('');
812
1092
  });
1093
+ // ─── Self-Service Password Change ────────────────────────
1094
+ program
1095
+ .command('password')
1096
+ .alias('passwd')
1097
+ .description('Change your own email password (self-service, verifies current password first)')
1098
+ .action(async () => {
1099
+ const { selfServicePasswordChange } = await Promise.resolve().then(() => __importStar(require('./commands/password')));
1100
+ await selfServicePasswordChange();
1101
+ });
1102
+ // ─── Provisioning ────────────────────────────────────────
1103
+ const provisionCmd = program
1104
+ .command('provision')
1105
+ .description('Business provisioning — create accounts, forwarders, and DNS from a manifest');
1106
+ provisionCmd
1107
+ .command('plan <manifest>')
1108
+ .description('Dry-run: show what a manifest would create/skip')
1109
+ .action(async (manifest) => {
1110
+ const { provisionPlan } = await Promise.resolve().then(() => __importStar(require('./commands/provision')));
1111
+ await provisionPlan(manifest);
1112
+ });
1113
+ provisionCmd
1114
+ .command('apply <manifest>')
1115
+ .alias('execute')
1116
+ .description('Execute a provisioning manifest — create all resources')
1117
+ .action(async (manifest) => {
1118
+ const { provisionExecute } = await Promise.resolve().then(() => __importStar(require('./commands/provision')));
1119
+ await provisionExecute(manifest);
1120
+ });
1121
+ provisionCmd
1122
+ .command('generate [domain]')
1123
+ .alias('export')
1124
+ .description('Generate a manifest from existing domain configuration')
1125
+ .action(async (domain) => {
1126
+ const { provisionGenerate } = await Promise.resolve().then(() => __importStar(require('./commands/provision')));
1127
+ await provisionGenerate(domain);
1128
+ });
1129
+ // ─── Welcome Emails ──────────────────────────────────────
1130
+ program
1131
+ .command('welcome-send [domain]')
1132
+ .alias('welcome')
1133
+ .description('Send branded welcome emails with setup instructions to accounts')
1134
+ .action(async (domain) => {
1135
+ const { welcomeSend } = await Promise.resolve().then(() => __importStar(require('./commands/welcome-send')));
1136
+ await welcomeSend(domain);
1137
+ });
1138
+ // ─── Credentials Export ──────────────────────────────────
1139
+ program
1140
+ .command('credentials-export [domain]')
1141
+ .alias('creds-export')
1142
+ .description('Export account credentials as CSV, 1Password-compatible, or JSON')
1143
+ .action(async (domain) => {
1144
+ const { credentialsExport } = await Promise.resolve().then(() => __importStar(require('./commands/credentials-export')));
1145
+ await credentialsExport(domain);
1146
+ });
1147
+ // ─── Deprovision (Employee Offboarding) ──────────────────
1148
+ program
1149
+ .command('deprovision [domain]')
1150
+ .alias('offboard')
1151
+ .description('Offboard an employee — forward emails, set auto-reply, or delete account')
1152
+ .action(async (domain) => {
1153
+ const { deprovisionAccount } = await Promise.resolve().then(() => __importStar(require('./commands/deprovision')));
1154
+ await deprovisionAccount(domain);
1155
+ });
1156
+ // ─── Quota Policy ────────────────────────────────────────
1157
+ const quotaPolicyCmd = program
1158
+ .command('quota-policy')
1159
+ .alias('qp')
1160
+ .description('Apply role-based quota policies to accounts');
1161
+ quotaPolicyCmd
1162
+ .command('apply [domain]')
1163
+ .description('Apply quota policy from file or uniform value')
1164
+ .action(async (domain) => {
1165
+ const { quotaPolicyApply } = await Promise.resolve().then(() => __importStar(require('./commands/quota-policy')));
1166
+ await quotaPolicyApply(domain);
1167
+ });
1168
+ quotaPolicyCmd
1169
+ .command('generate [domain]')
1170
+ .description('Generate a sample quota policy file from existing accounts')
1171
+ .action(async (domain) => {
1172
+ const { quotaPolicyGenerate } = await Promise.resolve().then(() => __importStar(require('./commands/quota-policy')));
1173
+ await quotaPolicyGenerate(domain);
1174
+ });
813
1175
  // ─── Default action (no command) ─────────────────────────
814
1176
  program.action(async () => {
815
1177
  const { statusCommand } = await Promise.resolve().then(() => __importStar(require('./commands/status')));