mxroute-cli 0.1.1

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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +464 -0
  3. package/dist/commands/accounts.d.ts +4 -0
  4. package/dist/commands/accounts.js +262 -0
  5. package/dist/commands/accounts.js.map +1 -0
  6. package/dist/commands/aliases.d.ts +3 -0
  7. package/dist/commands/aliases.js +190 -0
  8. package/dist/commands/aliases.js.map +1 -0
  9. package/dist/commands/auth.d.ts +3 -0
  10. package/dist/commands/auth.js +143 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/autoresponder.d.ts +4 -0
  13. package/dist/commands/autoresponder.js +280 -0
  14. package/dist/commands/autoresponder.js.map +1 -0
  15. package/dist/commands/catchall.d.ts +2 -0
  16. package/dist/commands/catchall.js +173 -0
  17. package/dist/commands/catchall.js.map +1 -0
  18. package/dist/commands/config.d.ts +5 -0
  19. package/dist/commands/config.js +161 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/dns.d.ts +3 -0
  22. package/dist/commands/dns.js +160 -0
  23. package/dist/commands/dns.js.map +1 -0
  24. package/dist/commands/dnsapi.d.ts +4 -0
  25. package/dist/commands/dnsapi.js +397 -0
  26. package/dist/commands/dnsapi.js.map +1 -0
  27. package/dist/commands/domains.d.ts +2 -0
  28. package/dist/commands/domains.js +109 -0
  29. package/dist/commands/domains.js.map +1 -0
  30. package/dist/commands/filters.d.ts +3 -0
  31. package/dist/commands/filters.js +300 -0
  32. package/dist/commands/filters.js.map +1 -0
  33. package/dist/commands/forwarders.d.ts +3 -0
  34. package/dist/commands/forwarders.js +202 -0
  35. package/dist/commands/forwarders.js.map +1 -0
  36. package/dist/commands/info.d.ts +2 -0
  37. package/dist/commands/info.js +163 -0
  38. package/dist/commands/info.js.map +1 -0
  39. package/dist/commands/lists.d.ts +6 -0
  40. package/dist/commands/lists.js +372 -0
  41. package/dist/commands/lists.js.map +1 -0
  42. package/dist/commands/quota.d.ts +2 -0
  43. package/dist/commands/quota.js +184 -0
  44. package/dist/commands/quota.js.map +1 -0
  45. package/dist/commands/send.d.ts +9 -0
  46. package/dist/commands/send.js +107 -0
  47. package/dist/commands/send.js.map +1 -0
  48. package/dist/commands/setup.d.ts +1 -0
  49. package/dist/commands/setup.js +535 -0
  50. package/dist/commands/setup.js.map +1 -0
  51. package/dist/commands/spam.d.ts +4 -0
  52. package/dist/commands/spam.js +215 -0
  53. package/dist/commands/spam.js.map +1 -0
  54. package/dist/commands/status.d.ts +1 -0
  55. package/dist/commands/status.js +79 -0
  56. package/dist/commands/status.js.map +1 -0
  57. package/dist/commands/troubleshoot.d.ts +1 -0
  58. package/dist/commands/troubleshoot.js +324 -0
  59. package/dist/commands/troubleshoot.js.map +1 -0
  60. package/dist/index.d.ts +2 -0
  61. package/dist/index.js +589 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mcp.d.ts +2 -0
  64. package/dist/mcp.js +599 -0
  65. package/dist/mcp.js.map +1 -0
  66. package/dist/utils/api.d.ts +15 -0
  67. package/dist/utils/api.js +30 -0
  68. package/dist/utils/api.js.map +1 -0
  69. package/dist/utils/config.d.ts +24 -0
  70. package/dist/utils/config.js +150 -0
  71. package/dist/utils/config.js.map +1 -0
  72. package/dist/utils/directadmin.d.ts +49 -0
  73. package/dist/utils/directadmin.js +444 -0
  74. package/dist/utils/directadmin.js.map +1 -0
  75. package/dist/utils/dns.d.ts +14 -0
  76. package/dist/utils/dns.js +284 -0
  77. package/dist/utils/dns.js.map +1 -0
  78. package/dist/utils/theme.d.ts +24 -0
  79. package/dist/utils/theme.js +95 -0
  80. package/dist/utils/theme.js.map +1 -0
  81. package/package.json +92 -0
@@ -0,0 +1,215 @@
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.spamStatus = spamStatus;
7
+ exports.spamEnable = spamEnable;
8
+ exports.spamDisable = spamDisable;
9
+ exports.spamConfig = spamConfig;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const ora_1 = __importDefault(require("ora"));
12
+ const inquirer_1 = __importDefault(require("inquirer"));
13
+ const theme_1 = require("../utils/theme");
14
+ const config_1 = require("../utils/config");
15
+ const directadmin_1 = require("../utils/directadmin");
16
+ function getCreds() {
17
+ const config = (0, config_1.getConfig)();
18
+ if (!config.daUsername || !config.daLoginKey) {
19
+ console.log(theme_1.theme.error(`\n ${theme_1.theme.statusIcon('fail')} Not authenticated. Run ${theme_1.theme.bold('mxroute auth login')} first.\n`));
20
+ process.exit(1);
21
+ }
22
+ return { server: config.server, username: config.daUsername, loginKey: config.daLoginKey };
23
+ }
24
+ async function pickDomain(creds, domain) {
25
+ if (domain)
26
+ return domain;
27
+ const config = (0, config_1.getConfig)();
28
+ if (config.domain)
29
+ return config.domain;
30
+ const spinner = (0, ora_1.default)({ text: 'Fetching domains...', spinner: 'dots12', color: 'cyan' }).start();
31
+ const domains = await (0, directadmin_1.listDomains)(creds);
32
+ spinner.stop();
33
+ if (domains.length === 0) {
34
+ console.log(theme_1.theme.error(`\n ${theme_1.theme.statusIcon('fail')} No domains found.\n`));
35
+ process.exit(1);
36
+ }
37
+ if (domains.length === 1)
38
+ return domains[0];
39
+ const { selected } = await inquirer_1.default.prompt([
40
+ {
41
+ type: 'list',
42
+ name: 'selected',
43
+ message: 'Select domain:',
44
+ choices: domains,
45
+ },
46
+ ]);
47
+ return selected;
48
+ }
49
+ async function spamStatus(domain) {
50
+ const creds = getCreds();
51
+ const targetDomain = await pickDomain(creds, domain);
52
+ console.log(theme_1.theme.heading(`SpamAssassin: ${targetDomain}`));
53
+ const spinner = (0, ora_1.default)({ text: 'Fetching spam configuration...', spinner: 'dots12', color: 'cyan' }).start();
54
+ try {
55
+ const config = await (0, directadmin_1.getSpamConfig)(creds, targetDomain);
56
+ spinner.stop();
57
+ const enabled = config.enabled === 'yes' || config.enabled === '1';
58
+ console.log(theme_1.theme.keyValue('Status', enabled ? chalk_1.default.green('Enabled') : chalk_1.default.red('Disabled')));
59
+ console.log(theme_1.theme.keyValue('Required Score', config.required_score || '5'));
60
+ console.log(theme_1.theme.keyValue('Spam Delivery', config.where || 'userspamfolder'));
61
+ if (config.high_score) {
62
+ console.log(theme_1.theme.keyValue('High Score Threshold', config.high_score));
63
+ }
64
+ if (config.high_score_block) {
65
+ console.log(theme_1.theme.keyValue('High Score Action', config.high_score_block));
66
+ }
67
+ console.log('');
68
+ console.log(theme_1.theme.muted(' MXroute also has Expert Spam Filtering \u2014 manage at'));
69
+ console.log(theme_1.theme.muted(' Management Panel \u2192 Spam Filters'));
70
+ console.log('');
71
+ }
72
+ catch (err) {
73
+ spinner.fail(chalk_1.default.red('Failed to fetch spam configuration'));
74
+ console.log(theme_1.theme.error(` ${err.message}\n`));
75
+ }
76
+ }
77
+ async function spamEnable(domain) {
78
+ const creds = getCreds();
79
+ const targetDomain = await pickDomain(creds, domain);
80
+ console.log(theme_1.theme.heading(`Enable SpamAssassin: ${targetDomain}`));
81
+ const spinner = (0, ora_1.default)({ text: 'Enabling SpamAssassin...', spinner: 'dots12', color: 'cyan' }).start();
82
+ try {
83
+ const result = await (0, directadmin_1.setSpamConfig)(creds, targetDomain, {
84
+ action: 'save',
85
+ enabled: 'yes',
86
+ where: 'userspamfolder',
87
+ required_score: '5',
88
+ });
89
+ if (result.error && result.error !== '0') {
90
+ spinner.fail(chalk_1.default.red('Failed to enable SpamAssassin'));
91
+ console.log(theme_1.theme.error(` ${result.text || JSON.stringify(result)}\n`));
92
+ }
93
+ else {
94
+ spinner.succeed(chalk_1.default.green(`SpamAssassin enabled for ${targetDomain}`));
95
+ console.log(theme_1.theme.muted(' Score threshold: 5 | Spam folder: userspamfolder'));
96
+ console.log('');
97
+ }
98
+ }
99
+ catch (err) {
100
+ spinner.fail(chalk_1.default.red('Failed to enable SpamAssassin'));
101
+ console.log(theme_1.theme.error(` ${err.message}\n`));
102
+ }
103
+ }
104
+ async function spamDisable(domain) {
105
+ const creds = getCreds();
106
+ const targetDomain = await pickDomain(creds, domain);
107
+ console.log(theme_1.theme.heading(`Disable SpamAssassin: ${targetDomain}`));
108
+ const spinner = (0, ora_1.default)({ text: 'Disabling SpamAssassin...', spinner: 'dots12', color: 'cyan' }).start();
109
+ try {
110
+ const result = await (0, directadmin_1.setSpamConfig)(creds, targetDomain, {
111
+ action: 'save',
112
+ enabled: 'no',
113
+ });
114
+ if (result.error && result.error !== '0') {
115
+ spinner.fail(chalk_1.default.red('Failed to disable SpamAssassin'));
116
+ console.log(theme_1.theme.error(` ${result.text || JSON.stringify(result)}\n`));
117
+ }
118
+ else {
119
+ spinner.succeed(chalk_1.default.green(`SpamAssassin disabled for ${targetDomain}`));
120
+ console.log('');
121
+ }
122
+ }
123
+ catch (err) {
124
+ spinner.fail(chalk_1.default.red('Failed to disable SpamAssassin'));
125
+ console.log(theme_1.theme.error(` ${err.message}\n`));
126
+ }
127
+ }
128
+ async function spamConfig(domain) {
129
+ const creds = getCreds();
130
+ const targetDomain = await pickDomain(creds, domain);
131
+ console.log(theme_1.theme.heading(`Configure SpamAssassin: ${targetDomain}`));
132
+ const answers = await inquirer_1.default.prompt([
133
+ {
134
+ type: 'number',
135
+ name: 'required_score',
136
+ message: theme_1.theme.secondary('Score threshold (1-10):'),
137
+ default: 5,
138
+ validate: (input) => {
139
+ if (isNaN(input) || input < 1 || input > 10)
140
+ return 'Enter a number between 1 and 10';
141
+ return true;
142
+ },
143
+ },
144
+ {
145
+ type: 'list',
146
+ name: 'where',
147
+ message: theme_1.theme.secondary('Where to put spam:'),
148
+ choices: [
149
+ { name: 'Spam folder (recommended)', value: 'userspamfolder' },
150
+ { name: 'Inbox (mark as spam)', value: 'inbox' },
151
+ { name: 'Delete immediately', value: 'delete' },
152
+ ],
153
+ default: 'userspamfolder',
154
+ },
155
+ {
156
+ type: 'number',
157
+ name: 'high_score',
158
+ message: theme_1.theme.secondary('High score threshold (scores above this get special handling):'),
159
+ default: 10,
160
+ validate: (input) => {
161
+ if (isNaN(input) || input < 1)
162
+ return 'Enter a valid number';
163
+ return true;
164
+ },
165
+ },
166
+ {
167
+ type: 'list',
168
+ name: 'high_score_block',
169
+ message: theme_1.theme.secondary('High score action:'),
170
+ choices: [
171
+ { name: 'Move to spam folder', value: 'userspamfolder' },
172
+ { name: 'Delete immediately', value: 'delete' },
173
+ { name: 'Deliver to inbox', value: 'inbox' },
174
+ ],
175
+ default: 'delete',
176
+ },
177
+ ]);
178
+ const { confirm } = await inquirer_1.default.prompt([
179
+ {
180
+ type: 'confirm',
181
+ name: 'confirm',
182
+ message: `Apply SpamAssassin settings to ${targetDomain}?`,
183
+ default: true,
184
+ },
185
+ ]);
186
+ if (!confirm) {
187
+ console.log(theme_1.theme.muted('\n Cancelled.\n'));
188
+ return;
189
+ }
190
+ const spinner = (0, ora_1.default)({ text: 'Applying spam configuration...', spinner: 'dots12', color: 'cyan' }).start();
191
+ try {
192
+ const result = await (0, directadmin_1.setSpamConfig)(creds, targetDomain, {
193
+ action: 'save',
194
+ enabled: 'yes',
195
+ required_score: answers.required_score.toString(),
196
+ where: answers.where,
197
+ high_score: answers.high_score.toString(),
198
+ high_score_block: answers.high_score_block,
199
+ });
200
+ if (result.error && result.error !== '0') {
201
+ spinner.fail(chalk_1.default.red('Failed to apply spam configuration'));
202
+ console.log(theme_1.theme.error(` ${result.text || JSON.stringify(result)}\n`));
203
+ }
204
+ else {
205
+ spinner.succeed(chalk_1.default.green(`SpamAssassin configured for ${targetDomain}`));
206
+ console.log(theme_1.theme.muted(` Score: ${answers.required_score} | Spam: ${answers.where} | High score: ${answers.high_score} (${answers.high_score_block})`));
207
+ console.log('');
208
+ }
209
+ }
210
+ catch (err) {
211
+ spinner.fail(chalk_1.default.red('Failed to apply spam configuration'));
212
+ console.log(theme_1.theme.error(` ${err.message}\n`));
213
+ }
214
+ }
215
+ //# sourceMappingURL=spam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spam.js","sourceRoot":"","sources":["../../src/commands/spam.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function statusCommand(): Promise<void>;
@@ -0,0 +1,79 @@
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.statusCommand = statusCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const theme_1 = require("../utils/theme");
10
+ const config_1 = require("../utils/config");
11
+ const dns_1 = require("../utils/dns");
12
+ const api_1 = require("../utils/api");
13
+ async function statusCommand() {
14
+ const config = (0, config_1.getConfig)();
15
+ console.log(theme_1.theme.banner());
16
+ if (!config.server || !config.username) {
17
+ console.log(theme_1.theme.warning(` ${theme_1.theme.statusIcon('warn')} Not configured yet. Run ${theme_1.theme.bold('mxroute config setup')} to get started.\n`));
18
+ console.log(theme_1.theme.subheading('Quick Start:'));
19
+ console.log(theme_1.theme.muted(' 1. mxroute config setup Configure your account'));
20
+ console.log(theme_1.theme.muted(' 2. mxroute dns check Verify DNS records'));
21
+ console.log(theme_1.theme.muted(' 3. mxroute send Send an email'));
22
+ console.log(theme_1.theme.muted(' 4. mxroute info View connection settings'));
23
+ console.log('');
24
+ return;
25
+ }
26
+ console.log(theme_1.theme.box([
27
+ theme_1.theme.keyValue('Profile', config.activeProfile, 0),
28
+ theme_1.theme.keyValue('Server', `${config.server}.mxrouting.net`, 0),
29
+ theme_1.theme.keyValue('Account', config.username, 0),
30
+ theme_1.theme.keyValue('Domain', config.domain, 0),
31
+ ].join('\n'), 'Account'));
32
+ console.log('');
33
+ // DNS Check
34
+ if (config.domain) {
35
+ const spinner = (0, ora_1.default)({
36
+ text: 'Running DNS health check...',
37
+ spinner: 'dots12',
38
+ color: 'cyan',
39
+ }).start();
40
+ try {
41
+ const results = await (0, dns_1.runFullDnsCheck)(config.domain, config.server);
42
+ spinner.stop();
43
+ const passed = results.filter((r) => r.status === 'pass').length;
44
+ const total = results.length;
45
+ console.log(theme_1.theme.subheading('DNS Health'));
46
+ for (const result of results) {
47
+ const icon = theme_1.theme.statusIcon(result.status);
48
+ console.log(` ${icon} ${result.type.padEnd(6)} ${theme_1.theme.muted(result.message)}`);
49
+ }
50
+ const scoreColor = passed === total ? theme_1.theme.success : passed >= total - 2 ? theme_1.theme.warning : theme_1.theme.error;
51
+ console.log(`\n ${scoreColor(`Score: ${passed}/${total}`)}`);
52
+ console.log('');
53
+ }
54
+ catch {
55
+ spinner.stop();
56
+ console.log(theme_1.theme.muted(' Could not check DNS\n'));
57
+ }
58
+ }
59
+ // API Connection Test
60
+ const apiSpinner = (0, ora_1.default)({
61
+ text: 'Testing SMTP API connection...',
62
+ spinner: 'dots12',
63
+ color: 'cyan',
64
+ }).start();
65
+ try {
66
+ const result = await (0, api_1.testConnection)(`${config.server}.mxrouting.net`, config.username, config.password);
67
+ if (result.success) {
68
+ apiSpinner.succeed(chalk_1.default.green('SMTP API connection successful'));
69
+ }
70
+ else {
71
+ apiSpinner.warn(chalk_1.default.yellow(`SMTP API: ${result.message}`));
72
+ }
73
+ }
74
+ catch (err) {
75
+ apiSpinner.fail(chalk_1.default.red(`SMTP API unreachable: ${err.message}`));
76
+ }
77
+ console.log('');
78
+ }
79
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;;;;AAOA,sCAiFC;AAxFD,kDAA0B;AAC1B,8CAAsB;AACtB,0CAAuC;AACvC,4CAA4C;AAC5C,sCAA+C;AAC/C,sCAA8C;AAEvC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,OAAO,CACX,KAAK,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,4BAA4B,aAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAChH,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,aAAK,CAAC,GAAG,CACP;QACE,aAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAClD,aAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;QAC7D,aAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,aAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,SAAS,CACV,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,YAAY;IACZ,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC;YAClB,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;QAEX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAe,EAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;YAE7B,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,aAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,aAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,aAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,aAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAK,CAAC,KAAK,CAAC;YACxG,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,UAAU,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAA,aAAG,EAAC;QACrB,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAc,EAAC,GAAG,MAAM,CAAC,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function troubleshootCommand(): Promise<void>;
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.troubleshootCommand = troubleshootCommand;
40
+ const ora_1 = __importDefault(require("ora"));
41
+ const inquirer_1 = __importDefault(require("inquirer"));
42
+ const theme_1 = require("../utils/theme");
43
+ const config_1 = require("../utils/config");
44
+ const dns_1 = require("../utils/dns");
45
+ const api_1 = require("../utils/api");
46
+ async function troubleshootCommand() {
47
+ console.log(theme_1.theme.heading('Troubleshoot MXroute'));
48
+ const { issue } = await inquirer_1.default.prompt([
49
+ {
50
+ type: 'list',
51
+ name: 'issue',
52
+ message: 'What issue are you experiencing?',
53
+ choices: [
54
+ { name: 'Emails going to spam (Gmail)', value: 'spam-gmail' },
55
+ { name: 'Emails going to spam (Microsoft/Hotmail/Outlook)', value: 'spam-microsoft' },
56
+ { name: 'Cannot connect to server', value: 'connection' },
57
+ { name: 'Authentication failures', value: 'auth' },
58
+ { name: 'Emails not being delivered', value: 'delivery' },
59
+ { name: 'DNS configuration issues', value: 'dns' },
60
+ { name: 'SSL certificate warnings', value: 'ssl' },
61
+ { name: 'Common error messages', value: 'errors' },
62
+ { name: 'Migration issues', value: 'migration' },
63
+ { name: 'Spam filter blocking legitimate mail', value: 'spam-filter' },
64
+ ],
65
+ },
66
+ ]);
67
+ console.log('');
68
+ switch (issue) {
69
+ case 'spam-gmail':
70
+ printSpamGmail();
71
+ break;
72
+ case 'spam-microsoft':
73
+ printSpamMicrosoft();
74
+ break;
75
+ case 'connection':
76
+ await troubleshootConnection();
77
+ break;
78
+ case 'auth':
79
+ printAuthIssues();
80
+ break;
81
+ case 'delivery':
82
+ await troubleshootDelivery();
83
+ break;
84
+ case 'dns':
85
+ await troubleshootDns();
86
+ break;
87
+ case 'ssl':
88
+ printSslIssues();
89
+ break;
90
+ case 'errors':
91
+ printCommonErrors();
92
+ break;
93
+ case 'migration':
94
+ printMigrationHelp();
95
+ break;
96
+ case 'spam-filter':
97
+ printSpamFilterHelp();
98
+ break;
99
+ }
100
+ }
101
+ function printSpamGmail() {
102
+ console.log(theme_1.theme.heading('Fixing Gmail Spam Issues'));
103
+ const steps = [
104
+ [
105
+ 'Step 1',
106
+ 'Get 10/10 on mail-tester.com',
107
+ 'Send a test email to the address shown on mail-tester.com and check your score',
108
+ ],
109
+ ['Step 2', 'Verify DNS records', 'Run: mxroute dns check — all SPF, DKIM, DMARC must pass'],
110
+ [
111
+ 'Step 3',
112
+ 'Train Gmail filters',
113
+ 'Ask recipients to:\n - Mark messages as "Not spam"\n - Add your address to contacts\n - Reply to and engage with your emails',
114
+ ],
115
+ ['Step 4', 'Monitor reputation', 'Set up Google Postmaster Tools to track domain reputation'],
116
+ [
117
+ 'Step 5',
118
+ 'Content quality',
119
+ 'Avoid spam trigger words, maintain good text-to-image ratio,\n build volume gradually for new domains',
120
+ ],
121
+ ];
122
+ for (const [step, title, desc] of steps) {
123
+ console.log(` ${theme_1.theme.secondary(step)} ${theme_1.theme.bold(title)}`);
124
+ console.log(` ${theme_1.theme.muted(desc)}`);
125
+ console.log('');
126
+ }
127
+ console.log(theme_1.theme.info(` ${theme_1.theme.statusIcon('info')} Gmail requirements: SPF + DKIM auth, <0.1% spam rate, consistent patterns\n`));
128
+ }
129
+ function printSpamMicrosoft() {
130
+ console.log(theme_1.theme.heading('Fixing Microsoft Spam Issues'));
131
+ console.log(theme_1.theme.warning(` ${theme_1.theme.statusIcon('warn')} Microsoft has notoriously strict filtering. This is industry-wide.\n`));
132
+ const steps = [
133
+ ['Step 1', 'Get 10/10 on mail-tester.com'],
134
+ ['Step 2', 'Verify all DNS records: mxroute dns check'],
135
+ ['Step 3', 'Ask recipients to mark as "Not Junk" (use the button)'],
136
+ ['Step 4', 'Ask recipients to add your address to contacts'],
137
+ ['Step 5', 'Use natural person-to-person communication style'],
138
+ ['Step 6', 'Avoid sending many emails at once'],
139
+ ];
140
+ for (const [step, action] of steps) {
141
+ console.log(` ${theme_1.theme.secondary(step)} ${theme_1.theme.muted(action)}`);
142
+ }
143
+ console.log('');
144
+ console.log(theme_1.theme.info(` ${theme_1.theme.statusIcon('info')} MXroute manages server IP reputation via Microsoft SNDS`));
145
+ console.log(theme_1.theme.info(` ${theme_1.theme.statusIcon('info')} If issues persist: open support ticket with mail-tester score and headers\n`));
146
+ }
147
+ async function troubleshootConnection() {
148
+ console.log(theme_1.theme.heading('Connection Troubleshooting'));
149
+ const config = (0, config_1.getConfig)();
150
+ console.log(theme_1.theme.subheading('Checklist'));
151
+ console.log(theme_1.theme.muted(' 1. Verify server hostname (found in Control Panel -> DNS)'));
152
+ console.log(theme_1.theme.muted(' 2. Try these ports:'));
153
+ console.log(theme_1.theme.keyValue('IMAP', '993 (SSL) or 143 (STARTTLS)', 7));
154
+ console.log(theme_1.theme.keyValue('SMTP', '465 (SSL), 587 (STARTTLS), or 2525 (STARTTLS)', 7));
155
+ console.log(theme_1.theme.muted(' 3. If port 587 is blocked by ISP, try port 2525'));
156
+ console.log(theme_1.theme.muted(' 4. Check internet connectivity and firewall'));
157
+ console.log(theme_1.theme.muted(' 5. Verify date/time is correct on your device'));
158
+ console.log('');
159
+ if (config.server && config.username && config.password) {
160
+ const spinner = (0, ora_1.default)({ text: 'Testing SMTP API connection...', spinner: 'dots12', color: 'cyan' }).start();
161
+ try {
162
+ const result = await (0, api_1.testConnection)(`${config.server}.mxrouting.net`, config.username, config.password);
163
+ if (result.success) {
164
+ spinner.succeed('SMTP API is reachable and credentials are valid');
165
+ }
166
+ else {
167
+ spinner.fail(`SMTP API error: ${result.message}`);
168
+ }
169
+ }
170
+ catch (err) {
171
+ spinner.fail(`Cannot reach SMTP API: ${err.message}`);
172
+ }
173
+ console.log('');
174
+ }
175
+ }
176
+ function printAuthIssues() {
177
+ console.log(theme_1.theme.heading('Authentication Troubleshooting'));
178
+ const checks = [
179
+ ['Username', 'Must be the FULL email address (user@domain.com)'],
180
+ ['Password', 'Reset in Control Panel -> Email Accounts if unsure'],
181
+ ['Server', 'Must match your MXroute server (check Control Panel -> DNS)'],
182
+ ['Encryption', 'Ensure SSL/TLS or STARTTLS is enabled (not "None")'],
183
+ ['Test', 'Try logging into webmail first to verify credentials'],
184
+ ];
185
+ for (const [label, desc] of checks) {
186
+ console.log(` ${theme_1.theme.statusIcon('info')} ${theme_1.theme.bold(label.padEnd(12))} ${theme_1.theme.muted(desc)}`);
187
+ }
188
+ console.log('');
189
+ }
190
+ async function troubleshootDelivery() {
191
+ console.log(theme_1.theme.heading('Email Delivery Troubleshooting'));
192
+ const config = (0, config_1.getConfig)();
193
+ console.log(theme_1.theme.subheading('Diagnostic Steps'));
194
+ console.log(theme_1.theme.muted(' 1. Send test email to mail-tester.com — aim for 10/10'));
195
+ console.log(theme_1.theme.muted(' 2. Check DNS records: mxroute dns check'));
196
+ console.log(theme_1.theme.muted(' 3. Verify sender address exists in Control Panel'));
197
+ console.log(theme_1.theme.muted(' 4. Check email headers for bounce/error info'));
198
+ console.log(theme_1.theme.muted(' 5. Verify recipient address is correct'));
199
+ console.log('');
200
+ if (config.domain && config.server) {
201
+ const spinner = (0, ora_1.default)({ text: 'Checking DNS...', spinner: 'dots12', color: 'cyan' }).start();
202
+ try {
203
+ const results = await (0, dns_1.runFullDnsCheck)(config.domain, config.server);
204
+ spinner.stop();
205
+ const failed = results.filter((r) => r.status === 'fail');
206
+ if (failed.length > 0) {
207
+ console.log(theme_1.theme.error(` ${theme_1.theme.statusIcon('fail')} DNS issues found that may affect delivery:\n`));
208
+ for (const f of failed) {
209
+ console.log(` ${theme_1.theme.statusIcon('fail')} ${f.type}: ${f.message}`);
210
+ }
211
+ }
212
+ else {
213
+ console.log(theme_1.theme.success(` ${theme_1.theme.statusIcon('pass')} DNS records look good`));
214
+ }
215
+ }
216
+ catch {
217
+ spinner.stop();
218
+ }
219
+ console.log('');
220
+ }
221
+ }
222
+ async function troubleshootDns() {
223
+ const config = (0, config_1.getConfig)();
224
+ if (config.domain && config.server) {
225
+ const { dnsCheck } = await Promise.resolve().then(() => __importStar(require('./dns')));
226
+ await dnsCheck(config.domain);
227
+ }
228
+ else {
229
+ console.log(theme_1.theme.heading('DNS Troubleshooting'));
230
+ console.log(theme_1.theme.muted(' Common DNS mistakes:'));
231
+ console.log(theme_1.theme.muted(' 1. Multiple SPF records — only one allowed per domain'));
232
+ console.log(theme_1.theme.muted(' 2. Wrong DKIM selector — must be x._domainkey'));
233
+ console.log(theme_1.theme.muted(' 3. DKIM key truncated by DNS provider'));
234
+ console.log(theme_1.theme.muted(' 4. MX pointing to IP — must be hostname'));
235
+ console.log(theme_1.theme.muted(' 5. Missing relay MX record (priority 20)'));
236
+ console.log(theme_1.theme.muted(' 6. Using A record for custom hostname — use CNAME'));
237
+ console.log(theme_1.theme.muted(' 7. SPF with ~all instead of -all'));
238
+ console.log('');
239
+ console.log(theme_1.theme.info(` ${theme_1.theme.statusIcon('info')} Configure first: ${theme_1.theme.bold('mxroute config setup')}, then run ${theme_1.theme.bold('mxroute dns check')}\n`));
240
+ }
241
+ }
242
+ function printSslIssues() {
243
+ console.log(theme_1.theme.heading('SSL Certificate Troubleshooting'));
244
+ console.log(theme_1.theme.muted(' 1. If using custom hostnames, ensure CNAME records are correct'));
245
+ console.log(theme_1.theme.muted(' 2. Request SSL certificate in Control Panel -> SSL Certificates'));
246
+ console.log(theme_1.theme.muted(' 3. Wait for DNS propagation before requesting certificate'));
247
+ console.log(theme_1.theme.muted(' 4. Use CNAME records, not A records (IPs may change)'));
248
+ console.log('');
249
+ }
250
+ function printCommonErrors() {
251
+ console.log(theme_1.theme.heading('Common Error Messages'));
252
+ const errors = [
253
+ [
254
+ '550 Authentication Required',
255
+ 'SMTP auth not enabled in email client',
256
+ 'Enable SMTP authentication with full email as username',
257
+ ],
258
+ [
259
+ 'Sender Verify Failed',
260
+ 'FROM address does not exist on server',
261
+ 'Ensure sending address exists and matches authenticated account',
262
+ ],
263
+ ['550 5.7.515 Access Denied', 'Microsoft rejecting due to failed auth', 'Check DKIM record — most common cause'],
264
+ [
265
+ 'No Such Recipient Here',
266
+ 'Recipient does not exist on server',
267
+ 'Verify account exists in Control Panel -> Email Accounts',
268
+ ],
269
+ ['Address Blocked by Admins', 'Policy violation or abuse', 'Contact MXroute support with details'],
270
+ ];
271
+ for (const [error, cause, fix] of errors) {
272
+ console.log(` ${theme_1.theme.error(error)}`);
273
+ console.log(` ${theme_1.theme.label('Cause:')} ${theme_1.theme.muted(cause)}`);
274
+ console.log(` ${theme_1.theme.label('Fix:')} ${theme_1.theme.muted(fix)}`);
275
+ console.log('');
276
+ }
277
+ }
278
+ function printMigrationHelp() {
279
+ console.log(theme_1.theme.heading('Email Migration'));
280
+ console.log(theme_1.theme.subheading('Using imapsync'));
281
+ console.log('');
282
+ console.log(theme_1.theme.muted(' imapsync \\'));
283
+ console.log(theme_1.theme.muted(' --host1 source.server.com --user1 source@example.com \\'));
284
+ console.log(theme_1.theme.muted(" --password1 'sourcepass' \\"));
285
+ console.log(theme_1.theme.muted(' --host2 mail.mxroute.com --user2 dest@example.com \\'));
286
+ console.log(theme_1.theme.muted(" --password2 'destpass'"));
287
+ console.log('');
288
+ console.log(theme_1.theme.subheading('Migration Steps'));
289
+ console.log(theme_1.theme.muted(' 1. Create destination accounts on MXroute first'));
290
+ console.log(theme_1.theme.muted(' 2. Test with a non-critical account'));
291
+ console.log(theme_1.theme.muted(' 3. Run imapsync during low-usage hours'));
292
+ console.log(theme_1.theme.muted(' 4. Verify emails transferred'));
293
+ console.log(theme_1.theme.muted(' 5. Update DNS MX records to MXroute'));
294
+ console.log(theme_1.theme.muted(' 6. Configure SPF, DKIM, DMARC'));
295
+ console.log(theme_1.theme.muted(' 7. Reconfigure all devices'));
296
+ console.log(theme_1.theme.muted(' 8. Keep old service running during transition'));
297
+ console.log('');
298
+ console.log(theme_1.theme.subheading('Common Issues'));
299
+ console.log(theme_1.theme.keyValue('Timeouts', 'Check firewall and IMAP access on source'));
300
+ console.log(theme_1.theme.keyValue('Missing emails', 'Verify folder structures; use mapping options'));
301
+ console.log(theme_1.theme.keyValue('Auth failures', 'Confirm credentials; ensure IMAP enabled'));
302
+ console.log(theme_1.theme.keyValue('Slow transfer', 'Split large mailboxes into batches'));
303
+ console.log('');
304
+ }
305
+ function printSpamFilterHelp() {
306
+ console.log(theme_1.theme.heading('Expert Spam Filtering'));
307
+ console.log(theme_1.theme.muted(' MXroute Expert Spam Filtering is enabled by default.'));
308
+ console.log('');
309
+ console.log(theme_1.theme.subheading('Managing the Filter'));
310
+ console.log(theme_1.theme.muted(' Toggle: Management Panel -> Login to Panel -> Spam Filters -> Advanced'));
311
+ console.log(theme_1.theme.muted(' Changes take effect within 5 minutes'));
312
+ console.log('');
313
+ console.log(theme_1.theme.warning(` ${theme_1.theme.statusIcon('warn')} Cannot disable if forwarding to Gmail, Microsoft, Yahoo, AOL, or T-Online`));
314
+ console.log('');
315
+ console.log(theme_1.theme.subheading('If Legitimate Mail is Blocked'));
316
+ console.log(theme_1.theme.muted(' Submit whitelist request: https://whitelistrequest.mxrouting.net'));
317
+ console.log('');
318
+ console.log(theme_1.theme.subheading('When to Contact Support'));
319
+ console.log(theme_1.theme.muted(' Include: error message, timestamp, mail-tester score, affected domain,'));
320
+ console.log(theme_1.theme.muted(' email headers, and steps already attempted.'));
321
+ console.log(theme_1.theme.muted(' Response time: typically 4-6 hours, within 24 hours.'));
322
+ console.log('');
323
+ }
324
+ //# sourceMappingURL=troubleshoot.js.map