diff --git a/app/src/main/java/eu/faircode/email/ServiceSend.java b/app/src/main/java/eu/faircode/email/ServiceSend.java index 10203cb365..baeaf356cb 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSend.java +++ b/app/src/main/java/eu/faircode/email/ServiceSend.java @@ -802,7 +802,7 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar long start = 0; long end = 0; Long max_size = null; - SMTPSendFailedException partial = null; + SendFailedException partial = null; if (ident.auth_type == AUTH_TYPE_GRAPH) { start = new Date().getTime(); MicrosoftGraph.send(ServiceSend.this, ident, imessage); @@ -919,6 +919,36 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar start = new Date().getTime(); try { iservice.getTransport().sendMessage(imessage, rcptto); + } catch (SendFailedException ex) { + StringBuilder info = new StringBuilder(); + + List failed = new ArrayList<>(); + Address[] addresses = ex.getInvalidAddresses(); + if (addresses != null) + for (Address address : addresses) + if (address instanceof InternetAddress) { + String email = ((InternetAddress) address).getAddress(); + if (!TextUtils.isEmpty(email)) + failed.add(email); + } + if (!failed.isEmpty()) + info.append('\n').append("Invalid: ").append(TextUtils.join(", ", failed)); + + if (ex instanceof SMTPSendFailedException) { + SMTPSendFailedException e = (SMTPSendFailedException) ex; + if (info.length() > 0) + info.append('\n'); + info.append("SMTP cmd=").append(e.getCommand()) + .append(" rc=").append(e.getReturnCode()); + } + + throw new SendFailedException( + getString(R.string.title_service_auth, ex.getMessage()) + info, + ex.getNextException(), + ex.getValidSentAddresses(), + ex.getValidUnsentAddresses(), + ex.getInvalidAddresses()); + } finally { end = new Date().getTime(); } @@ -928,24 +958,17 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar iservice.dump(ident.email); Log.e(ex); - if (ex instanceof SMTPSendFailedException) { - SMTPSendFailedException sem = (SMTPSendFailedException) ex; - if (send_partial && - sem.getInvalidAddresses() != null && - sem.getValidSentAddresses() != null && - sem.getValidUnsentAddresses() != null && - sem.getValidSentAddresses().length > 0 && - sem.getInvalidAddresses().length + sem.getValidUnsentAddresses().length > 0) { - partial = sem; - } - ex = new SMTPSendFailedException( - sem.getCommand(), - sem.getReturnCode(), - getString(R.string.title_service_auth, sem.getMessage()), - sem.getNextException(), - sem.getValidSentAddresses(), - sem.getValidUnsentAddresses(), - sem.getInvalidAddresses()); + if (send_partial && ex instanceof SendFailedException) { + SendFailedException sem = (SendFailedException) ex; + int unsent = (sem.getValidUnsentAddresses() == null ? 0 : sem.getValidUnsentAddresses().length); + int invalid = (sem.getInvalidAddresses() == null ? 0 : sem.getInvalidAddresses().length); + if (unsent + invalid > 0) + partial = new SendFailedException( + getString(R.string.title_advanced_sent_partially) + "\n" + sem.getMessage(), + sem.getNextException(), + sem.getValidSentAddresses(), + sem.getValidUnsentAddresses(), + sem.getInvalidAddresses()); } if (sid != null && partial == null) @@ -976,12 +999,11 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar if (partial == null) db.message().deleteMessage(message.id); else { - Throwable ex = new Throwable(getString(R.string.title_advanced_sent_partially), partial); - db.message().setMessageWarning(message.id, Log.formatThrowable(ex)); + db.message().setMessageWarning(message.id, Log.formatThrowable(partial)); if (NotificationHelper.areNotificationsEnabled(nm)) { NotificationCompat.Builder builder = getNotificationError( MessageHelper.formatAddressesShort(message.to), - ex, 0); + partial, 0); nm.notify("partial:" + message.id, NotificationHelper.NOTIFICATION_TAGGED, builder.build()); @@ -1007,6 +1029,7 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar DB.Converters.encodeAddresses(MessageHelper.removeAddresses(message.cc, unsent))); db.message().setMessageBcc(sid, DB.Converters.encodeAddresses(MessageHelper.removeAddresses(message.bcc, unsent))); + db.message().setMessageWarning(sid, Log.formatThrowable(partial)); } db.message().setMessageReceived(sid, start);