From 04753b2423e0ebc44c946cc5b44e90546b880083 Mon Sep 17 00:00:00 2001 From: Brian White Date: Sat, 23 Jul 2011 16:29:36 -0400 Subject: [PATCH] Add ability to fetch an entire email message (including headers) by specifying 'full' for the body property with fetch(). --- README.md | 2 +- imap.js | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cef876a..0cf4134 100644 --- a/README.md +++ b/README.md @@ -349,7 +349,7 @@ ImapConnection Functions * **request** - An Object indicating what to fetch (at least **headers** OR **body** must be set to false -- in other words, you can only fetch one aspect of the message at a time): * **struct** - A Boolean indicating whether to fetch the structure of the message. **Default:** true * **headers** - A Boolean/Array value. A value of true fetches all message headers. An Array containing specific message headers to retrieve can also be specified. **Default:** true - * **body** - A Boolean/String/Array value. A Boolean value of true fetches the entire raw message body. A String value containing a valid partID (see _FetchResult_'s structure property) fetches the entire body/content of that particular part. An Array value of length 2 can be specified if you wish to request a byte range of the content, where the first item is a Boolean/String as previously described and the second item is a String indicating the byte range, for example, to fetch the first 500 bytes: '0-500'. **Default:** false + * **body** - A Boolean/String/Array value. A Boolean value of true fetches the entire raw message body. A String value containing a valid partID (see _FetchResult_'s structure property) fetches the entire body/content of that particular part, or a String value of 'full' fetches the entire email message, including the headers. An Array value of length 2 can be specified if you wish to request a byte range of the content, where the first item is a Boolean/String as previously described and the second item is a String indicating the byte range, for example, to fetch the first 500 bytes: '0-500'. **Default:** false * **copy**(Integer/String/Array, String, Function) - _(void)_ - Copies the message(s) with the message ID(s) identified by the first parameter, in the currently open mailbox, to the mailbox specified by the second parameter. The first parameter can either be an Integer for a single message ID, a String for a message ID range (e.g. '2504:2507' or '*' or '2504:*'), or an Array containing any number of the aforementioned Integers and/or Strings. The Function parameter is the callback with one parameter: the error (null if none). diff --git a/imap.js b/imap.js index 3206b01..ea1fc46 100644 --- a/imap.js +++ b/imap.js @@ -647,11 +647,14 @@ ImapConnection.prototype.fetch = function(uids, options) { // all message parts toFetch = 'TEXT'; } else if (typeof opts.request.body === 'string') { - if (opts.request.body !== '' - && !/^([\d]+[\.]{0,1})*[\d]+$/.test(opts.request.body)) + if (opts.request.body.toUpperCase() === 'FULL') { + // fetches the whole entire message (including the headers) + toFetch = ''; + } else if (/^([\d]+[\.]{0,1})*[\d]+$/.test(opts.request.body)) { + // specific message part identifier, e.g. '1', '2', '1.1', '1.2', etc + toFetch = opts.request.body; + } else throw new Error("Invalid body partID format"); - // specific message part identifier, e.g. '1', '2', '1.1', '1.2', etc - toFetch = opts.request.body; } } else { // fetch specific headers only