diff --git a/FAQ.md b/FAQ.md index 039847c57c..a2d70b2c14 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1055,6 +1055,7 @@ Too large messages and triggering the spam filter of an email server are the mos * The attachment size limit for Yahoo [is 25 MB](https://help.yahoo.com/kb/SLN5673.html) * *554 5.7.1 Service unavailable; Client host xxx.xxx.xxx.xxx blocked*, please [see here](https://docs.gandi.net/en/gandimail/faq/error_types/554_5_7_1_service_unavailable.html) * *501 Syntax error - line too long* is often caused by using a long Autocrypt header +* *503 5.5.0 Recipient already specified* mostly means that an address is being used both as TO and CC address **Gmail errors** diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index d56608dc27..a52b846550 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -4502,6 +4502,23 @@ public class FragmentCompose extends FragmentBase { checkAddress(ato, context); checkAddress(acc, context); checkAddress(abcc, context); + + List all = new ArrayList<>(); + List dup = new ArrayList<>(); + for (InternetAddress a : Helper.concat(Helper.concat(ato, acc), abcc)) { + String email = a.getAddress(); + if (TextUtils.isEmpty(email)) + continue; + if (all.contains(a.getAddress())) + dup.add(email); + else + all.add(email); + } + + if (dup.size() > 0) + throw new AddressException(context.getString( + R.string.title_address_duplicate, + TextUtils.join(", ", dup))); } catch (AddressException ex) { args.putString("address_error", ex.getMessage()); } diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 674e327cfd..8d309e62c5 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -1564,6 +1564,17 @@ public class Helper { return result; } + @SuppressWarnings("unchecked") + public static T[] concat(T[] a, T[] b) { + if (a == null) + a = (T[]) new Object[0]; + if (b == null) + b = (T[]) new Object[0]; + T[] both = Arrays.copyOf(a, a.length + b.length); + System.arraycopy(b, 0, both, a.length, b.length); + return both; + } + static boolean equal(String[] a1, String[] a2) { if (a1 == null && a2 == null) return true; diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 20ce03fd17..c32bfa4e3d 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -487,7 +487,7 @@ public class MessageHelper { if (existing != null) result.addAll(Arrays.asList(existing)); - Address[] all = imessage.getAllRecipients(); + Address[] all = imessage.getAllRecipients(); // to, cc, bcc Address[] addresses = convertAddress(InternetAddress.parse(email), identity); for (Address address : addresses) { boolean found = false; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 747c0ab21f..e2e43115eb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -664,6 +664,7 @@ Name missing Email address missing Email address invalid: \'%1$s\' + Address \'%1$s\' duplicate Address \'%1$s\' invalid: %2$s Account missing Host name missing