diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 71f0f65f34..fce6f05b7e 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -839,7 +839,7 @@ public class ServiceSynchronize extends LifecycleService { doDelete(folder, ifolder, message, jargs, db); else if (EntityOperation.SEND.equals(op.name)) - doSend(db, message); + doSend(isession, message, db); else if (EntityOperation.ATTACHMENT.equals(op.name)) doAttachment(folder, op, ifolder, message, jargs, db); @@ -850,6 +850,10 @@ public class ServiceSynchronize extends LifecycleService { // Operation succeeded db.operation().deleteOperation(op.id); } catch (Throwable ex) { + // TODO: SMTP response codes: https://www.ietf.org/rfc/rfc821.txt + if (ex instanceof SMTPSendFailedException) + reportError(null, folder.name, ex); + db.message().setMessageError(message.id, Helper.formatThrowable(ex)); if (BuildConfig.DEBUG && ex instanceof NullPointerException) { @@ -960,7 +964,7 @@ public class ServiceSynchronize extends LifecycleService { db.message().deleteMessage(message.id); } - private void doSend(DB db, EntityMessage message) throws MessagingException { + private void doSend(Session isession, EntityMessage message, DB db) throws MessagingException { // Send message EntityIdentity ident = db.identity().getIdentity(message.identity); EntityMessage reply = (message.replying == null ? null : db.message().getMessage(message.replying)); @@ -971,10 +975,6 @@ public class ServiceSynchronize extends LifecycleService { return; } - // Create session - Properties props = MessageHelper.getSessionProperties(); - Session isession = Session.getInstance(props, null); - // Create message MimeMessage imessage; if (reply == null) @@ -992,16 +992,10 @@ public class ServiceSynchronize extends LifecycleService { itransport.connect(ident.host, ident.port, ident.user, ident.password); // Send message - try { - Address[] to = imessage.getAllRecipients(); - itransport.sendMessage(imessage, to); - Log.i(Helper.TAG, "Sent via " + ident.host + "/" + ident.user + - " to " + TextUtils.join(", ", to)); - } catch (SMTPSendFailedException ex) { - // TODO: response codes: https://www.ietf.org/rfc/rfc821.txt - db.message().setMessageError(message.id, Helper.formatThrowable(ex)); - throw ex; - } + Address[] to = imessage.getAllRecipients(); + itransport.sendMessage(imessage, to); + Log.i(Helper.TAG, "Sent via " + ident.host + "/" + ident.user + + " to " + TextUtils.join(", ", to)); try { db.beginTransaction(); @@ -1488,13 +1482,18 @@ public class ServiceSynchronize extends LifecycleService { @Override public void onReceive(Context context, Intent intent) { Log.i(Helper.TAG, outbox.name + " run operations"); + + // Create session + Properties props = MessageHelper.getSessionProperties(); + final Session isession = Session.getInstance(props, null); + try { executor.submit(new Runnable() { @Override public void run() { try { Log.i(Helper.TAG, outbox.name + " start operations"); - processOperations(outbox, null, null, null); + processOperations(outbox, isession, null, null); } catch (Throwable ex) { Log.e(Helper.TAG, outbox.name + " " + ex + "\n" + Log.getStackTraceString(ex)); reportError(null, outbox.name, ex);