1
0
mirror of https://github.com/moparisthebest/mail synced 2024-11-26 02:42:17 -05:00

[WO-651] Do not error if imap upload fails after send

This commit is contained in:
Felix Hammerl 2014-10-22 12:25:27 +02:00
parent 0f800f7875
commit 5f9132ab5f
2 changed files with 142 additions and 38 deletions

View File

@ -259,7 +259,6 @@ EmailDAO.prototype.openFolder = function(options, callback) {
path: options.folder.path path: options.folder.path
}, callback); }, callback);
}; };
/** /**
* Synchronizes a folder's contents from disk to memory, i.e. if * Synchronizes a folder's contents from disk to memory, i.e. if
* a message has disappeared from the disk, this method will remove it from folder.messages, and * a message has disappeared from the disk, this method will remove it from folder.messages, and
@ -1022,22 +1021,13 @@ EmailDAO.prototype.sendEncrypted = function(options, callback) {
return callback(err); return callback(err);
} }
// upload the sent message to the sent folder if necessary // try to upload to sent, but we don't actually care if the upload failed or not
var sentFolder = _.findWhere(self._account.folders, { // this should not negatively impact the process of sending
type: FOLDER_TYPE_SENT self._uploadToSent({
});
if (self.ignoreUploadOnSent || !sentFolder || !rfcText) {
self.done();
return callback();
}
self._imapClient.uploadMessage({
path: sentFolder.path,
message: rfcText message: rfcText
}, function(err) { }, function() {
self.done(); self.done();
callback(err); callback();
}); });
}); });
}; };
@ -1072,22 +1062,13 @@ EmailDAO.prototype.sendPlaintext = function(options, callback) {
return callback(err); return callback(err);
} }
// upload the sent message to the sent folder if necessary // try to upload to sent, but we don't actually care if the upload failed or not
var sentFolder = _.findWhere(self._account.folders, { // this should not negatively impact the process of sending
type: FOLDER_TYPE_SENT self._uploadToSent({
});
if (self.ignoreUploadOnSent || !sentFolder || !rfcText) {
self.done();
return callback();
}
self._imapClient.uploadMessage({
path: sentFolder.path,
message: rfcText message: rfcText
}, function(err) { }, function() {
self.done(); self.done();
callback(err); callback();
}); });
}); });
}; };
@ -1567,6 +1548,20 @@ EmailDAO.prototype._imapListMessages = function(options, callback) {
self._imapClient.listMessages(options, callback); self._imapClient.listMessages(options, callback);
}; };
/**
* Uploads a built message to a folder
*
* @param {Object} options.folder The folder where to find the message
* @param {String} options.message The rfc2822 compatible raw ASCII e-mail source
* @param {Function} callback (error) The callback when the imap client is done uploading
*/
EmailDAO.prototype._imapUploadMessage = function(options, callback) {
this._imapClient.uploadMessage({
path: options.folder.path,
message: options.message
}, callback);
};
/** /**
* Stream an email messsage's body * Stream an email messsage's body
* @param {String} options.folder The folder * @param {String} options.folder The folder
@ -1653,6 +1648,48 @@ EmailDAO.prototype._localDeleteMessage = function(options, callback) {
}; };
//
//
// Internal Helper Methods
//
//
/**
* Uploads a message to the sent folder, if necessary.
* Calls back immediately if ignoreUploadOnSent == true or not sent folder was found.
*
* @param {String} options.message The rfc2822 compatible raw ASCII e-mail source
* @param {Function} callback (error) The callback when the imap client is done uploading
*/
EmailDAO.prototype._uploadToSent = function(options, callback) {
var self = this;
self.busy();
// upload the sent message to the sent folder if necessary
var sentFolder = _.findWhere(self._account.folders, {
type: FOLDER_TYPE_SENT
});
// return for wrong usage
if (self.ignoreUploadOnSent || !sentFolder || !options.message) {
self.done();
return callback();
}
// upload
self._imapUploadMessage({
folder: sentFolder,
message: options.message
}, function(err) {
self.done();
callback(err);
});
};
// //
// //
// Helper Functions // Helper Functions

View File

@ -1565,11 +1565,10 @@ describe('Email DAO unit tests', function() {
var publicKeys = ["PUBLIC KEY"], var publicKeys = ["PUBLIC KEY"],
dummyMail = { dummyMail = {
publicKeysArmored: publicKeys publicKeysArmored: publicKeys
}; },
msg = 'wow. such message. much rfc2822.';
it('should send encrypted and upload to sent', function(done) { it('should send encrypted and upload to sent', function(done) {
var msg = 'wow. such message. much rfc2822.';
imapClientStub.uploadMessage.withArgs({ imapClientStub.uploadMessage.withArgs({
path: sentFolder.path, path: sentFolder.path,
message: msg message: msg
@ -1595,8 +1594,6 @@ describe('Email DAO unit tests', function() {
}); });
it('should send encrypted and not upload to sent', function(done) { it('should send encrypted and not upload to sent', function(done) {
var msg = 'wow. such message. much rfc2822.';
dao.ignoreUploadOnSent = true; dao.ignoreUploadOnSent = true;
pgpMailerStub.send.withArgs({ pgpMailerStub.send.withArgs({
@ -1618,6 +1615,22 @@ describe('Email DAO unit tests', function() {
}); });
}); });
it('should send encrypted and ignore error on upload', function(done) {
imapClientStub.uploadMessage.yields(new Error());
pgpMailerStub.send.yieldsAsync(null, msg);
dao.sendEncrypted({
email: dummyMail
}, function(err) {
expect(err).to.not.exist;
expect(pgpMailerStub.send.calledOnce).to.be.true;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done();
});
});
it('should not send when pgpmailer fails', function(done) { it('should not send when pgpmailer fails', function(done) {
pgpMailerStub.send.yieldsAsync({}); pgpMailerStub.send.yieldsAsync({});
@ -1648,10 +1661,9 @@ describe('Email DAO unit tests', function() {
describe('#sendPlaintext', function() { describe('#sendPlaintext', function() {
var dummyMail = {}; var dummyMail = {};
var msg = 'wow. such message. much rfc2822.';
it('should send in the plain and upload to sent', function(done) { it('should send in the plain and upload to sent', function(done) {
var msg = 'wow. such message. much rfc2822.';
pgpMailerStub.send.withArgs({ pgpMailerStub.send.withArgs({
smtpclient: undefined, smtpclient: undefined,
mail: dummyMail mail: dummyMail
@ -1673,8 +1685,6 @@ describe('Email DAO unit tests', function() {
}); });
it('should send in the plain and not upload to sent', function(done) { it('should send in the plain and not upload to sent', function(done) {
var msg = 'wow. such message. much rfc2822.';
dao.ignoreUploadOnSent = true; dao.ignoreUploadOnSent = true;
pgpMailerStub.send.withArgs({ pgpMailerStub.send.withArgs({
@ -1692,6 +1702,22 @@ describe('Email DAO unit tests', function() {
}); });
}); });
it('should send and ignore error on upload', function(done) {
imapClientStub.uploadMessage.yields(new Error());
pgpMailerStub.send.yieldsAsync(null, msg);
dao.sendEncrypted({
email: dummyMail
}, function(err) {
expect(err).to.not.exist;
expect(pgpMailerStub.send.calledOnce).to.be.true;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done();
});
});
it('should not send due to error', function(done) { it('should not send due to error', function(done) {
pgpMailerStub.send.yieldsAsync({}); pgpMailerStub.send.yieldsAsync({});
@ -2189,6 +2215,27 @@ describe('Email DAO unit tests', function() {
}); });
}); });
describe('#_imapUploadMessage', function() {
it('should upload a message', function(done) {
var msg = 'wow. such message. much rfc2822.';
imapClientStub.uploadMessage.withArgs({
path: draftsFolder.path,
message: msg
}).yields();
dao._imapUploadMessage({
folder: draftsFolder,
message: msg
}, function(err) {
expect(err).to.not.exist;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done();
});
});
});
describe('#_getBodyParts', function() { describe('#_getBodyParts', function() {
it('should get bodyParts', function(done) { it('should get bodyParts', function(done) {
imapClientStub.getBodyParts.withArgs({ imapClientStub.getBodyParts.withArgs({
@ -2297,5 +2344,25 @@ describe('Email DAO unit tests', function() {
}); });
}); });
describe('#_uploadToSent', function() {
it('should upload', function(done) {
var msg = 'wow. such message. much rfc2822.';
imapClientStub.uploadMessage.withArgs({
path: sentFolder.path,
message: msg
}).yields();
dao._uploadToSent({
message: msg
}, function(err) {
expect(err).to.not.exist;
expect(imapClientStub.uploadMessage.calledOnce).to.be.true;
done();
});
});
});
}); });
}); });