Package Information
Documentation
n8n-nodes-maildog
Community nodes for Exchange EWS/NTLM report ingestion, ZIP inspection, XLSX default-style repair and resumable publication. Everything runs in JavaScript in the existing n8n process. No additional container, Python, Python runner, shell command or system package is required by these nodes.
Requirements and installation
- Self-hosted n8n 2.x with Community Nodes installation enabled, and Node.js 22 or newer. n8n 2.39.10 itself requires Node.js 24 or newer.
- An Exchange server that supports EWS with NTLM over trusted HTTPS. Microsoft Graph, OAuth and Exchange Online Basic authentication are not implemented.
- Writable persistent directories exposed to n8n. Defaults are
/files/dist/netcenterfor reports and/files/dist/.maildog-statefor archives/locks. Set both on the Configure node; the example propagates them to other nodes. They must be separate, within any configured n8n file-access allowlist, and free of symlinks. - The output filesystem must support hard links. Existing files with a different hash cause an error instead of being overwritten.
After this package has been published to npm, an n8n Owner/Admin can install n8n-nodes-maildog from Settings → Community nodes → Install. This is an unverified community package; it has not been submitted for n8n verification. A .tgz file is for administrator/npm installation, not upload through that dialog.
Runtime dependencies are compiled into one CommonJS runtime file. The published package has no runtime npm dependencies, so installation does not resolve a second dependency tree on the server. Build-time dependencies are pinned in package-lock.json; UUID is resolved to 11.1.1 at build time. There are no installation lifecycle scripts that modify the server. prepack runs build/privacy checks only on the publisher's machine. Full third-party license texts accompany the compiled runtime.
The HTTP client uses synchronous in-memory cookies. Its optional native bridge for asynchronous cookie stores is not included; requesting that unsupported mode fails explicitly.
Nodes
| Node | Purpose |
|---|---|
| MailDog Files & Control | Configuration, report planning, execution lock, archives, hashes, non-overwriting publication and completion verification |
| MailDog Exchange EWS | Exact subject/sender/attachment matching with paginated EWS/NTLM searches |
| MailDog ZIP & XLSX | Inspect a report ZIP, repair a selected archived workbook, or repair a standalone binary XLSX |
The workbook node uses binary field data. Repair outputs the repaired workbook in data, and the original in source. JSON output contains hashes and metadata, not workbook Base64. The Files node retains older Base64 operations for compatibility, but the supplied workflows use binary data.
Example workflows
- Import
examples/maildog-report.json, thenexamples/maildog-main.json, into the same project. Both are unpublished initially. - In the main workflow, open Configure. Replace example sender, mail folder, exact report subjects and ZIP attachment templates with your own values. No real organization or account settings are included.
- Set State Directory and Output Directory to existing persistent storage. Keep archive storage outside the folder your downstream application scans for published reports.
- Create a MailDog Exchange EWS (NTLM) credential with endpoint, mailbox, domain username and password. Select it on Fetch Exchange ZIP. Credentials must never be inserted into the Configure JSON, examples or package source.
- Select the imported processor in Process Report; UI imports may assign different workflow IDs. Publish the processor so it can be called.
- Run the main workflow manually and verify output. Publish the main workflow to enable the supplied hourly schedule at minute 10. The sample workflow timezone is Asia/Taipei; change both the workflow timezone and Configure timezone together if required.
Blank start_date and end_date mean the current date in the configured IANA timezone. To backfill, set start_date to your desired first date and leave end_date blank. report_ids: [] selects all configured reports. Daily/monthly due times gate today's work; day_of_month limits monthly reports. Completed jobs are skipped, while waiting_mail and failed jobs are retried on later runs. No mail is moved, deleted, sent or marked read.
The example creates MailDog jobs and MailDog files Data Tables. Do not create same-name tables with incompatible schemas. Use a separate n8n project and separate storage roots for independent report pipelines.
Data handling and limits
Nodes connect only to the Exchange endpoint configured in Credentials. There is no telemetry or upload destination. EWS exceptions are sanitized because upstream errors can include credentials. SMTP/OAuth/SFTP functionality is not included.
The state directory retains original ZIPs, message identifiers/timestamps, original workbooks, repaired workbooks, manifests and an execution lock. Back up this directory and n8n's own persistent data. Files are retained until the operator applies a retention policy. Anyone with filesystem access to these directories can read report contents. n8n execution history may also contain binary data; apply an appropriate execution-data policy.
Default limits: 100 MiB attachment/workbook, 5,000 ZIP entries, 1 GiB expanded bytes per archive and 8 MiB per inspected XML part. ZIP members are streamed and CRC checked. Rejects traversal, case-insensitive duplicate/colliding names, symlinks, encrypted ZIPs, DTD/entity declarations, malformed XML, macros, signed workbooks and Strict OOXML. UTF-8 transitional XLSX is supported. Repair adds a Normal style only when a safe default style base exists; all non-style OOXML parts are verified byte-for-byte unchanged. This is a targeted style repair, not a general Excel converter.
The lock lasts at most 40 minutes. A run stops beginning new reports after 25 minutes; example workflows have a 30-minute timeout. Lock acquisition rejects overlapping runs. Expected report errors are recorded and retain archives; other errors use a lock-release branch. A forced termination can require waiting for lock expiry. Completed jobs are not automatically recreated if an external application deletes their output.
Migration and publishing
Do not import these workflows over an existing production workflow: their IDs are separate. Community-node types use n8n-nodes-maildog.*. Filesystem custom-node type names differ. Re-select credentials and processor references after import.
The new JavaScript ZIP writer may produce different compressed workbook bytes than earlier converters, even with identical cell contents. Use separate output/state directories for a migration test. Do not delete completion records or force overwrite old outputs to bypass a hash mismatch.
Package source is MIT licensed; dependencies retain their individual licenses (see THIRD_PARTY_NOTICES.md and bundled licenses). To reproduce the release, run npm ci --ignore-scripts, npm test, npm run build, npm run lint, and npm pack. Maintainers should review the packed file list, confirm ownership/availability of the npm name, and supply accurate publisher/repository metadata before publishing with their own npm account. No npm token or account is shipped. Publication is a separate action from preparing the package.
Official references: Community Nodes installation, node package standards.