Skip to content

Commit

Permalink
Added plugin method to override address fields
Browse files Browse the repository at this point in the history
  • Loading branch information
andris9 committed Nov 17, 2016
1 parent ce34ac1 commit 00e7de7
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 28 deletions.
4 changes: 3 additions & 1 deletion config/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,9 @@ module.exports = {
password: 'socks pass'
}
*/
}
},

'core/image-hashes': false // 'receiver'
},

// You can define multiple listening SMTP interfaces, for example one for port 465, one for 587 etc
Expand Down
45 changes: 26 additions & 19 deletions lib/address-tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,29 @@ module.exports = {

function validateAddress(headers, key) {
let addressList = parseAddressList(headers, key, true);
addressList.forEach(address => {
try {
address.name = libmime.decodeWords(address.name || '');
} catch (E) {
// most probably an unknown charset was used, so keep as is
}
});
return {
addresses: addressList.map(address => address.address),
set: address => {
addresses: addressList,
set() {
let address = [].concat([...arguments]);
let values = [];
parseAddressses([].concat(address || []), true).forEach(parsed => {
if (!parsed || !parsed.address) {
return;
}
if (!parsed.name) {
let existing = addressList.find(entry => entry.address === parsed.address);
if (existing && existing.name) {
parsed.name = existing.name;
}
}

try {
parsed.name = libmime.decodeWords(parsed.name || '');
if (!/^[\w ']*$/.test(parsed.name)) { // check if contains only letters and numbers and such
if (/^[\x20-\x7e]*$/.test(parsed.name)) { // check if only contains ascii characters
parsed.name = '"' + parsed.name.replace(/([\\"])/g, '\\$1') + '"';
} else { // requires mime encoding
parsed.name = libmime.encodeWord(parsed.name, 'Q', 52);
}
if (!/^[\w ']*$/.test(parsed.name)) { // check if contains only letters and numbers and such
if (/^[\x20-\x7e]*$/.test(parsed.name)) { // check if only contains ascii characters
parsed.name = '"' + parsed.name.replace(/([\\"])/g, '\\$1') + '"';
} else { // requires mime encoding
parsed.name = libmime.encodeWord(parsed.name, 'Q', 52);
}
} catch (E) {
// most probably an unknown charset was used, keep as is
}

values.push(parsed.name ? parsed.name + ' <' + parsed.address + '>' : parsed.address);
Expand Down Expand Up @@ -76,11 +73,21 @@ function parseAddressList(headers, key, withNames) {
}

function parseAddressses(headerList, withNames) {
let map = convertAddresses(headerList.map(addressparser), withNames);
let map = convertAddresses(headerList.map(address => {
if (typeof address === 'string') {
address = addressparser(address);
}
return address;
}), withNames);
return Array.from(map).map(entry => entry[1]);
}

function normalizeAddress(address, withNames) {
if (typeof address === 'string') {
address = {
address
};
}
if (!address || !address.address) {
return '';
}
Expand Down
13 changes: 9 additions & 4 deletions plugins/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -296,15 +296,20 @@ Where

Return value is an object with the following properties:

- **addresses** an array of (plain) e-mail addresses found for that key
- **addresses** an array of e-mail addresses found for that key (structured values)
- **set** _(addresses)_ a method that overrides original key with new addresses

**Example**

```javascript
// From: Sender Name <[email protected]>
let from = app.validateAddress(envelope.headers, 'from');
from.addresses // ['[email protected]']
from.set('[email protected]');
// From: Sender Name <[email protected]>
from.addresses // [{name:'Sender Name', address: '[email protected]'}]
from.set('My Name <[email protected]>');
// From: [email protected]
from.set({
name: 'My Name',
address: '[email protected]'
});
// From: [email protected]
```
40 changes: 40 additions & 0 deletions plugins/core/image-hashes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'use strict';


const crypto = require('crypto');

// Set module title
module.exports.title = 'Image Hashes';

// Initialize the module
module.exports.init = (app, done) => {
// This example calculates MD5 hash for every image in the message
app.addStreamHook((envelope, node) => /^(image|application)\//i.test(node.contentType), (envelope, node, source, done) => {
let hash = crypto.createHash('md5');
let filename = node.filename;
let contentType = node.contentType;
let bytes = 0;

source.on('data', chunk => {
bytes += chunk.length;
hash.update(chunk);
});

source.on('end', () => {
if (!envelope.attachments) {
envelope.attachments = [];
}
hash = hash.digest('hex');
envelope.attachments.push({
name: filename,
type: contentType,
hash
});
app.logger.info('ImageHash', '%s ATTACHMENT name="%s" type="%s" size=%s md5=%s', envelope.id, filename || '', contentType, bytes, hash);
done();
});
});

// all set up regarding this plugin
done();
};
29 changes: 25 additions & 4 deletions test/address-tools-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,16 @@ module.exports['#validateAddress'] = test => {

let parsed = addressTools.validateAddress(headers, 'from');

test.deepEqual(parsed.addresses, ['[email protected]', '[email protected]', '[email protected]']);
test.deepEqual(parsed.addresses, [{
name: '',
address: '[email protected]'
}, {
name: 'Andris4',
address: '[email protected]'
}, {
name: 'Andris3',
address: '[email protected]'
}]);

parsed.set('Juhan Liiv <[email protected]>');

Expand Down Expand Up @@ -113,16 +122,28 @@ module.exports['#validateAddress, multiple'] = test => {

let parsed = addressTools.validateAddress(headers, 'to');

test.deepEqual(parsed.addresses, ['[email protected]', '[email protected]', '[email protected]']);
test.deepEqual(parsed.addresses, [{
name: '',
address: '[email protected]'
}, {
name: 'Andris4',
address: '[email protected]'
}, {
name: 'Andris3',
address: '[email protected]'
}]);

parsed.set('Juhan Liiv <[email protected]>, Jõgeva <[email protected]>, [email protected]');
parsed.set('Juhan Liiv <[email protected]>, Jõgeva <[email protected]>, [email protected]', {
name: 'Andris3',
address: '[email protected]'
});

test.deepEqual(headers.getList(), [{
key: 'x-prev',
line: 'X-Prev: previous line'
}, {
key: 'to',
line: 'to: Juhan Liiv <[email protected]>, =?UTF-8?Q?J=C3=B5geva?=\r\n <[email protected]>, Andris3 <andris3@kreata.ee>'
line: 'to: Juhan Liiv <[email protected]>, =?UTF-8?Q?J=C3=B5geva?=\r\n <[email protected]>, [email protected], Andris3 <andris4@kreata.ee>'
}, {
key: 'x-mid',
line: 'X-Mid: middle line'
Expand Down

0 comments on commit 00e7de7

Please sign in to comment.