Skip to content

[FW][FIX] mail: multi recipient duplication (16.0)#186799

Closed
fw-bot wants to merge 3 commits intoodoo:17.0from
odoo-dev:17.0-16.0-mail_semicolon_dup-juc-pTsI-fw
Closed

[FW][FIX] mail: multi recipient duplication (16.0)#186799
fw-bot wants to merge 3 commits intoodoo:17.0from
odoo-dev:17.0-16.0-mail_semicolon_dup-juc-pTsI-fw

Conversation

@fw-bot
Copy link
Copy Markdown
Contributor

@fw-bot fw-bot commented Nov 8, 2024

Install mass-mailing and crm. Change the email address of Brandon to a@example.com;b@example.com. In the list view of crm, add the select all leads and change their customer to Brandon (the customer column is not displayed by default, just make it visible). Create a new mass-mailing with the recipient list as "Lead/Opportunity". Start the campaign. Brandon receives as many emails as there are leads but he shall only receive one.

The system has a known limitation when it comes to filtering duplicates: it skips all records that have multiple recipients. In this case Brandon has two: a@example.com and b@example.com. The de-duplication mechanism was skipped for every lead he was the customer of and each time a new email was sent, spamming him.

In this work we make it possible to also process records with multiple recipients. It is a best-effort and will still let some duplicates through. Nonetheless it solves the current problem with minimal changes.

Note: any([]) and any(['']) are both False while all([]) is True, hence we now check for empty list / empty email first otherwise an empty list would be considered to be opt-out instead of empty.

Task-3927361

Forward-Port-Of: #186149

@robodoo
Copy link
Copy Markdown
Contributor

robodoo commented Nov 8, 2024

Pull request status dashboard

@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 8, 2024

@Julien00859 @tde-banana-odoo cherrypicking of pull request #186149 failed.

stdout:

Auto-merging addons/mail/wizard/mail_compose_message.py
CONFLICT (content): Merge conflict in addons/mail/wizard/mail_compose_message.py

Either perform the forward-port manually (and push to this branch, proceeding as usual) or close this PR (maybe?).

In the former case, you may want to edit this PR message as well.

⚠️ after resolving this conflict, you will need to merge it via @robodoo.

More info at https://github.com/odoo/odoo/wiki/Mergebot#forward-port

@robodoo robodoo added forwardport This PR was created by @fw-bot conflict There was an error while creating this forward-port PR labels Nov 8, 2024
@C3POdoo C3POdoo added the RD research & development, internal work label Nov 8, 2024
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 12, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

It is faster to check first if the emails are empty than to look them up
inside the optout/done lists. But frankly this commit is only here to
simplify the diff with the next commit.

Task-3927361

X-original-commit: d38aeef
@Julien00859 Julien00859 force-pushed the 17.0-16.0-mail_semicolon_dup-juc-pTsI-fw branch from 9732ef0 to 0d0c26a Compare November 12, 2024 15:25
@C3POdoo C3POdoo requested review from a team November 12, 2024 15:27
@Julien00859 Julien00859 force-pushed the 17.0-16.0-mail_semicolon_dup-juc-pTsI-fw branch from 0d0c26a to e61bc03 Compare November 12, 2024 15:48
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 13, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

@tde-banana-odoo
Copy link
Copy Markdown
Contributor

@Julien00859 Some tests are failing :(

@Julien00859 Julien00859 force-pushed the 17.0-16.0-mail_semicolon_dup-juc-pTsI-fw branch from e61bc03 to 2c88aea Compare November 13, 2024 18:14
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 14, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

1 similar comment
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 15, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

Install mass-mailing and crm. Change the email address of Brandon to
`a@example.com;b@example.com`. In the list view of crm, add the select
all leads and change their customer to Brandon (the customer column is
not displayed by default, just make it visible). Create a new mass-
mailing with the recipient list as "Lead/Opportunity". Start the
campaign. Brandon receives as many emails as there are leads but he
shall only receive one.

The system has a known limitation when it comes to filtering duplicates:
it skips all records that have multiple recipients. In this case Brandon
has two: a@example.com and b@example.com. The de-duplication mechanism
was skipped for every lead he was the customer of and each time a new
email was sent, spamming him.

In this work we make it possible to also process records with multiple
recipients. It is a best-effort and will still let some duplicates
through. Nonetheless it solves the current problem with minimal changes.

Note: `any([])` and `any([''])` are both False while `all([])` is True,
hence we now check for empty list / empty email first otherwise an empty
list would be considered to be opt-out instead of empty.

Task-3927361

X-original-commit: 66b9b43
The `_get_done_emails` and `_get_optout_emails` are returning normalized
emails, hence we should compare the normalized email address of the
recipient against those lists.

Enforced the normalization, email normalisation is fast and idempotent,
there is no problem (nor functional-wise, nor performance-wise) to
re-normalize those emails.

Task-3927361

X-original-commit: 0819a81
@Julien00859 Julien00859 force-pushed the 17.0-16.0-mail_semicolon_dup-juc-pTsI-fw branch from a63560c to ecf0441 Compare November 15, 2024 11:50
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 16, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

3 similar comments
@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 17, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 18, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

@fw-bot
Copy link
Copy Markdown
Contributor Author

fw-bot commented Nov 20, 2024

@Julien00859 @tde-banana-odoo this forward port of #186149 is awaiting action (not merged or closed).

Copy link
Copy Markdown
Member

@Julien00859 Julien00859 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

robodoo pushed a commit that referenced this pull request Nov 25, 2024
It is faster to check first if the emails are empty than to look them up
inside the optout/done lists. But frankly this commit is only here to
simplify the diff with the next commit.

Task-3927361

X-original-commit: d38aeef
Part-of: #186799
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
robodoo pushed a commit that referenced this pull request Nov 25, 2024
Install mass-mailing and crm. Change the email address of Brandon to
`a@example.com;b@example.com`. In the list view of crm, add the select
all leads and change their customer to Brandon (the customer column is
not displayed by default, just make it visible). Create a new mass-
mailing with the recipient list as "Lead/Opportunity". Start the
campaign. Brandon receives as many emails as there are leads but he
shall only receive one.

The system has a known limitation when it comes to filtering duplicates:
it skips all records that have multiple recipients. In this case Brandon
has two: a@example.com and b@example.com. The de-duplication mechanism
was skipped for every lead he was the customer of and each time a new
email was sent, spamming him.

In this work we make it possible to also process records with multiple
recipients. It is a best-effort and will still let some duplicates
through. Nonetheless it solves the current problem with minimal changes.

Note: `any([])` and `any([''])` are both False while `all([])` is True,
hence we now check for empty list / empty email first otherwise an empty
list would be considered to be opt-out instead of empty.

Task-3927361

X-original-commit: 66b9b43
Part-of: #186799
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
robodoo pushed a commit that referenced this pull request Nov 25, 2024
The `_get_done_emails` and `_get_optout_emails` are returning normalized
emails, hence we should compare the normalized email address of the
recipient against those lists.

Enforced the normalization, email normalisation is fast and idempotent,
there is no problem (nor functional-wise, nor performance-wise) to
re-normalize those emails.

Task-3927361

X-original-commit: 0819a81
Part-of: #186799
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
robodoo added a commit that referenced this pull request Nov 25, 2024
Install mass-mailing and crm. Change the email address of Brandon to a@example.com;b@example.com. In the list view of crm, add the select all leads and change their customer to Brandon (the customer column is not displayed by default, just make it visible). Create a new mass-mailing with the recipient list as "Lead/Opportunity". Start the campaign. Brandon receives as many emails as there are leads but he shall only receive one.

The system has a known limitation when it comes to filtering duplicates: it skips all records that have multiple recipients. In this case Brandon has two: [a@example.com](mailto:a@example.com) and [b@example.com](mailto:b@example.com). The de-duplication mechanism was skipped for every lead he was the customer of and each time a new email was sent, spamming him.

In this work we make it possible to also process records with multiple recipients. It is a best-effort and will still let some duplicates through. Nonetheless it solves the current problem with minimal changes.

Note: any([]) and any(['']) are both False while all([]) is True, hence we now check for empty list / empty email first otherwise an empty list would be considered to be opt-out instead of empty.

Task-3927361

closes #186799

Forward-port-of: #186149
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
@robodoo robodoo closed this Nov 25, 2024
robodoo added a commit that referenced this pull request Nov 28, 2024
Install mass-mailing and crm. Change the email address of Brandon to a@example.com;b@example.com. In the list view of crm, add the select all leads and change their customer to Brandon (the customer column is not displayed by default, just make it visible). Create a new mass-mailing with the recipient list as "Lead/Opportunity". Start the campaign. Brandon receives as many emails as there are leads but he shall only receive one.

The system has a known limitation when it comes to filtering duplicates: it skips all records that have multiple recipients. In this case Brandon has two: [a@example.com](mailto:a@example.com) and [b@example.com](mailto:b@example.com). The de-duplication mechanism was skipped for every lead he was the customer of and each time a new email was sent, spamming him.

In this work we make it possible to also process records with multiple recipients. It is a best-effort and will still let some duplicates through. Nonetheless it solves the current problem with minimal changes.

Note: any([]) and any(['']) are both False while all([]) is True, hence we now check for empty list / empty email first otherwise an empty list would be considered to be opt-out instead of empty.

Task-3927361

closes #188449

Forward-port-of: #186799
Forward-port-of: #186149
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
robodoo added a commit that referenced this pull request Nov 28, 2024
Install mass-mailing and crm. Change the email address of Brandon to a@example.com;b@example.com. In the list view of crm, add the select all leads and change their customer to Brandon (the customer column is not displayed by default, just make it visible). Create a new mass-mailing with the recipient list as "Lead/Opportunity". Start the campaign. Brandon receives as many emails as there are leads but he shall only receive one.

The system has a known limitation when it comes to filtering duplicates: it skips all records that have multiple recipients. In this case Brandon has two: [a@example.com](mailto:a@example.com) and [b@example.com](mailto:b@example.com). The de-duplication mechanism was skipped for every lead he was the customer of and each time a new email was sent, spamming him.

In this work we make it possible to also process records with multiple recipients. It is a best-effort and will still let some duplicates through. Nonetheless it solves the current problem with minimal changes.

Note: any([]) and any(['']) are both False while all([]) is True, hence we now check for empty list / empty email first otherwise an empty list would be considered to be opt-out instead of empty.

Task-3927361

closes #188426

Forward-port-of: #186799
Forward-port-of: #186149
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
robodoo added a commit that referenced this pull request Nov 28, 2024
Install mass-mailing and crm. Change the email address of Brandon to a@example.com;b@example.com. In the list view of crm, add the select all leads and change their customer to Brandon (the customer column is not displayed by default, just make it visible). Create a new mass-mailing with the recipient list as "Lead/Opportunity". Start the campaign. Brandon receives as many emails as there are leads but he shall only receive one.

The system has a known limitation when it comes to filtering duplicates: it skips all records that have multiple recipients. In this case Brandon has two: [a@example.com](mailto:a@example.com) and [b@example.com](mailto:b@example.com). The de-duplication mechanism was skipped for every lead he was the customer of and each time a new email was sent, spamming him.

In this work we make it possible to also process records with multiple recipients. It is a best-effort and will still let some duplicates through. Nonetheless it solves the current problem with minimal changes.

Note: any([]) and any(['']) are both False while all([]) is True, hence we now check for empty list / empty email first otherwise an empty list would be considered to be opt-out instead of empty.

Task-3927361

closes #188469

Forward-port-of: #186799
Forward-port-of: #186149
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
@fw-bot fw-bot deleted the 17.0-16.0-mail_semicolon_dup-juc-pTsI-fw branch December 9, 2024 11:46
xmo-odoo added a commit to odoo-dev/odoo that referenced this pull request Jul 16, 2025
Not sure why odoo#186799 used a super complicated lookup and matching with
inconsistent types just to find the recipient for the subtest, or why
it was replaced by something straightforward in odoo#189071 but that was
never backported.

In 3.13 this triggers a warning from the ORM, not sure why not
before (can't see anything in the changelog, but it might be from a
side-effect e.g. `locals()` ordering changed and now a non-empty dict
is tested before we find our target recipient, or since
`BaseModel.__eq__` ignores falsy objects maybe a dict which was falsy
in previous versions isn't anymore).
robodoo pushed a commit that referenced this pull request Jul 16, 2025
Not sure why #186799 used a super complicated lookup and matching with
inconsistent types just to find the recipient for the subtest, or why
it was replaced by something straightforward in #189071 but that was
never backported.

In 3.13 this triggers a warning from the ORM, not sure why not
before (can't see anything in the changelog, but it might be from a
side-effect e.g. `locals()` ordering changed and now a non-empty dict
is tested before we find our target recipient, or since
`BaseModel.__eq__` ignores falsy objects maybe a dict which was falsy
in previous versions isn't anymore).

Part-of: #219270
Related: odoo/enterprise#90352
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

conflict There was an error while creating this forward-port PR forwardport This PR was created by @fw-bot RD research & development, internal work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants