Skip to content

Commit ee11ee3

Browse files
committed
update submit endpoint to account for rejections of message and update wdr counter only if successfully sent message
1 parent 1b4dc27 commit ee11ee3

1 file changed

Lines changed: 73 additions & 65 deletions

File tree

lib/api/submit.js

Lines changed: 73 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -426,82 +426,90 @@ module.exports = (db, server, messageHandler, userHandler, settingsHandler) => {
426426
return;
427427
}
428428

429-
messageHandler.counters.ttlcounter(
430-
'wdr:' + userData._id.toString(),
431-
compiledEnvelope.to.length,
432-
maxRecipients,
433-
false,
434-
(err, result) => {
435-
if (err) {
436-
err.responseCode = 500;
437-
err.code = 'InternalDatabaseError';
438-
return callback(err);
439-
}
429+
messageHandler.counters.ttlcounter('wdr:' + userData._id.toString(), 0, maxRecipients, false, (err, result) => {
430+
if (err) {
431+
err.responseCode = 500;
432+
err.code = 'InternalDatabaseError';
433+
return callback(err);
434+
}
440435

441-
let success = result.success;
442-
let sent = result.value;
443-
let ttl = result.ttl;
444-
445-
let ttlHuman = false;
446-
if (ttl) {
447-
if (ttl < 60) {
448-
ttlHuman = ttl + ' seconds';
449-
} else if (ttl < 3600) {
450-
ttlHuman = Math.round(ttl / 60) + ' minutes';
451-
} else {
452-
ttlHuman = Math.round(ttl / 3600) + ' hours';
453-
}
454-
}
436+
let success = result.success;
437+
let sent = result.value;
438+
let ttl = result.ttl;
455439

456-
if (!success) {
457-
log.info('API', 'RCPTDENY denied sent=%s allowed=%s expires=%ss.', sent, maxRecipients, ttl);
458-
let err = new Error(
459-
'You reached a daily sending limit for your account' + (ttl ? '. Limit expires in ' + ttlHuman : '')
460-
);
461-
err.responseCode = 403;
462-
err.code = 'RateLimitedError';
463-
return setImmediate(() => callback(err));
440+
let ttlHuman = false;
441+
if (ttl) {
442+
if (ttl < 60) {
443+
ttlHuman = ttl + ' seconds';
444+
} else if (ttl < 3600) {
445+
ttlHuman = Math.round(ttl / 60) + ' minutes';
446+
} else {
447+
ttlHuman = Math.round(ttl / 3600) + ' hours';
464448
}
449+
}
465450

466-
// push message to outbound queue
467-
let message = maildrop.push(
468-
{
469-
user: userData._id,
470-
userEmail: userData.address,
471-
parentId: messageId,
472-
reason: 'submit',
473-
from: compiledEnvelope.from,
474-
to: compiledEnvelope.to,
475-
sendTime,
476-
origin: options.ip,
477-
runPlugins: true,
478-
mtaRelay: userData.mtaRelay || false
479-
},
480-
(err, ...args) => {
481-
if (err || !args[0]) {
482-
if (err) {
483-
if (!err.code && err.name === 'SMTPReject') {
484-
err.code = 'MessageRejected';
485-
}
451+
if (!success || sent + compiledEnvelope.length > maxRecipients) {
452+
log.info('API', 'RCPTDENY denied sent=%s allowed=%s expires=%ss.', sent, maxRecipients, ttl);
453+
let err = new Error(
454+
'You reached a daily sending limit for your account' + (ttl ? '. Limit expires in ' + ttlHuman : '')
455+
);
456+
err.responseCode = 403;
457+
err.code = 'RateLimitedError';
458+
return setImmediate(() => callback(err));
459+
}
486460

487-
err.code = err.code || 'ERRCOMPOSE';
461+
// push message to outbound queue
462+
let message = maildrop.push(
463+
{
464+
user: userData._id,
465+
userEmail: userData.address,
466+
parentId: messageId,
467+
reason: 'submit',
468+
from: compiledEnvelope.from,
469+
to: compiledEnvelope.to,
470+
sendTime,
471+
origin: options.ip,
472+
runPlugins: true,
473+
mtaRelay: userData.mtaRelay || false
474+
},
475+
(err, ...args) => {
476+
if (err || !args[0]) {
477+
if (err) {
478+
if (!err.code && err.name === 'SMTPReject') {
479+
err.code = 'MessageRejected';
488480
}
489-
err.responseCode = 500;
490-
return callback(err, ...args);
491-
}
492481

493-
let outbound = args[0].id;
494-
return next(null, outbound);
482+
err.code = err.code || 'ERRCOMPOSE';
483+
}
484+
err.responseCode = 500;
485+
return callback(err, ...args);
495486
}
496-
);
497487

498-
if (message) {
499-
let stream = compiled.createReadStream();
500-
stream.once('error', err => message.emit('error', err));
501-
stream.pipe(collector).pipe(message);
488+
messageHandler.counters.ttlcounter(
489+
'wdr:' + userData._id.toString(),
490+
compiledEnvelope.to.length,
491+
maxRecipients,
492+
false,
493+
err => {
494+
if (err) {
495+
err.responseCode = 500;
496+
err.code = 'InternalDatabaseError';
497+
return setImmediate(() => callback(err));
498+
}
499+
500+
let outbound = args[0].id;
501+
return next(null, outbound);
502+
}
503+
);
502504
}
505+
);
506+
507+
if (message) {
508+
let stream = compiled.createReadStream();
509+
stream.once('error', err => message.emit('error', err));
510+
stream.pipe(collector).pipe(message);
503511
}
504-
);
512+
});
505513
};
506514

507515
addToDeliveryQueue((err, outbound) => {

0 commit comments

Comments
 (0)