{"_id":"paperplane-mailer","_rev":"39-d7a176dc9e56977322943a3e3ee042f2","name":"paperplane-mailer","dist-tags":{"latest":"1.2.1"},"versions":{"1.1.2":{"name":"paperplane-mailer","version":"1.1.2","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.2","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"75f1e72546738c89615d70daf533e799b615cd07","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.2.tgz","fileCount":9,"integrity":"sha512-+YIwx1q8dWedbG6doHKx7zxr3R3lCuGAaCeLXfuzfr/PILDO2Ioy4sdAs6QlvhNvZ+AyWAWHJxxh9YZypi66AA==","signatures":[{"sig":"MEUCIGoV0qIbQjmBUJbi5w99Tkx2FN9GfMR9pbZj11oEjn3/AiEA2N1zD83N1F6X72cEfR2Y38krW8xZ9xUo1zyn2ymC+18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58368},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"d58093d44d5c1064a74f84f424c33442cefd6c20","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.2_1758821997128_0.29328901458019163","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"paperplane-mailer","version":"1.1.3","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.3","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"e056806878dc75441685408457bd5be90aed8e51","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.3.tgz","fileCount":9,"integrity":"sha512-kLiLGTt/CyNhgrVeSf8l8IygYPKPV/z/ELJQHe9mxfH2McJS3K++Uj8AZcFq13f6lwzGPHIynKn43rjWJfXm+w==","signatures":[{"sig":"MEQCIBWmMGvXgld88qn/P7wJEzLN0kSJs2GDQlE1lYnZ86/KAiBsJwIwz3Q7IaL2j1E1cU5LmQU6iPBHMs4Xn55ToV/qAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58460},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"3fb62a1749c7b0499b77d9b9f6999c4682754201","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.3_1758822707245_0.18779294208495934","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"paperplane-mailer","version":"1.1.4","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.4","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"443ffe290c46816dd4a9c4a94f073762fc3ce598","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.4.tgz","fileCount":9,"integrity":"sha512-l5PtIyfitIuNLhQeVanHeZ+LX01PDA27frY8cQ4qA6aTJOzkBTQirlNoPVa9dSVKBlzx7fjSQSmIpsG0EbmmJQ==","signatures":[{"sig":"MEYCIQCe+qQmA70aVpiE5ccLq2UQOckg+KOd/HHoGaRLpleUwgIhAIT+/Kci3IZQsUWc7uQ82x2IrglTeP5FuZptmHIGeIZV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59700},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"6537d59b32b0f939f8d83955034339f835d8fab2","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.4_1758837575489_0.7826087925584799","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"paperplane-mailer","version":"1.1.5","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.5","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"d5550d1803369144a670bfc4e78298d50b82f2e1","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.5.tgz","fileCount":9,"integrity":"sha512-ZEd0Ff47qJ6OkgkCaigbBwcj4ayhArLqXvdCdltYZJZ9xh7I/q92BP3k5XO3iZgNjRu4WBjhX0sbAfqYyoid9w==","signatures":[{"sig":"MEUCIGlxjAtA9tstlWFxlLT0owYXbBWZPFy40W4FquVSjv8rAiEA/iAANM5wZl1p1P35lD3L+sQb10JzfyFkFqop3HYyurI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60526},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"7773b195824753a2179ac33aede9fa21028f7c62","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.5_1763591200264_0.026663350629662075","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"paperplane-mailer","version":"1.1.6","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.6","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"5f745bc82ffdc8478e7a68836ec5a12c0731e056","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.6.tgz","fileCount":9,"integrity":"sha512-+Vvp5aqeOS8hLZ3y+63WphBB2RO7D2/FjMS2elXMVBHUYmhU7NTrozS92+r4j9OEJVKlluZThrWdT23Ko8GrKg==","signatures":[{"sig":"MEUCIQCWoc1jrjhWn57pQZu177budicIT1OREJ+Jq4+WkrUeLAIgcKAG+aFvkl20BBNF5gxhu0vz4sktbyq2U7OZyg/I0f0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60500},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"7e7a7426a1f7aac2418b07c6f4a53779e7656ab4","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.6_1763591932524_0.49460958252964904","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"paperplane-mailer","version":"1.1.7","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.7","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"680483fac03a4d21dfee54d54dc07434db01b7b2","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.7.tgz","fileCount":9,"integrity":"sha512-rmXnDkTRl70c1gPX6jIZX8CRWNTvINJoITDWHxMZoXbkHvdf9TH5f1w5fxXtVARQtxvLMPPls0xbmRY4y3QlkA==","signatures":[{"sig":"MEQCIFhSsHyBWxenQgLEkF0L/g9XuuGnutZLZUrHRLkcTO27AiBPuhlbpklcNwsWE/CxGG0I6M6KrsobCgdSiTrNahZPIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60459},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"4ebcca4fe9b3837cd4e8d6509cdd157c62be9432","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.7_1763658258083_0.7704431973665813","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"paperplane-mailer","version":"1.1.8","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.8","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"da5cb144661a26b388c2d112deed84c4f0b2b5e6","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.8.tgz","fileCount":9,"integrity":"sha512-UbtVxALIKex8hhElY++RbQIW98ZHgP7emJKzoK704W+I5zKkbYuFbSl4CZ9xDaysz62RdSFoyr6s3Rdw6fikXA==","signatures":[{"sig":"MEUCIAcVudMJJtk7WDo+9itlDgRsenT0ac+BS3uYHF6Elf41AiEA4wzbPVW2WM2cA8iuaY5pD/+S2QjdDjbFjHmv00wHdLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65606},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"4ebcca4fe9b3837cd4e8d6509cdd157c62be9432","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.8_1768417391329_0.06656450905324895","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"paperplane-mailer","version":"1.1.9","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","_id":"paperplane-mailer@1.1.9","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"dist":{"shasum":"33bf8ce2dd16c41d83fe749075c215eb7e3b3fc0","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.1.9.tgz","fileCount":9,"integrity":"sha512-P34hVjklpzFjsXsXMBeacQsMimMUaTyAjIhmgHNqG+LImkxD1Esg6hg4q7IAZjRG9JsKzyLWmQQKMjiuUxp3TA==","signatures":[{"sig":"MEUCIQCZBghV7O4mf340vKFfYYN5os/B2DCyKBHySExAZ4SUlAIgZ6ud610IHoHItX7SXBjdofZuAqJDNzqNUWvNBsRMlOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65771},"main":"index.js","type":"module","github":"https://github.com/BlobTheKat/paperplane","gitHead":"4ebcca4fe9b3837cd4e8d6509cdd157c62be9432","scripts":{"start":"node cli.js"},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"_npmVersion":"10.8.2","description":"4-way mail client/server","directories":{},"_nodeVersion":"20.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/paperplane-mailer_1.1.9_1768418385188_0.9592446542022326","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"paperplane-mailer","version":"1.2.1","main":"index.js","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","description":"4-way mail client/server","github":"https://github.com/BlobTheKat/paperplane","type":"module","scripts":{"start":"node cli.js"},"_id":"paperplane-mailer@1.2.1","gitHead":"9c94dd119bd35dc6b3c46525acb99b5a15661f83","_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-CxULPquca8U4HI2RL3PFkhU8esgxmn10S0VzRmVvh6gIeSmw0HuczJXZZaBgVXhWShnIAU33vgjGuJ3np5XwVQ==","shasum":"597e967f1478828fb56d7c833ee0ff29461c3b35","tarball":"https://registry.npmjs.org/paperplane-mailer/-/paperplane-mailer-1.2.1.tgz","fileCount":9,"unpackedSize":68108,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCBE+h6Q6IlCyxAeuUDFs/RJXzRSYANmExWzGX1K48nSQIhAOPv47RppjnFmxaIKUhNdQtB8P2nJgIAXN+hEs50QE/L"}]},"_npmUser":{"name":"blobkat","email":"blob.kat@hotmail.com"},"directories":{},"maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/paperplane-mailer_1.2.1_1788995685929_0.8804597631706301"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-19T22:45:42.488Z","modified":"2026-09-09T23:14:46.223Z","1.0.0":"2025-09-19T22:45:42.772Z","1.0.1":"2025-09-19T23:12:20.039Z","1.0.2":"2025-09-20T06:35:01.706Z","1.0.3":"2025-09-20T07:09:14.698Z","1.0.4":"2025-09-20T13:30:20.082Z","1.0.5":"2025-09-21T20:54:16.850Z","1.0.6":"2025-09-22T22:21:55.265Z","1.0.7":"2025-09-23T20:27:27.177Z","1.0.8":"2025-09-24T00:31:24.892Z","1.0.9":"2025-09-24T22:47:55.361Z","1.0.10":"2025-09-24T23:36:34.578Z","1.0.12":"2025-09-25T00:53:15.336Z","1.0.13":"2025-09-25T01:05:23.187Z","1.1.0":"2025-09-25T17:08:27.324Z","1.1.1":"2025-09-25T17:17:17.087Z","1.1.2":"2025-09-25T17:39:57.323Z","1.1.3":"2025-09-25T17:51:47.448Z","1.1.4":"2025-09-25T21:59:35.679Z","1.1.5":"2025-11-19T22:26:40.451Z","1.1.6":"2025-11-19T22:38:52.728Z","1.1.7":"2025-11-20T17:04:18.266Z","1.1.8":"2026-01-14T19:03:11.466Z","1.1.9":"2026-01-14T19:19:45.344Z","1.2.1":"2026-09-09T23:14:46.060Z"},"author":{"name":"BlobTheKat"},"license":"GPL-3.0-only","keywords":["mail","smtp","deliverable","email","pop3","smtps"],"description":"4-way mail client/server","maintainers":[{"name":"blobkat","email":"blob.kat@hotmail.com"}],"readme":"# Paperplane mailer\n\n- 4-way email handling in node.js\n- Build-your-own-mail-server, or just the parts that you need\n- Direct mail delivery (no paid/free-tier proxies)\n- Supports common extensions (pipelining, chunking, utf8, ...)\n- SpamAssasin client built-in\n- Built to be lightweight and performant\n- Built in the big '25 with modern language features and practices\n\n### Sending emails\n```js\nimport { Mail, SMTPClient } from \"paperplane-mailer\"\n\n// DKIM key can be generated with\n// npx paperplane-mailer gen [file?]\nconst client = new SMTPClient('mydomain.com', './dkim.key', /*selector*/'mail')\n\nconst mail = new Mail({\n\tFrom: 'Me <sender@mydomain.com>',\n\t'Content-Type': 'text/html'\n}, `<html><h1>Hello, world!</h1></html>`)\n\n// .send(from, [to...], mail)\nclient.send('sender@mydomain.com', [ 'you@gmail.com' ], mail).then(failed => {\n\tif(failed.length){\n\t\tfor(const f of failed)\n\t\t\tconsole.error('× Failed to send to %s', f)\n\t\treturn\n\t}\n\tconsole.info('Mail sent to all recipients successfully!')\n})\n```\n\n### Receiving emails\n```js\nimport { Mail, SMTPServer, SpamAssassin, uniqueId } from \"paperplane-mailer\"\n\n// Create an SMTP server with a basic filter [ 'mydomain.com' ]\n// All incoming mail not meant for something@mydomain.com is rejected for us\n// Leave arguments empty to disable filter\nconst smtpServer = new SMTPServer('mydomain.com')\n\nconst tlsOptions = {\n\tkey: fs.readFileSync('mydomain.key'),\n\tcert: fs.readFileSync('mydomain.cert')\n}\nawait smtpServer.listen(tlsOptions)\nconsole.info('SMTP servers listening on :25, :465, :587')\n\n// We configure spam-detection using spamassasin and spamhaus\nconst spamc = new SpamAssassin('127.0.0.1')\n\nsmtpServer.onIncoming = async (_, from, toArr, mail, rawMail, ip) => {\n\t// The from parameter can be used to identify the sender but is not always the same as the `From` header that users see. Keep that in mind, and use the from header if in doubt\n\tconsole.log('\\x1b[35mIncoming from %s to %s\\nIP: %s, headers: %d, body: %d bytes',\n\t\tmail.get('from') ?? from, toArr, ip, mail.headerCount, mail.body.length)\n\n\t// Mail is checked by spamassasin. IP (if specified) is checked by zen.spamhaus.org\n\tconst spam = await spamc.check(rawMail, ip)\n\n\t// SpamAssasin by default doesn't strongly penalize invalid DKIM\n\t// Despite it being an industry standard and very important in verifying email authenticity\n\t// Here we automatically spam any email without a valid DKIM signature\n\tif(!spam.symbols.includes('DKIM_VALID') || spam.spam){\n\t\tconsole.warn('Message flagged as spam with score %d and symbols:\\n  %s',\n\t\t\tspam.score, spam.symbols.join(' ')+(spam.blocked ? ' SPAMHAUS_IP_BLOCKED':''))\n\t\treturn\n\t}else{\n\t\tconsole.info('Message passed spam test with score %d and symbols:\\n  %s',\n\t\t\tspam.score, spam.symbols.join(' '))\n\t}\n\t// toArr is guaranteed to all match our filter ['mydomain.com']\n\n\t// Normalize the email (make sure we have a correct `Date` header, `Message-ID`, ...)\n\tmail.normalize()\n\n\tlet count = 0\n\tfor(let to of toArr){\n\t\t// Convert user@mydomain.com to user\n\t\tto = Mail.getLocal(to) || to\n\n\t\t// This example uses in-memory inboxes, see further below\n\t\tconst inbox = inboxes.get(to)\n\t\tif(!inbox) continue\n\n\t\tinbox.add(mail)\n\t\tcount++\n\t}\n\tconsole.log('Stored to %d inboxes', count)\n}\n\nconst inboxes = new Map()\n\nclass Inbox extends Map{\n\tconstructor({ password = '' }){\n\t\tsuper()\n\t\tthis.password = password\n\t}\n\tadd(mail){\n\t\tconst id = uniqueId() // Unique identifier in the format: paperplane-<unix_timestamp>-r4nDomBaSe64...\n\t\tthis.set(id, mail)\n\t\treturn id\n\t}\n}\n\ninboxes.set('john', new Inbox({ password: 'password123' }))\n\n```\n\n### Downloading emails to a client\n```js\nimport { Mail, POPServer } from \"paperplane-mailer\"\n\n/* Variables from previous example omitted for brevity */\n\nconst popServer = new POPServer('mydomain.com')\n\nawait popServer.listen(tlsOptions)\nconsole.log('\\x1b[32mPOP servers listening on :110, :995\\x1b[m')\n\npopServer.onAuthenticate = (user, pass) => {\n\t// TODO: password hashing, timing safe equal, etc...\n\tconst inbox = inboxes.get(user = Mail.getLocal(user) || user)\n\tif(!inbox || inbox.password !== pass) return null\n\treturn { inbox, username: user }\n}\n\npopServer.onGetMessages = (auth) => {\n\tconst { inbox, username } = auth\n\n\t// Return array of message IDs\n\t// Conceptually they could be any string as they are just passed to onFetchMessage\n\treturn [...inbox.keys()]\n}\npopServer.onFetchMessage = (auth, id) => {\n\tconst { inbox, username } = auth\n\n\t// Return the Mail object for this message ID, or null\n\t// This callback is only invoked with message IDs returned by `onGetMessages` with the same auth object so mail being null is a rare edge-case\n\treturn inbox.get(id)\n}\n```\n\n### Sending emails from a client\n```js\nimport { Mail, SMTPServer } from 'paperplane-mailer'\n\n/* Variables from previous examples omitted for brevity */\n//const smtpServer = ...\n\n// Similar to popServer.onAuthenticate\nsmtpServer.onAuthenticate = (user, pass) => {\n\tconst inbox = inboxes.get(user = Mail.getLocal(user) || user)\n\tif(!inbox || inbox.password !== pass) return null\n\treturn { inbox, username: user }\n}\n\nsmtpServer.onOutgoing = (auth, from, toArr, mail) => {\n\tconst { inbox, username } = auth\n\n\t// from is guaranteed to match our filter ['mydomain.com']\n\t// Unlike onIncoming, `from` here actually means the sender\n\t// Mail.getLocal('abc@example.com') returns 'abc'\n\t// We can return a string to indicate to the sender that delivery failed for that reason\n\tif(Mail.getLocal(from) != auth.user) return 'Not allowed to send from that email'\n\t\n\t// Normalize the email, also setting the `From` header based on the value we just checked\n\tmail.normalize(from)\n\n\tcli.send(from, toArr, mail).then(failed => {\n\t\t// IDEA: \"Undelivered mail returned to sender\"?\n\t})\n}\n```","readmeFilename":"README.md"}