{"_id":"poplib","_rev":"26-b5255b1ee99426c08ff3892bdd8cd9bf","name":"poplib","description":"POP3 client library for Node.js","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"poplib","version":"0.1.0","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"unixlib":"","optimist":"","hashlib":""},"repository":{"type":"git","url":"git://github.com/ditesh/node-poplib.git"},"main":"main.js","_id":"poplib@0.1.0","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.8","_defaultsLoaded":true,"dist":{"shasum":"533a1373102205a991626032755a34467116723d","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.0.tgz","integrity":"sha512-G3U2D9OOOgXZG/R9wnj8fA4rqYHL11AMc0EyC5afTI1MgwtKd8wWBzPorgmtexmnfO6OB3sGG6TYcu1HSI3Whg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHEoKGAYQyXnqIkLb9ShnmKP1LxLn537C5B/1e2yE3PHAiEA2YUNn7vouYsK1n8h4tzxgoYR434P2Rx+iVSY7+H5rb4="}]},"scripts":{},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.1":{"name":"poplib","version":"0.1.1","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"unixlib":"","optimist":"","hashlib":""},"repository":{"type":"git","url":"git://github.com/ditesh/node-poplib.git"},"main":"main.js","_id":"poplib@0.1.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"2f26a9a0de0623675dc6f830bec413b26fcd6c8a","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.1.tgz","integrity":"sha512-ElkaZJhL4BiLg+pG1shhgbuMBTUj6P+iR7Qg0cPMcDQ8dcNQhfuhcEdsWq9cti6BN1JYF9Tpv8Qh5RnK3KKltA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC06/yuGy1MA/CehD/Vr/jUFl3lLAr7pN53PedYKxNIZAiEAgy3zf8UBqiIiFFwdQau54X0dnGIYM4O/6b5x+YyPKvg="}]},"scripts":{},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.2":{"name":"poplib","version":"0.1.2","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"optimist":"","hashlib":""},"repository":{"type":"git","url":"git://github.com/ditesh/node-poplib.git"},"main":"main.js","_id":"poplib@0.1.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.10","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"5df9820e0514afc040a3f35cbd9f1336f142de60","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.2.tgz","integrity":"sha512-LMS5ZNhqW2tQNKLtQJfKwiiEJHVVSVWiRi3mwoxSnFBn+/pZq2FLl9+EI7YZOoDgUQsqi/MgRfswSNS19ldtwA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH9q71Flh5Z6vYWEgCpyzBdPdgBfIyRrG2Io1cCRkdk9AiA4nMZk5fNJTe2F7GePfV3OTes44NR3HmBRJ5XuTypd4A=="}]},"scripts":{},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.4":{"name":"poplib","version":"0.1.4","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"optimist":"","hashlib":""},"repository":{"type":"git","url":"git://github.com/ditesh/node-poplib.git"},"main":"main.js","_npmUser":{"name":"ditesh","email":"ditesh@gathani.org"},"_id":"poplib@0.1.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.103","_nodeVersion":"v0.4.11","_defaultsLoaded":true,"dist":{"shasum":"355188779f3a0be0a943dfe29c2fd8a8bda35919","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.4.tgz","integrity":"sha512-9u+b/mbgdbwsBdGE2/O1Me6N3clw9jjyFuL1zdS36RwvqgpLS+N/G3d/Tbn9EpRlQDELjYb9jiuMseIzkMNo7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICnokFTVHEVTlrzwUWhkDzAIMtJx/rHQwkj2omWySVjoAiAu2cHy4pJwDffuE1EYtr0s9+jOsXzEKCq2sM5ZK+gOow=="}]},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.5":{"name":"poplib","version":"0.1.5","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"optimist":""},"repository":{"type":"git","url":"https://github.com/ditesh/node-poplib.git"},"main":"main.js","_id":"poplib@0.1.5","dist":{"shasum":"5b8f3eb992ccaafa20b1563072fafc1151d12166","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.5.tgz","integrity":"sha512-eewwtQJVmNbTkSOwYX0FFIAr+aMOS+uLgMvmAL3SWZEp/Fmx+ZmKzKQ66meGeLUn7IABEzN7pTD3E41Gn7/TUA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBrD6HLmay5gJPHqQDhbQMZ5GA9Gphu3rnJI0Sm4u69IAiEA59B3J72av8YXzx/GrRH3I1YRUilLCEOmcswcZJMkiKA="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"ditesh","email":"ditesh@gathani.org"},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.6":{"name":"poplib","version":"0.1.6","license":"MIT","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"optimist":"*"},"repository":{"type":"git","url":"https://github.com/ditesh/node-poplib.git"},"main":"main.js","bugs":{"url":"https://github.com/ditesh/node-poplib/issues"},"_id":"poplib@0.1.6","dist":{"shasum":"eb93e376b8afe99f8c0a84d39a06f31d489d62f4","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.6.tgz","integrity":"sha512-SyRRbqJJQjANgRgrHLjXMarMJm/Sq6QYlmHfjQ2CSdVONOA4THER5SPY8rb3714nmf4lTfSEgIIgNuSccR+nkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBoiZ76xrqgkoaD5I+nI5y9qjIf/g8yNldxZxnURYw2RAiEA9w8la/6DmuWVrZKuU9RI9G4MHeAyDlOShZ0EKJ7LCeU="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"ditesh","email":"ditesh@gathani.org"},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]},"0.1.7":{"name":"poplib","version":"0.1.7","license":"MIT","description":"POP3 client library for Node.js","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"dependencies":{"optimist":"*"},"repository":{"type":"git","url":"https://github.com/ditesh/node-poplib.git"},"main":"main.js","bugs":{"url":"https://github.com/ditesh/node-poplib/issues"},"_id":"poplib@0.1.7","dist":{"shasum":"2f4b58b5592972350cd97f482aba68f8e05574bc","tarball":"https://registry.npmjs.org/poplib/-/poplib-0.1.7.tgz","integrity":"sha512-oN3+Ck6Tt6g5lfl9hIJKNQzLLCgv03YPx03Z+Twco4i3/Ml1jX+ixqhUxz1YNeCK8geXGSnFyNn75ko2dzA+Mg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMUiup/wqVud9kVYyaMvggkf/7WfaRI9vhrSCF8wUqSQIgJpjCCMlBTDbC5en5qY0eVbpAHZQnovr5JqsvM6SFWXI="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"ditesh","email":"ditesh@gathani.org"},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}]}},"maintainers":[{"name":"ditesh","email":"ditesh@gathani.org"}],"time":{"modified":"2022-06-24T08:24:39.561Z","created":"2011-09-02T02:12:33.881Z","0.1.0":"2011-09-02T02:12:35.378Z","0.1.1":"2011-09-18T14:27:26.792Z","0.1.2":"2011-09-21T02:49:37.555Z","0.1.4":"2011-11-08T06:17:03.899Z","0.1.5":"2013-02-13T11:11:40.745Z","0.1.6":"2014-03-19T05:37:10.634Z","0.1.7":"2014-04-04T01:45:44.493Z"},"author":{"name":"Ditesh Shashikant Gathani","email":"ditesh@gathani.org","url":"http://ditesh.gathani.org/blog/"},"repository":{"type":"git","url":"https://github.com/ditesh/node-poplib.git"},"users":{"parroit":true,"jmm23":true,"jorgenevens":true,"tonillo":true,"sopov":true},"readme":"# node-poplib\n\nnode-poplib offers an MIT-licensed client library for the POP3 protocol. It is currently provides the following capabilities:\n\n* USER, PASS, APOP\n* LIST, TOP, RETR, DELE\n* UIDL, NOOP, CAPA\n* RSET, QUIT\n* Plaintext and encrypted TLS support\n* STLS\n* SASL PLAIN CRAM-MD5\n\nIt complies to:\n\n* RFC 1939 (POP3)\n* RFC 2595 (STLS);\n* RFC 5034 (SASL AUTH)\n* RFC 2195 (CRAM-MD5)\n\n## Installation\n\nYou have two installation options:\n\n0. Via npm: `npm install poplib`\n\n1. Download the source and install it yourself\n\n## Quick demo\n\nConnect to GMail's POP3 servers using the provided demo script as follows:\n\n````bash\n$ node demos/demo.js --host pop.gmail.com --port 995 --username user@gmail.com --password potato --tls on --debug on --networkdebug on\nServer: '+OK Gpop ready for requests from 1.2.3.4 bh7pf61475604pab.24\\r\\n'\nCONNECT success\nClient: 'USER user@gmail.com\\r\\n'\nServer: '+OK send PASS\\r\\n'\nClient: 'PASS potato\\r\\n'\nServer: '-ERR [AUTH] Username and password not accepted.\\r\\n'\nLOGIN/PASS failed\nClient: 'QUIT\\r\\n'\nServer: '+OK Farewell.\\r\\n'\nQUIT success\n````\n\n## Detailed Usage\n\nnode-poplib is event based. It is best to illustrate via examples:\n\nHere we initialize the client (for plain text transmission):\n\n````javascript\nvar POP3Client = require(\"poplib\");\nvar client = new POP3Client(port, host, {\n\n\t\ttlserrs: false,\n\t\tenabletls: true,\n\t\tdebug: false\n\n\t});\n````\n\nThe third parameter, `options`, takes three options. If `enabletls` is true, the library will use a TLS connection. Note that you will have to set the correct port (generally 995). If `tlserrs` is true, then TLS errors will be ignored. Finally, the `debug` parameter prints out requests and responses.\n\nNext, we trap several common states:\n\n````javascript\nclient.on(\"error\", function(err) {\n\n        if (err.errno === 111) console.log(\"Unable to connect to server\");\n        else console.log(\"Server error occurred\");\n\n        console.log(err);\n\n});\n\nclient.on(\"connect\", function() {\n\n        console.log(\"CONNECT success\");\n        client.login(username, password);\n\n});\n\nclient.on(\"invalid-state\", function(cmd) {\n        console.log(\"Invalid state. You tried calling \" + cmd);\n});\n\nclient.on(\"locked\", function(cmd) {\n        console.log(\"Current command has not finished yet. You tried calling \" + cmd);\n});\n````\n\nThe `error` event is emitted when there is a network error. The underlying error object is passed back to user-code.\n\nThe `connect` event is emitted when the connection to the remote server is successful.\n\nThe `invalid-state` event is emitted when you try to carry out an action not allowed within your current state (eg, attempting to `RETR`-ieve a message when authentication has not been completed).\n\nThe `locked` event is emitted when you try to execute another command while the current command has not finished executing successfully (eg, attempting to `RETR`-ieve a message while the remote server has not finished sending `LIST` data).\n\nOn a successful connect, we try authenticating:\n\n````javascript\nclient.on(\"connect\", function() {\n\n        console.log(\"CONNECT success\");\n        client.login(username, password);\n\n});\n````\n\nNote that on successful login, we try listing. For all events, the first received argument is always a boolean indicating whether the command succeeded. The last received argument is always the raw unparsed data received from the remote server. The intermediate arguments contain parsed data.\n\n````javascript\nclient.on(\"login\", function(status, rawdata) {\n\n\tif (status) {\n\n\t\tconsole.log(\"LOGIN/PASS success\");\n\t\tclient.list();\n\n\t} else {\n\n\t\tconsole.log(\"LOGIN/PASS failed\");\n\t\tclient.quit();\n\n\t}\n});\n\n// Data is a 1-based index of messages, if there are any messages\nclient.on(\"list\", function(status, msgcount, msgnumber, data, rawdata) {\n\n\tif (status === false) {\n\n\t\tconsole.log(\"LIST failed\");\n\t\tclient.quit();\n\n\t} else {\n\n\t\tconsole.log(\"LIST success with \" + msgcount + \" element(s)\");\n\n\t\tif (msgcount > 0)\n\t\t\tclient.retr(1);\n\t\telse\n\t\t\tclient.quit();\n\n\t}\n});\n\nclient.on(\"retr\", function(status, msgnumber, data, rawdata) {\n\n\tif (status === true) {\n\n\t\tconsole.log(\"RETR success for msgnumber \" + msgnumber);\n\t\tclient.dele(msgnumber);\n\t\tclient.quit();\n\n\t} else {\n\n\t\tconsole.log(\"RETR failed for msgnumber \" + msgnumber);\n\t\tclient.quit();\n\n\t}\n});\n\nclient.on(\"dele\", function(status, msgnumber, data, rawdata) {\n\n\tif (status === true) {\n\n\t\tconsole.log(\"DELE success for msgnumber \" + msgnumber);\n\t\tclient.quit();\n\n\t} else {\n\n\t\tconsole.log(\"DELE failed for msgnumber \" + msgnumber);\n\t\tclient.quit();\n\n\t}\n});\n\nclient.on(\"quit\", function(status, rawdata) {\n\n\tif (status === true) console.log(\"QUIT success\");\n\telse console.log(\"QUIT failed\");\n\n});\n````\n\n## API\n\n`login(username, password)`\n\nSelf explanatory. This executes `USER` and `PASS`. Do not use over cleartext channels. Preferably don't use it at all as `auth()` implements `AUTH` which deprecates the need for USER and PASS. Emits `login` event.\n\n`apop(username, password)`\n\nThis executes `APOP`. Requires server side support. Preferably don't use it as `auth()` implements `AUTH` which deprecates the need for USER and PASS. Emits `apop` event.\n\n`auth(type, username, password)`\n\nThis executes `AUTH`. Requires server side support. Currently only \"PLAIN\" and \"CRAM-MD5\" types are supported. Emits `auth` event.\n\n`stls()`\n\nThis executes `STLS`. Requires server side support (check using `capa()` first). According to the RFC's, using `STLS` is preferable to a purely TLS connection (although some servers only support purely TLS connections). Emits `stls` event.\n\n`capa()`\n\nThis executes `CAPA`. Requires server side support. Emits `capa` event.\n\n`list([msgnumber])`\n\nThis executes `LIST`. If the optional `msgnumber` is provided, then `LIST msgnumber` is executed. Emits `list` event.\n\n`top(msgnumber, lines)`\n\nThis executes `TOP`. Requires server side support. `msgnumber` and `lines` must be provided. TEmits `top` event.\n\n`stat()`\n\nThis executes `STAT`. Emits `stat` event.\n\n`uidl([msgnumber])`\n\nThis executes `UIDL`. If the optional `msgnumber` is provided, then `UIDL msgnumber` is executed. Emits `uidl` event.\n\n`retr(msgnumber)`\n\nThis executes `RETR`. `msgnumber` must be provided. Emits `retr` event.\n\n`dele(msgnumber)`\n\nThis executes `DELE`. `msgnumber` must be provided. Emits `dele` event.\n\n`rset()`\n\nThis executes `RSET`. Emits `rset` event.\n\n`noop()`\n\nThis executes `NOOP`. Emits `noop` event.\n\n`quit()`\n\nThis executes `QUIT`. Emits `quit` event.\n\n\n## Events \n\n`connect`\n\nThe `connect` event is emitted upon competion of connection attempt (initiated in the constructor). The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`login`\n\nThe `login` event is emitted upon competion of `login()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`apop`\n\nThe `apop` event is emitted upon competion of `apop()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`auth`\n\nThe `auth` event is emitted upon competion of `auth()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`stls`\n\nThe `stls` event is emitted upon competion of `stls()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`capa`\n\nThe `capa` event is emitted upon competion of `capa()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* data: if status is true, this is an array containing list of server capabilities\n* rawdata: string containing success or error message from the server\n\n`list`\n\nThe `list` event is emitted upon competion of `list()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\nmsgcount: this contains the number of messages return by the `list()` method. If a valid msgnumber was provided, this value will naturally be `1` (else `null`)\n* msgnumber: if msgnumber was provided to the method, the provided value will be reflected here (else `undefined`)\n* data: if status is true, this is an array containing list of server capabilities (else `null`)\n* rawdata: string containing success or error message from the server\n\n`top`\n\nThe `top` event is emitted upon competion of `top()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* msgnumber: if msgnumber was provided to the method, the provided value will be reflected here (else `undefined`)\n* data: if status is true, this is an ASCII string containing the returnValue (else `null`)\n* rawdata: string containing success or error message from the server\n\n`stat`\n\nThe `stat` event is emitted upon competion of `stat()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* data: if status is true, an object with keys `count` and `octet` (else `null`)\n* rawdata: string containing success or error message from the server\n\n`uidl`\n\nThe `uidl` event is emitted upon competion of `uidl()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* msgnumber: if msgnumber was provided to the method, the provided value will be reflected here (else `undefined`)\n* data: if status is true, this is an array containing the UIDL list (else `null`)\n* rawdata: string containing success or error message from the server\n\n`retr`\n\nThe `retr` event is emitted upon competion of `retr()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* msgnumber: the `msgnumber` provided to the method\n* data: if status is `true`, the results are returned as an ASCII string (else `null`)\n* rawdata: string containing success or error message from the server\n\n`dele`\n\nThe `dele` event is emitted upon competion of the `dele()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* msgnumber: the `msgnumber` provided to the method\n* rawdata: string containing success or error message from the server\n\n`rset`\n\nThe `rset` event is emitted upon competion of the `rset()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`noop`\n\nThe `noop` event is emitted upon competion of the `noop()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* rawdata: string containing success or error message from the server\n\n`quit`\n\nThe `quit` event is emitted upon competion of the `quit()` method. The arguments, in order, are:\n\n* status: boolean true or false, indicating whether the execution was successful\n* * rawdata: string containing success or error message from the server\n\n`error`\n\nThe `error` event is emitted if there is an `error` event from the underlying socket. The original error object is passed as an argument.\n\n`invalid-state`\n\nThe `invalid-state` event is emitted when an action not allowed within the current state s attmempted (eg, attempting to `RETR`-ieve a message when `AUTH`-entication has not been completed).\n\n`locked`\n\nThe `locked` event is emitted when a method is called while existing execution has not finished executing (eg, attempting to `RETR`-ieve a message while the remote server has not finished sending `LIST` data).\n\n## Tests & Demos\n\nTests are in `tests`. Demos are in `demos`.\n\nThere is a full-featured POP3 client example in `demos/demo.js`. There is also a simple example of downloading all emails in a POP3 server and saving it locally in an mbox formatted file in `demos/retrieve-all.js`.\n\nFor testing purposes, you can use the following sendmail.sh script to pump email into your SMTP server for retrieval via POP3:\n\n````bash\n./sendmail.sh 10 \"user@example.com\" \"this is my subject\" \"this is my body\"\n````\n\nYou can execute the test-runner as follows:\n\n````bash\n./runner.sh username password pop3server pop3port pop3tlsport testemail@address.com\n````\n","readmeFilename":"README.md","homepage":"https://github.com/ditesh/node-poplib","keywords":["POP3","pop3","pop","client","mail","email"],"bugs":{"url":"https://github.com/ditesh/node-poplib/issues"},"license":"MIT"}