@bobfrankston/mailx 1.0.466 → 1.0.500
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.
- package/.globalize.json5 +25 -0
- package/README.md +17 -420
- package/bin/mailx.js +87 -84
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +87 -84
- package/client/android.html +5 -5
- package/client/app.js +42 -38
- package/client/components/folder-tree.js +7 -5
- package/client/components/message-list.js +485 -448
- package/client/components/message-viewer.js +36 -41
- package/client/index.html +8 -8
- package/client/lib/message-state.js +46 -65
- package/index.js +59 -0
- package/package.json +12 -114
- package/packages/mailx-send/mailsend/{package-lock.json → node_modules/.package-lock.json} +0 -16
- package/packages/mailx-send/mailsend/node_modules/@types/node/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/README.md +15 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert.d.ts +1078 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/async_hooks.d.ts +603 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.d.ts +1934 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/child_process.d.ts +1476 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/cluster.d.ts +578 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/console.d.ts +452 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/constants.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/crypto.d.ts +4545 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dgram.d.ts +600 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns.d.ts +923 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/domain.d.ts +170 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/events.d.ts +976 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs/promises.d.ts +1295 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs.d.ts +4461 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.d.ts +172 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/http.d.ts +2089 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/http2.d.ts +2644 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/https.d.ts +579 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/index.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.d.ts +253 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/module.d.ts +891 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/net.d.ts +1057 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/os.d.ts +506 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/package.json +145 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/path.d.ts +200 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/perf_hooks.d.ts +968 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/process.d.ts +2084 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/punycode.d.ts +117 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/querystring.d.ts +152 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline.d.ts +594 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/repl.d.ts +428 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/sea.d.ts +153 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/sqlite.d.ts +721 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/web.d.ts +622 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream.d.ts +1664 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/test.d.ts +2163 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers.d.ts +287 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/tls.d.ts +1319 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/trace_events.d.ts +197 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/index.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/tty.d.ts +208 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/url.d.ts +984 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/util.d.ts +2606 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/v8.d.ts +920 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/vm.d.ts +1000 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/wasi.d.ts +181 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/worker_threads.d.ts +784 -0
- package/packages/mailx-send/mailsend/node_modules/@types/node/zlib.d.ts +747 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/README.md +15 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/index.d.ts +82 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/addressparser/index.d.ts +31 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/base64/index.d.ts +22 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/index.d.ts +45 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/message-parser.d.ts +75 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/relaxed-body.d.ts +75 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/sign.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/cookies.d.ts +54 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/index.d.ts +38 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/json-transport/index.d.ts +53 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mail-composer/index.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/index.d.ts +283 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts +32 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/index.d.ts +87 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/mime-types.d.ts +2 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/index.d.ts +224 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/last-newline.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/qp/index.d.ts +23 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts +53 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-unix.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-windows.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/ses-transport/index.d.ts +146 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/shared/index.d.ts +58 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/data-stream.d.ts +11 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/http-proxy-client.d.ts +16 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts +270 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts +93 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/pool-resource.d.ts +66 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts +115 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/stream-transport/index.d.ts +59 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/well-known/index.d.ts +6 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/xoauth2/index.d.ts +114 -0
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/package.json +38 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.ncurc.js +9 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierignore +8 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc +12 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc.js +10 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.release-please-config.json +9 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/LICENSE +16 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/README.md +86 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/SECURITY.txt +22 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/eslint.config.js +88 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/addressparser/index.js +383 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/base64/index.js +139 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/index.js +253 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/message-parser.js +155 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/relaxed-body.js +154 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/sign.js +117 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/cookies.js +281 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/index.js +280 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/json-transport/index.js +82 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mail-composer/index.js +629 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/index.js +441 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/mail-message.js +316 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/index.js +625 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/mime-types.js +2113 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/index.js +1316 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/last-newline.js +33 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-unix.js +43 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-windows.js +52 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/nodemailer.js +157 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/punycode/index.js +460 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/qp/index.js +227 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/sendmail-transport/index.js +210 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/ses-transport/index.js +234 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/shared/index.js +754 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/data-stream.js +108 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +143 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/index.js +1870 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/index.js +652 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +259 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-transport/index.js +421 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/stream-transport/index.js +135 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/index.js +47 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/services.json +611 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/xoauth2/index.js +427 -0
- package/packages/mailx-send/mailsend/node_modules/nodemailer/package.json +47 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/LICENSE +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/README.md +6 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/agent.d.ts +31 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/api.d.ts +43 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/balanced-pool.d.ts +29 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/cache.d.ts +36 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/client.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/connector.d.ts +34 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/content-type.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/cookies.d.ts +28 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/dispatcher.d.ts +256 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/errors.d.ts +149 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/eventsource.d.ts +61 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/fetch.d.ts +209 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/file.d.ts +39 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/filereader.d.ts +54 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/formdata.d.ts +108 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-origin.d.ts +7 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/handlers.d.ts +15 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/header.d.ts +4 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/index.d.ts +71 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/interceptors.d.ts +17 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-agent.d.ts +50 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-client.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-interceptor.d.ts +93 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-pool.d.ts +25 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/package.json +55 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/patch.d.ts +33 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool.d.ts +39 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/proxy-agent.d.ts +28 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/readable.d.ts +65 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-handler.d.ts +116 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/util.d.ts +18 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/webidl.d.ts +228 -0
- package/packages/mailx-send/mailsend/node_modules/undici-types/websocket.d.ts +150 -0
- package/packages/mailx-server/index.js +1 -1
- package/packages/mailx-settings/cloud.js +12 -7
- package/packages/mailx-settings/index.js +22 -1
- package/client/.gitattributes +0 -10
- package/client/app.js.map +0 -1
- package/client/app.ts +0 -3190
- package/client/components/address-book.js.map +0 -1
- package/client/components/address-book.ts +0 -204
- package/client/components/alarms.js.map +0 -1
- package/client/components/alarms.ts +0 -276
- package/client/components/calendar-sidebar.js.map +0 -1
- package/client/components/calendar-sidebar.ts +0 -474
- package/client/components/calendar.js.map +0 -1
- package/client/components/calendar.ts +0 -211
- package/client/components/context-menu.js.map +0 -1
- package/client/components/context-menu.ts +0 -95
- package/client/components/folder-picker.js.map +0 -1
- package/client/components/folder-picker.ts +0 -127
- package/client/components/folder-tree.js.map +0 -1
- package/client/components/folder-tree.ts +0 -1069
- package/client/components/message-list.js.map +0 -1
- package/client/components/message-list.ts +0 -1129
- package/client/components/message-viewer.js.map +0 -1
- package/client/components/message-viewer.ts +0 -1257
- package/client/components/outbox-view.js.map +0 -1
- package/client/components/outbox-view.ts +0 -102
- package/client/components/tasks.js.map +0 -1
- package/client/components/tasks.ts +0 -234
- package/client/compose/compose.js.map +0 -1
- package/client/compose/compose.ts +0 -1231
- package/client/compose/editor.js.map +0 -1
- package/client/compose/editor.ts +0 -599
- package/client/compose/ghost-text.js.map +0 -1
- package/client/compose/ghost-text.ts +0 -140
- package/client/lib/android-bootstrap.js.map +0 -1
- package/client/lib/android-bootstrap.ts +0 -9
- package/client/lib/api-client.js.map +0 -1
- package/client/lib/api-client.ts +0 -439
- package/client/lib/local-service.js.map +0 -1
- package/client/lib/local-service.ts +0 -646
- package/client/lib/local-store.js.map +0 -1
- package/client/lib/local-store.ts +0 -283
- package/client/lib/message-state.js.map +0 -1
- package/client/lib/message-state.ts +0 -160
- package/client/tsconfig.json +0 -19
- package/packages/mailx-api/.gitattributes +0 -10
- package/packages/mailx-api/index.d.ts.map +0 -1
- package/packages/mailx-api/index.js.map +0 -1
- package/packages/mailx-api/index.ts +0 -283
- package/packages/mailx-api/tsconfig.json +0 -9
- package/packages/mailx-compose/.gitattributes +0 -10
- package/packages/mailx-compose/index.d.ts.map +0 -1
- package/packages/mailx-compose/index.js.map +0 -1
- package/packages/mailx-compose/index.ts +0 -85
- package/packages/mailx-compose/tsconfig.json +0 -9
- package/packages/mailx-host/.gitattributes +0 -10
- package/packages/mailx-host/index.d.ts +0 -21
- package/packages/mailx-host/index.d.ts.map +0 -1
- package/packages/mailx-host/index.js +0 -29
- package/packages/mailx-host/index.js.map +0 -1
- package/packages/mailx-host/index.ts +0 -38
- package/packages/mailx-host/package.json +0 -23
- package/packages/mailx-host/tsconfig.json +0 -9
- package/packages/mailx-host/types-shim.d.ts +0 -14
- package/packages/mailx-imap/.gitattributes +0 -10
- package/packages/mailx-imap/index.d.ts +0 -442
- package/packages/mailx-imap/index.d.ts.map +0 -1
- package/packages/mailx-imap/index.js +0 -3684
- package/packages/mailx-imap/index.js.map +0 -1
- package/packages/mailx-imap/index.ts +0 -3652
- package/packages/mailx-imap/package-lock.json +0 -131
- package/packages/mailx-imap/package.json +0 -28
- package/packages/mailx-imap/providers/gmail-api.d.ts +0 -8
- package/packages/mailx-imap/providers/gmail-api.d.ts.map +0 -1
- package/packages/mailx-imap/providers/gmail-api.js +0 -8
- package/packages/mailx-imap/providers/gmail-api.js.map +0 -1
- package/packages/mailx-imap/providers/gmail-api.ts +0 -8
- package/packages/mailx-imap/providers/outlook-api.ts +0 -7
- package/packages/mailx-imap/providers/types.d.ts +0 -9
- package/packages/mailx-imap/providers/types.d.ts.map +0 -1
- package/packages/mailx-imap/providers/types.js +0 -9
- package/packages/mailx-imap/providers/types.js.map +0 -1
- package/packages/mailx-imap/providers/types.ts +0 -9
- package/packages/mailx-imap/tsconfig.json +0 -9
- package/packages/mailx-imap/tsconfig.tsbuildinfo +0 -1
- package/packages/mailx-send/.gitattributes +0 -10
- package/packages/mailx-send/cli-queue.d.ts.map +0 -1
- package/packages/mailx-send/cli-queue.js.map +0 -1
- package/packages/mailx-send/cli-queue.ts +0 -62
- package/packages/mailx-send/cli-send.d.ts.map +0 -1
- package/packages/mailx-send/cli-send.js.map +0 -1
- package/packages/mailx-send/cli-send.ts +0 -83
- package/packages/mailx-send/cli.d.ts.map +0 -1
- package/packages/mailx-send/cli.js.map +0 -1
- package/packages/mailx-send/cli.ts +0 -126
- package/packages/mailx-send/index.d.ts.map +0 -1
- package/packages/mailx-send/index.js.map +0 -1
- package/packages/mailx-send/index.ts +0 -333
- package/packages/mailx-send/mailsend/cli.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/cli.js.map +0 -1
- package/packages/mailx-send/mailsend/cli.ts +0 -81
- package/packages/mailx-send/mailsend/index.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/index.js.map +0 -1
- package/packages/mailx-send/mailsend/index.ts +0 -333
- package/packages/mailx-send/mailsend/tsconfig.json +0 -21
- package/packages/mailx-send/package-lock.json +0 -65
- package/packages/mailx-send/tsconfig.json +0 -21
- package/packages/mailx-server/.gitattributes +0 -10
- package/packages/mailx-server/index.d.ts.map +0 -1
- package/packages/mailx-server/index.js.map +0 -1
- package/packages/mailx-server/index.ts +0 -429
- package/packages/mailx-server/tsconfig.json +0 -9
- package/packages/mailx-settings/.gitattributes +0 -10
- package/packages/mailx-settings/cloud.d.ts.map +0 -1
- package/packages/mailx-settings/cloud.js.map +0 -1
- package/packages/mailx-settings/cloud.ts +0 -388
- package/packages/mailx-settings/index.d.ts.map +0 -1
- package/packages/mailx-settings/index.js.map +0 -1
- package/packages/mailx-settings/index.ts +0 -892
- package/packages/mailx-settings/tsconfig.json +0 -9
- package/packages/mailx-store/.gitattributes +0 -10
- package/packages/mailx-store/db.d.ts.map +0 -1
- package/packages/mailx-store/db.js.map +0 -1
- package/packages/mailx-store/db.ts +0 -2007
- package/packages/mailx-store/file-store.d.ts.map +0 -1
- package/packages/mailx-store/file-store.js.map +0 -1
- package/packages/mailx-store/file-store.ts +0 -82
- package/packages/mailx-store/index.d.ts.map +0 -1
- package/packages/mailx-store/index.js.map +0 -1
- package/packages/mailx-store/index.ts +0 -7
- package/packages/mailx-store/tsconfig.json +0 -9
- package/packages/mailx-types/.gitattributes +0 -10
- package/packages/mailx-types/index.d.ts.map +0 -1
- package/packages/mailx-types/index.js.map +0 -1
- package/packages/mailx-types/index.ts +0 -498
- package/packages/mailx-types/tsconfig.json +0 -9
package/bin/mailx.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* rmfmail -- email client
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
6
|
+
* rmfmail Start service + open in msger (IPC, no TCP)
|
|
7
|
+
* rmfmail --server Start Express HTTP server (dev/remote)
|
|
8
|
+
* rmfmail --no-browser Start server only (headless)
|
|
9
|
+
* rmfmail --verbose Show console output (default: log file only)
|
|
10
|
+
* rmfmail --email <addr> First-time setup with email (skips prompt)
|
|
11
|
+
* rmfmail --import <file> Import accounts.jsonc into GDrive and merge
|
|
12
|
+
* rmfmail -v / --version Show version and exit
|
|
13
|
+
* rmfmail -kill Kill running rmfmail processes
|
|
14
|
+
* rmfmail -setup Interactive first-time setup (CLI)
|
|
15
|
+
* rmfmail -test Test IMAP/SMTP connectivity
|
|
16
|
+
* rmfmail -rebuild Wipe local cache, re-sync from IMAP
|
|
17
|
+
* rmfmail -repair Re-sync metadata (fix corrupt subjects) keeping .eml files
|
|
18
|
+
* rmfmail -reauth Clear cached OAuth tokens; next start re-consents
|
|
19
19
|
* (use when new Google scopes have been added)
|
|
20
20
|
*/
|
|
21
21
|
|
|
@@ -26,7 +26,7 @@ import net from "node:net";
|
|
|
26
26
|
import { ports } from "@bobfrankston/miscinfo";
|
|
27
27
|
import { showMessageBox, showService, setAppName, setAppIcon } from "@bobfrankston/mailx-host";
|
|
28
28
|
|
|
29
|
-
setAppName("
|
|
29
|
+
setAppName("rmfmail");
|
|
30
30
|
// Prefer the .ico (Windows Explorer / taskbar-pin shortcut uses the embedded
|
|
31
31
|
// icon resource of the pinned exe, or a Windows icon resource referenced
|
|
32
32
|
// via PKEY_AppUserModel_RelaunchIconResource — PNG can't play either role).
|
|
@@ -51,7 +51,7 @@ const __selfVersion: string = (() => {
|
|
|
51
51
|
try { return JSON.parse(fs.readFileSync(path.join(__selfRoot, "package.json"), "utf-8")).version || "unknown"; }
|
|
52
52
|
catch { return "unknown"; }
|
|
53
53
|
})();
|
|
54
|
-
const __instanceFile = path.join(process.env.USERPROFILE || process.env.HOME || ".", ".
|
|
54
|
+
const __instanceFile = path.join(process.env.USERPROFILE || process.env.HOME || ".", ".rmfmail", "instance.json");
|
|
55
55
|
|
|
56
56
|
function readInstanceFile(): { pid: number; version: string; startedAt: number } | null {
|
|
57
57
|
try {
|
|
@@ -73,8 +73,8 @@ function clearInstanceFile(): void {
|
|
|
73
73
|
function pidAlive(pid: number): boolean {
|
|
74
74
|
try { process.kill(pid, 0); return true; } catch { return false; }
|
|
75
75
|
}
|
|
76
|
-
/** True only if `pid` is alive AND its command line looks like a
|
|
77
|
-
* process. Windows reuses PIDs aggressively — a
|
|
76
|
+
/** True only if `pid` is alive AND its command line looks like a rmfmail node
|
|
77
|
+
* process. Windows reuses PIDs aggressively — a rmfmail that exited without
|
|
78
78
|
* running its cleanup handler can leave behind an instance.json whose PID
|
|
79
79
|
* has since been recycled by some other app (e.g. Creative Cloud UI Helper),
|
|
80
80
|
* making bare pidAlive() return true and wedging every subsequent `mailx`
|
|
@@ -89,7 +89,7 @@ function pidIsMailx(pid: number): boolean {
|
|
|
89
89
|
`powershell -NoProfile -Command "(Get-CimInstance Win32_Process -Filter \\"ProcessId=${pid}\\").CommandLine"`,
|
|
90
90
|
{ encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"], windowsHide: true },
|
|
91
91
|
).toString();
|
|
92
|
-
return /mailx[\\\/](?:bin|packages|app)|mailx-server/i.test(out);
|
|
92
|
+
return /(?:rmfmail|mailx)[\\\/](?:bin|packages|app)|mailx-server/i.test(out);
|
|
93
93
|
} catch { return false; }
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -105,7 +105,7 @@ if (!isDaemon && !__isCommandInvocation) {
|
|
|
105
105
|
const inst = readInstanceFile();
|
|
106
106
|
if (inst && pidIsMailx(inst.pid)) {
|
|
107
107
|
if (inst.version !== __selfVersion) {
|
|
108
|
-
console.log(`
|
|
108
|
+
console.log(`rmfmail: upgrading running daemon (PID ${inst.pid}) from v${inst.version} → v${__selfVersion}`);
|
|
109
109
|
try { process.kill(inst.pid, "SIGTERM"); } catch { /* already gone */ }
|
|
110
110
|
// Give it ~1.5s to exit gracefully, then verify
|
|
111
111
|
const deadline = Date.now() + 2000;
|
|
@@ -120,7 +120,7 @@ if (!isDaemon && !__isCommandInvocation) {
|
|
|
120
120
|
} else {
|
|
121
121
|
// Same version already running — nothing to do. Print so the user
|
|
122
122
|
// knows why `mailx` seems to have done nothing.
|
|
123
|
-
console.log(`
|
|
123
|
+
console.log(`rmfmail v${__selfVersion} is already running (PID ${inst.pid}). Use rmfmail -kill to stop it.`);
|
|
124
124
|
process.exit(0);
|
|
125
125
|
}
|
|
126
126
|
} else if (inst) {
|
|
@@ -158,12 +158,12 @@ for (const arg of args) {
|
|
|
158
158
|
const flag = arg.replace(/^--?/, "");
|
|
159
159
|
if (arg.startsWith("-") && !knownFlags.includes(flag)) {
|
|
160
160
|
console.error(`Unknown option: ${arg}`);
|
|
161
|
-
console.error("Usage:
|
|
161
|
+
console.error("Usage: rmfmail [-verbose] [-kill] [-rebuild] [-v] [-setup]");
|
|
162
162
|
process.exit(1);
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
function log(...msg: any[]): void { if (verbose) console.log("[
|
|
166
|
+
function log(...msg: any[]): void { if (verbose) console.log("[rmfmail]", ...msg); }
|
|
167
167
|
|
|
168
168
|
/** Detect whether we're running with administrator / root privileges.
|
|
169
169
|
* Windows: `net session` requires admin — succeeds silently when elevated,
|
|
@@ -190,12 +190,12 @@ function isElevated(): boolean {
|
|
|
190
190
|
* safety. Caller decides what to do with "Continue anyway". */
|
|
191
191
|
async function warnElevated(): Promise<string> {
|
|
192
192
|
const res = await showMessageBox({
|
|
193
|
-
title: "
|
|
193
|
+
title: "rmfmail — elevated run not recommended",
|
|
194
194
|
message:
|
|
195
|
-
"
|
|
195
|
+
"rmfmail is running with Administrator privileges.\n\n" +
|
|
196
196
|
"This can corrupt the per-user WebView2 profile at\n" +
|
|
197
197
|
"%LOCALAPPDATA%\\msger\\webview2\\ and create admin-owned files\n" +
|
|
198
|
-
"under ~/.
|
|
198
|
+
"under ~/.rmfmail/ that later non-admin runs can't write to\n" +
|
|
199
199
|
"(SQLite db, tokens, config).\n\n" +
|
|
200
200
|
"Quit, relaunch from a normal shell, and only use admin if\n" +
|
|
201
201
|
"you specifically know you need it. To bypass this warning\n" +
|
|
@@ -207,9 +207,9 @@ async function warnElevated(): Promise<string> {
|
|
|
207
207
|
return res.button;
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
// Kill any running
|
|
210
|
+
// Kill any running rmfmail server
|
|
211
211
|
if (hasFlag("kill")) {
|
|
212
|
-
log("Killing
|
|
212
|
+
log("Killing rmfmail processes...");
|
|
213
213
|
const { execSync } = await import("node:child_process");
|
|
214
214
|
let killed = 0;
|
|
215
215
|
|
|
@@ -230,30 +230,33 @@ if (hasFlag("kill")) {
|
|
|
230
230
|
}
|
|
231
231
|
} catch { /* no process on port */ }
|
|
232
232
|
|
|
233
|
-
// Kill any node.exe running
|
|
233
|
+
// Kill any node.exe running rmfmail (server or IPC service). Match
|
|
234
|
+
// the legacy `mailx` path too — source tree dir is still
|
|
235
|
+
// `Y:\dev\email\mailx\` and per-app exes from older installs are
|
|
236
|
+
// under `%LOCALAPPDATA%\mailx\` until those get cleaned up.
|
|
234
237
|
try {
|
|
235
238
|
const ps = execSync(
|
|
236
|
-
`powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name='node.exe'\\" | Where-Object { $_.CommandLine -match 'mailx-server|mailx\\\\packages|mailx\\\\bin' } | Select-Object -ExpandProperty ProcessId"`,
|
|
239
|
+
`powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name='node.exe'\\" | Where-Object { $_.CommandLine -match '(rmfmail|mailx)-server|(rmfmail|mailx)\\\\packages|(rmfmail|mailx)\\\\bin' } | Select-Object -ExpandProperty ProcessId"`,
|
|
237
240
|
{ encoding: "utf-8" }
|
|
238
241
|
).trim();
|
|
239
242
|
for (const pid of ps.split("\n").map(s => s.trim()).filter(s => /^\d+$/.test(s))) {
|
|
240
|
-
try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (
|
|
243
|
+
try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (rmfmail node process)`); killed++; } catch { /* */ }
|
|
241
244
|
}
|
|
242
245
|
} catch { /* */ }
|
|
243
246
|
|
|
244
247
|
// Kill orphaned msgernative.exe windows. When the node process dies
|
|
245
248
|
// without cascade-killing its WebView child (old crash, forced
|
|
246
249
|
// taskkill, etc.), the msgernative.exe stays on screen and looks
|
|
247
|
-
// like a live
|
|
248
|
-
// Scoped to exes launched for
|
|
249
|
-
// touch msger windows started by other apps (msga, bbs, etc.).
|
|
250
|
+
// like a live rmfmail. rmfmail -kill should leave no trace.
|
|
251
|
+
// Scoped to exes launched for rmfmail by filtering CommandLine —
|
|
252
|
+
// don't touch msger windows started by other apps (msga, bbs, etc.).
|
|
250
253
|
try {
|
|
251
254
|
const ps = execSync(
|
|
252
|
-
`powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name='msgernative.exe'\\" | Where-Object { $_.CommandLine -match 'mailx' -or $_.Path -match 'mailx' } | Select-Object -ExpandProperty ProcessId"`,
|
|
255
|
+
`powershell -NoProfile -Command "Get-CimInstance Win32_Process -Filter \\"name='msgernative.exe'\\" | Where-Object { $_.CommandLine -match 'rmfmail|mailx' -or $_.Path -match 'rmfmail|mailx' } | Select-Object -ExpandProperty ProcessId"`,
|
|
253
256
|
{ encoding: "utf-8" }
|
|
254
257
|
).trim();
|
|
255
258
|
for (const pid of ps.split("\n").map(s => s.trim()).filter(s => /^\d+$/.test(s))) {
|
|
256
|
-
try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (
|
|
259
|
+
try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (rmfmail msgernative/WebView)`); killed++; } catch { /* */ }
|
|
257
260
|
}
|
|
258
261
|
} catch { /* */ }
|
|
259
262
|
} else {
|
|
@@ -261,7 +264,7 @@ if (hasFlag("kill")) {
|
|
|
261
264
|
}
|
|
262
265
|
|
|
263
266
|
// Clean up stale SQLite WAL/SHM files
|
|
264
|
-
const mailxDir = path.join(process.env.USERPROFILE || process.env.HOME || ".", ".
|
|
267
|
+
const mailxDir = path.join(process.env.USERPROFILE || process.env.HOME || ".", ".rmfmail");
|
|
265
268
|
for (const ext of ["mailx.db-shm", "mailx.db-wal"]) {
|
|
266
269
|
const p = path.join(mailxDir, ext);
|
|
267
270
|
try { fs.unlinkSync(p); log(`Cleaned ${ext}`); } catch { /* */ }
|
|
@@ -274,7 +277,7 @@ if (hasFlag("kill")) {
|
|
|
274
277
|
// is the user's escape hatch; leave no lock behind.
|
|
275
278
|
clearInstanceFile();
|
|
276
279
|
|
|
277
|
-
if (killed === 0) console.log("No
|
|
280
|
+
if (killed === 0) console.log("No rmfmail processes found");
|
|
278
281
|
process.exit(0);
|
|
279
282
|
}
|
|
280
283
|
|
|
@@ -306,7 +309,7 @@ if (hasFlag("reauth")) {
|
|
|
306
309
|
}
|
|
307
310
|
console.log(cleared === 0
|
|
308
311
|
? "No cached tokens found."
|
|
309
|
-
: `Cleared ${cleared} cached token(s). Next '
|
|
312
|
+
: `Cleared ${cleared} cached token(s). Next 'rmfmail' start will open a browser OAuth consent so the new scopes (tasks, full contacts) get granted.`);
|
|
310
313
|
process.exit(0);
|
|
311
314
|
}
|
|
312
315
|
|
|
@@ -316,7 +319,7 @@ if (rebuildMode) {
|
|
|
316
319
|
const dbDir = getConfigDir();
|
|
317
320
|
const storePath = getStorePath();
|
|
318
321
|
|
|
319
|
-
console.log("Rebuilding
|
|
322
|
+
console.log("Rebuilding rmfmail local cache...");
|
|
320
323
|
console.log(" Accounts and settings will be preserved.");
|
|
321
324
|
|
|
322
325
|
// Remove DB files
|
|
@@ -331,7 +334,7 @@ if (rebuildMode) {
|
|
|
331
334
|
console.log(` Deleted message store`);
|
|
332
335
|
}
|
|
333
336
|
|
|
334
|
-
console.log(" Rebuild complete. Run '
|
|
337
|
+
console.log(" Rebuild complete. Run 'rmfmail' to start fresh.");
|
|
335
338
|
process.exit(0);
|
|
336
339
|
}
|
|
337
340
|
|
|
@@ -342,11 +345,11 @@ if (repairMode) {
|
|
|
342
345
|
const dbPath = path.join(dbDir, "mailx.db");
|
|
343
346
|
|
|
344
347
|
if (!fs.existsSync(dbPath)) {
|
|
345
|
-
console.error("No database found. Run '
|
|
348
|
+
console.error("No database found. Run 'rmfmail' first to create one.");
|
|
346
349
|
process.exit(1);
|
|
347
350
|
}
|
|
348
351
|
|
|
349
|
-
console.log("Repairing
|
|
352
|
+
console.log("Repairing rmfmail metadata...");
|
|
350
353
|
console.log(" Message bodies (.eml files) will be preserved.");
|
|
351
354
|
console.log(" Clearing message metadata for re-sync...");
|
|
352
355
|
|
|
@@ -364,7 +367,7 @@ if (repairMode) {
|
|
|
364
367
|
db.close();
|
|
365
368
|
|
|
366
369
|
console.log(` Cleared ${count} message entries. Folder sync state reset.`);
|
|
367
|
-
console.log(" Run '
|
|
370
|
+
console.log(" Run 'rmfmail' to re-sync from IMAP with correct encoding.");
|
|
368
371
|
process.exit(0);
|
|
369
372
|
}
|
|
370
373
|
|
|
@@ -372,9 +375,9 @@ if (repairMode) {
|
|
|
372
375
|
if (importMode) {
|
|
373
376
|
const importPath = args.find(a => !a.startsWith("-"));
|
|
374
377
|
if (!importPath) {
|
|
375
|
-
console.error("Usage:
|
|
378
|
+
console.error("Usage: rmfmail --import <path-to-accounts.jsonc>");
|
|
376
379
|
console.error(" Reads accounts from a local file and saves to Google Drive.");
|
|
377
|
-
console.error(" Example:
|
|
380
|
+
console.error(" Example: rmfmail --import ~/OneDrive/home/.rmfmail/accounts.jsonc");
|
|
378
381
|
process.exit(1);
|
|
379
382
|
}
|
|
380
383
|
const { parse: parseJsonc } = await import("jsonc-parser");
|
|
@@ -411,7 +414,7 @@ if (importMode) {
|
|
|
411
414
|
const wrapper: any = { accounts: merged };
|
|
412
415
|
if (data?.name) wrapper.name = data.name;
|
|
413
416
|
await saveAccounts(merged);
|
|
414
|
-
console.log(`Saved ${merged.length} account(s). Run '
|
|
417
|
+
console.log(`Saved ${merged.length} account(s). Run 'rmfmail' to start.`);
|
|
415
418
|
process.exit(0);
|
|
416
419
|
}
|
|
417
420
|
|
|
@@ -429,8 +432,8 @@ if (hasFlag("v") || hasFlag("version")) {
|
|
|
429
432
|
};
|
|
430
433
|
try {
|
|
431
434
|
const pkg = JSON.parse(fs.readFileSync(`${root}/package.json`, "utf-8"));
|
|
432
|
-
console.log(`\x1b[1;97;44m
|
|
433
|
-
} catch { console.log("
|
|
435
|
+
console.log(`\x1b[1;97;44m rmfmail v${pkg.version} \x1b[0m`);
|
|
436
|
+
} catch { console.log("rmfmail (version unknown)"); }
|
|
434
437
|
console.log(` node ${process.version}`);
|
|
435
438
|
console.log(` iflow-direct ${ver("@bobfrankston/iflow-direct")}`);
|
|
436
439
|
console.log(` miscinfo ${ver("@bobfrankston/miscinfo")}`);
|
|
@@ -474,10 +477,10 @@ interface AccountInput {
|
|
|
474
477
|
smtp?: { host: string; port?: number };
|
|
475
478
|
}
|
|
476
479
|
|
|
477
|
-
/** Check if
|
|
480
|
+
/** Check if rmfmail is configured (has local config or accounts) */
|
|
478
481
|
function hasConfig(): boolean {
|
|
479
482
|
const home = process.env.USERPROFILE || process.env.HOME || "";
|
|
480
|
-
const mailxDir = path.join(home, ".
|
|
483
|
+
const mailxDir = path.join(home, ".rmfmail");
|
|
481
484
|
for (const f of ["config.jsonc", "accounts.jsonc", "settings.jsonc"]) {
|
|
482
485
|
if (fs.existsSync(path.join(mailxDir, f))) return true;
|
|
483
486
|
}
|
|
@@ -591,10 +594,10 @@ async function promptForAccount(intro?: string): Promise<AccountInput | null> {
|
|
|
591
594
|
* Returns true if an account was added (caller should proceed to launch UI),
|
|
592
595
|
* false if the user skipped (UI's in-browser setup form will take over). */
|
|
593
596
|
async function runSetup(providedEmail?: string): Promise<boolean> {
|
|
594
|
-
console.log("\
|
|
597
|
+
console.log("\nrmfmail— first-time setup\n");
|
|
595
598
|
|
|
596
599
|
const home = process.env.USERPROFILE || process.env.HOME || "";
|
|
597
|
-
const mailxDir = path.join(home, ".
|
|
600
|
+
const mailxDir = path.join(home, ".rmfmail");
|
|
598
601
|
fs.mkdirSync(mailxDir, { recursive: true });
|
|
599
602
|
|
|
600
603
|
// Use --email flag or prompt interactively
|
|
@@ -622,12 +625,12 @@ async function runSetup(providedEmail?: string): Promise<boolean> {
|
|
|
622
625
|
// For Google-hosted accounts, check Drive for existing settings first
|
|
623
626
|
let driveFolderId: string | null = null;
|
|
624
627
|
if (isGoogle) {
|
|
625
|
-
console.log("\nChecking Google Drive for existing
|
|
628
|
+
console.log("\nChecking Google Drive for existing rmfmail settings...");
|
|
626
629
|
try {
|
|
627
630
|
const { gDriveFindOrCreateFolder, getCloudProvider } = await import("@bobfrankston/mailx-settings/cloud.js");
|
|
628
631
|
driveFolderId = await gDriveFindOrCreateFolder();
|
|
629
632
|
if (driveFolderId) {
|
|
630
|
-
console.log(` Drive folder: My Drive/
|
|
633
|
+
console.log(` Drive folder: My Drive/rmfmail/ (${driveFolderId})`);
|
|
631
634
|
const gdrive = getCloudProvider("gdrive", driveFolderId);
|
|
632
635
|
if (gdrive) {
|
|
633
636
|
// Read accounts.jsonc (canonical) — ignore legacy settings.jsonc
|
|
@@ -637,18 +640,18 @@ async function runSetup(providedEmail?: string): Promise<boolean> {
|
|
|
637
640
|
const data = parseJsonc(existing);
|
|
638
641
|
const accts = data?.accounts || (Array.isArray(data) ? data : []);
|
|
639
642
|
if (accts.length > 0) {
|
|
640
|
-
console.log(`\nFound ${accts.length} existing account(s) on Google Drive (My Drive/
|
|
643
|
+
console.log(`\nFound ${accts.length} existing account(s) on Google Drive (My Drive/rmfmail/accounts.jsonc):`);
|
|
641
644
|
for (const a of accts) console.log(` • ${a.label || a.name || a.email}`);
|
|
642
645
|
// Save config pointing to Drive — no prompts needed
|
|
643
|
-
const config = { sharedDir: { provider: "gdrive", path: "
|
|
646
|
+
const config = { sharedDir: { provider: "gdrive", path: "rmfmail", folderId: driveFolderId } };
|
|
644
647
|
fs.writeFileSync(path.join(mailxDir, "config.jsonc"), JSON.stringify(config, null, 2));
|
|
645
|
-
console.log("Local config created. Starting
|
|
648
|
+
console.log("Local config created. Starting rmfmail...\n");
|
|
646
649
|
return true;
|
|
647
650
|
}
|
|
648
651
|
}
|
|
649
652
|
}
|
|
650
653
|
// No existing accounts — save Drive config for later
|
|
651
|
-
const config = { sharedDir: { provider: "gdrive", path: "
|
|
654
|
+
const config = { sharedDir: { provider: "gdrive", path: "rmfmail", folderId: driveFolderId } };
|
|
652
655
|
fs.writeFileSync(path.join(mailxDir, "config.jsonc"), JSON.stringify(config, null, 2));
|
|
653
656
|
} else {
|
|
654
657
|
console.log(" Could not access Google Drive (OAuth not granted or token expired).");
|
|
@@ -696,13 +699,13 @@ async function runSetup(providedEmail?: string): Promise<boolean> {
|
|
|
696
699
|
console.log(` Skipping Drive sync (no folder ID). Local copy at ${localAccountsPath}.`);
|
|
697
700
|
}
|
|
698
701
|
|
|
699
|
-
console.log("Setup complete. Starting
|
|
702
|
+
console.log("Setup complete. Starting rmfmail...\n");
|
|
700
703
|
return true;
|
|
701
704
|
}
|
|
702
705
|
|
|
703
706
|
/** Test account connectivity — IMAP connect, SMTP send, sync round-trip */
|
|
704
707
|
async function runTest(): Promise<void> {
|
|
705
|
-
console.log("\
|
|
708
|
+
console.log("\nrmfmail— connection test\n");
|
|
706
709
|
|
|
707
710
|
// Start server in-process to access settings
|
|
708
711
|
console.log("Loading settings...");
|
|
@@ -711,7 +714,7 @@ async function runTest(): Promise<void> {
|
|
|
711
714
|
const settings = loadSettings();
|
|
712
715
|
|
|
713
716
|
if (settings.accounts.length === 0) {
|
|
714
|
-
console.log("No accounts configured. Run:
|
|
717
|
+
console.log("No accounts configured. Run: rmfmail -setup");
|
|
715
718
|
process.exit(1);
|
|
716
719
|
}
|
|
717
720
|
|
|
@@ -771,12 +774,12 @@ async function runTest(): Promise<void> {
|
|
|
771
774
|
console.log(` SMTP: OK`);
|
|
772
775
|
|
|
773
776
|
// Send test message to self
|
|
774
|
-
const testSubject = `
|
|
777
|
+
const testSubject = `rmfmail test — ${new Date().toLocaleString()}`;
|
|
775
778
|
await transport.sendMail({
|
|
776
779
|
from: `${account.name} <${account.email}>`,
|
|
777
780
|
to: account.email,
|
|
778
781
|
subject: testSubject,
|
|
779
|
-
text: `This is a test message from
|
|
782
|
+
text: `This is a test message from rmfmail -test.\nSent: ${new Date().toISOString()}\nAccount: ${account.id}`,
|
|
780
783
|
});
|
|
781
784
|
console.log(` SEND: OK — test message sent to ${account.email}`);
|
|
782
785
|
console.log(` Subject: "${testSubject}"`);
|
|
@@ -803,7 +806,7 @@ async function registerClient(settings: any): Promise<void> {
|
|
|
803
806
|
if (info.mode === "local" || !info.provider || info.provider === "local") return;
|
|
804
807
|
|
|
805
808
|
// Device ID: stable per machine, stored locally
|
|
806
|
-
const deviceIdPath = path.join(os.homedir(), ".
|
|
809
|
+
const deviceIdPath = path.join(os.homedir(), ".rmfmail", "device-id");
|
|
807
810
|
let deviceId: string;
|
|
808
811
|
if (fs.existsSync(deviceIdPath)) {
|
|
809
812
|
deviceId = fs.readFileSync(deviceIdPath, "utf-8").trim();
|
|
@@ -859,7 +862,7 @@ async function main(): Promise<void> {
|
|
|
859
862
|
|
|
860
863
|
// Refuse to run elevated unless explicitly opted in. An elevated mailx
|
|
861
864
|
// can poison %LOCALAPPDATA%\msger\webview2\ (see msger/notes.md WebView2
|
|
862
|
-
// profile playbook) and create admin-owned files under ~/.
|
|
865
|
+
// profile playbook) and create admin-owned files under ~/.rmfmail/ that
|
|
863
866
|
// later non-admin runs can't write to. `net session` requires admin on
|
|
864
867
|
// Windows; succeeds → admin, fails → non-admin. Linux/Mac use process
|
|
865
868
|
// uid (0 = root). --allow-elevated bypasses for scripted admin use.
|
|
@@ -883,7 +886,7 @@ async function main(): Promise<void> {
|
|
|
883
886
|
const account = await promptForAccount();
|
|
884
887
|
if (account) {
|
|
885
888
|
const home = process.env.USERPROFILE || process.env.HOME || "";
|
|
886
|
-
const mailxDir = path.join(home, ".
|
|
889
|
+
const mailxDir = path.join(home, ".rmfmail");
|
|
887
890
|
const settingsPath = path.join(mailxDir, "settings.jsonc");
|
|
888
891
|
let settings: any;
|
|
889
892
|
try { settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8").replace(/\r/g, "").replace(/\/\/.*/g, "")); } catch { settings = { accounts: [] }; }
|
|
@@ -891,7 +894,7 @@ async function main(): Promise<void> {
|
|
|
891
894
|
settings.accounts.push(account);
|
|
892
895
|
fs.mkdirSync(mailxDir, { recursive: true });
|
|
893
896
|
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
894
|
-
console.log(`Added ${account.email} to settings. Restart
|
|
897
|
+
console.log(`Added ${account.email} to settings. Restart rmfmail to connect.`);
|
|
895
898
|
}
|
|
896
899
|
process.exit(0);
|
|
897
900
|
}
|
|
@@ -903,7 +906,7 @@ async function main(): Promise<void> {
|
|
|
903
906
|
// takes over in that case.
|
|
904
907
|
const hasTty = setupMode ? !!process.stdin.isTTY : (process.stdin.isTTY === true);
|
|
905
908
|
if (setupMode || !hasConfig()) {
|
|
906
|
-
if (!setupMode) console.log("No
|
|
909
|
+
if (!setupMode) console.log("No rmfmail configuration found.");
|
|
907
910
|
// -email or -mail flag skips the interactive prompt
|
|
908
911
|
const emailFlag = args.findIndex(a => a === "-email" || a === "--email" || a === "-mail" || a === "--mail");
|
|
909
912
|
const emailArg = args.find(a => a.startsWith("-email=") || a.startsWith("--email=") || a.startsWith("-mail=") || a.startsWith("--mail="))?.split("=")[1]
|
|
@@ -914,14 +917,14 @@ async function main(): Promise<void> {
|
|
|
914
917
|
console.log("No TTY and no -email flag — skipping CLI setup; in-browser setup form will appear.");
|
|
915
918
|
// Ensure the data dir exists so the UI can write its config.
|
|
916
919
|
const home = process.env.USERPROFILE || process.env.HOME || "";
|
|
917
|
-
fs.mkdirSync(path.join(home, ".
|
|
920
|
+
fs.mkdirSync(path.join(home, ".rmfmail"), { recursive: true });
|
|
918
921
|
}
|
|
919
922
|
}
|
|
920
923
|
|
|
921
924
|
// Redirect console to log file — keep terminal clean
|
|
922
925
|
if (!verbose) {
|
|
923
926
|
const home = process.env.USERPROFILE || process.env.HOME || ".";
|
|
924
|
-
const logDir = path.join(home, ".
|
|
927
|
+
const logDir = path.join(home, ".rmfmail", "logs");
|
|
925
928
|
fs.mkdirSync(logDir, { recursive: true });
|
|
926
929
|
// Prune logs older than LOG_RETENTION_DAYS on startup. Keep it simple:
|
|
927
930
|
// scan the dir, stat, delete. Cheap even with years of history.
|
|
@@ -961,7 +964,7 @@ async function main(): Promise<void> {
|
|
|
961
964
|
}
|
|
962
965
|
|
|
963
966
|
// IPC service mode — no HTTP server
|
|
964
|
-
console.log("Starting
|
|
967
|
+
console.log("Starting rmfmail service...");
|
|
965
968
|
const { MailxDB } = await import("@bobfrankston/mailx-store");
|
|
966
969
|
const { ImapManager } = await import("@bobfrankston/mailx-imap");
|
|
967
970
|
const { MailxService } = await import("@bobfrankston/mailx-service");
|
|
@@ -986,14 +989,14 @@ async function main(): Promise<void> {
|
|
|
986
989
|
const sendingDir = path.join(getConfigDir(), "sending");
|
|
987
990
|
fs.mkdirSync(sendingDir, { recursive: true });
|
|
988
991
|
const readmePath = path.join(sendingDir, "README.md");
|
|
989
|
-
const readmeBody = `# \`~/.
|
|
992
|
+
const readmeBody = `# \`~/.rmfmail/sending/\` and \`~/.rmfmail/outbox/\` — outgoing-mail staging
|
|
990
993
|
|
|
991
|
-
Auto-generated by
|
|
994
|
+
Auto-generated by rmfmail on startup. Manual recovery reference for when rmfmail is broken or you need to feed an outgoing message into another mail program.
|
|
992
995
|
|
|
993
996
|
## Layout
|
|
994
997
|
|
|
995
998
|
\`\`\`
|
|
996
|
-
~/.
|
|
999
|
+
~/.rmfmail/
|
|
997
1000
|
├── outbox/<account>/
|
|
998
1001
|
│ └── *.ltr ← THE QUEUE. Worker scans every 10s, sends, deletes on success.
|
|
999
1002
|
└── sending/<account>/
|
|
@@ -1002,13 +1005,13 @@ Auto-generated by mailx on startup. Manual recovery reference for when mailx is
|
|
|
1002
1005
|
└── sent/ ← Audit trail of successfully sent messages.
|
|
1003
1006
|
\`\`\`
|
|
1004
1007
|
|
|
1005
|
-
In-flight files are atomically renamed to \`<file>.sending-<host>-<pid>\` while the worker is processing them — same-machine claim so two
|
|
1008
|
+
In-flight files are atomically renamed to \`<file>.sending-<host>-<pid>\` while the worker is processing them — same-machine claim so two rmfmail instances don't double-send. Stale claims (dead PIDs on this host) are recovered on the next tick.
|
|
1006
1009
|
|
|
1007
1010
|
## Manual fallback
|
|
1008
1011
|
|
|
1009
|
-
- **
|
|
1012
|
+
- **rmfmail is dead, need to send a draft** — most recent file in \`sending/<account>/editing/\` is a complete RFC 822 message; copy the body into another mail client and resend.
|
|
1010
1013
|
- **Feed a raw .eml to mailx** — drop into \`sending/<account>/queued/\`. Picked up within 10s.
|
|
1011
|
-
- **
|
|
1014
|
+
- **rmfmail says queued but server doesn't have it** — look in \`outbox/<account>/\`. \`.ltr\` still there → worker hasn't sent yet (check \`~/.rmfmail/logs/\`). \`.sending-<host>-<pid>\` → in flight. Gone → success.
|
|
1012
1015
|
|
|
1013
1016
|
## Format
|
|
1014
1017
|
|
|
@@ -1080,15 +1083,15 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
|
|
|
1080
1083
|
const __mailxJs = path.join(import.meta.dirname, "mailx.js");
|
|
1081
1084
|
const __relaunchCommand = `"${process.execPath}" "${__mailxJs}"`;
|
|
1082
1085
|
const handle = showService({
|
|
1083
|
-
title: `
|
|
1086
|
+
title: `rmfmail v${rootPkgVersion}`,
|
|
1084
1087
|
url: "index.html",
|
|
1085
1088
|
contentDir: clientDir,
|
|
1086
1089
|
initScript: mailxapiScript,
|
|
1087
1090
|
icon: __iconPathRuntime,
|
|
1088
1091
|
relaunchIcon: __iconPathPin,
|
|
1089
1092
|
relaunchCommand: __relaunchCommand,
|
|
1090
|
-
relaunchDisplayName: "
|
|
1091
|
-
aumid: "com.frankston.
|
|
1093
|
+
relaunchDisplayName: "rmfmail",
|
|
1094
|
+
aumid: "com.frankston.rmfmail",
|
|
1092
1095
|
size: savedGeometry
|
|
1093
1096
|
? { width: savedGeometry.width, height: savedGeometry.height }
|
|
1094
1097
|
: { width: 1400, height: 900 },
|
|
@@ -1166,7 +1169,7 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
|
|
|
1166
1169
|
try {
|
|
1167
1170
|
clearInstanceFile();
|
|
1168
1171
|
const { spawn: spawnChild } = await import("child_process");
|
|
1169
|
-
const child = spawnChild("
|
|
1172
|
+
const child = spawnChild("rmfmail", [], { detached: true, stdio: "ignore", shell: true, windowsHide: true });
|
|
1170
1173
|
child.unref();
|
|
1171
1174
|
console.log(" [restart] Spawned fresh daemon; shutting down current");
|
|
1172
1175
|
// Give the spawn a moment to take hold before we start
|
|
@@ -1185,10 +1188,10 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
|
|
|
1185
1188
|
try {
|
|
1186
1189
|
const { execSync, spawn: spawnChild } = await import("child_process");
|
|
1187
1190
|
console.log(" [update] Installing latest version...");
|
|
1188
|
-
execSync("npm install -g @bobfrankston/
|
|
1191
|
+
execSync("npm install -g @bobfrankston/rmfmail", { encoding: "utf-8", timeout: 120_000, stdio: "inherit", windowsHide: true });
|
|
1189
1192
|
console.log(" [update] Install complete — relaunching");
|
|
1190
1193
|
// Spawn the new version detached so it outlives this process
|
|
1191
|
-
const child = spawnChild("
|
|
1194
|
+
const child = spawnChild("rmfmail", [], { detached: true, stdio: "ignore", shell: true, windowsHide: true });
|
|
1192
1195
|
child.unref();
|
|
1193
1196
|
gracefulShutdown("Update applied");
|
|
1194
1197
|
} catch (e: any) {
|
package/client/android.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
6
|
+
<title>rmfmail</title>
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
|
8
8
|
<link rel="stylesheet" href="styles/variables.css">
|
|
9
9
|
<link rel="stylesheet" href="styles/components.css">
|
|
@@ -96,12 +96,12 @@
|
|
|
96
96
|
<label class="tb-menu-item" title="Right-click in compose editor → Proofread"><input type="checkbox" id="opt-ai-proofread"> AI proofread (off by default)</label>
|
|
97
97
|
<hr class="tb-menu-sep">
|
|
98
98
|
<button class="tb-menu-item" id="btn-edit-jsonc" title="Edit accounts.jsonc / allowlist.jsonc / contacts.jsonc">Edit config files...</button>
|
|
99
|
-
<button class="tb-menu-item" id="btn-about" title="Show version and build info">About
|
|
99
|
+
<button class="tb-menu-item" id="btn-about" title="Show version and build info">About rmfmail...</button>
|
|
100
100
|
</div>
|
|
101
101
|
</div>
|
|
102
102
|
<button class="tb-btn" id="btn-tb-delete" title="Delete selected (Del)">🗑</button>
|
|
103
103
|
<button class="tb-btn" id="btn-tb-spam" title="Mark as spam — move to Junk">⚠</button>
|
|
104
|
-
<span id="app-version" class="app-version">
|
|
104
|
+
<span id="app-version" class="app-version">rmfmail</span>
|
|
105
105
|
</div>
|
|
106
106
|
<div class="toolbar-right">
|
|
107
107
|
<button class="tb-btn" id="btn-sync" title="Sync all folders (F5)">
|
|
@@ -213,13 +213,13 @@
|
|
|
213
213
|
<span id="status-diag" class="status-diag" hidden title=""></span>
|
|
214
214
|
<span id="status-pending"></span>
|
|
215
215
|
<span id="status-queue"></span>
|
|
216
|
-
<span class="app-version" id="status-version">
|
|
216
|
+
<span class="app-version" id="status-version">rmfmail</span>
|
|
217
217
|
</footer>
|
|
218
218
|
|
|
219
219
|
<div id="startup-overlay" class="startup-overlay">
|
|
220
220
|
<div class="startup-content">
|
|
221
221
|
<div class="startup-spinner"></div>
|
|
222
|
-
<div id="startup-status">Initializing
|
|
222
|
+
<div id="startup-status">Initializing rmfmail...</div>
|
|
223
223
|
</div>
|
|
224
224
|
</div>
|
|
225
225
|
</body>
|