Add config to force http unsub for a certain set of users (#2425)

This commit is contained in:
Adrià Casajús 2025-03-26 10:56:59 +01:00 committed by GitHub
parent 9e8ee6467c
commit a0ba3b1a71
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 13 additions and 6 deletions

View file

@ -195,6 +195,7 @@ DISABLE_ALIAS_SUFFIX = "DISABLE_ALIAS_SUFFIX" in os.environ
# the email address that receives all unsubscription request # the email address that receives all unsubscription request
UNSUBSCRIBER = os.environ.get("UNSUBSCRIBER") UNSUBSCRIBER = os.environ.get("UNSUBSCRIBER")
USERS_WITH_HTTP_UNSUBSCRIBE = get_env_csv("USERS_WITH_HTTP_UNSUBSCRIBE", "")
# due to a typo, both UNSUBSCRIBER and OLD_UNSUBSCRIBER are supported # due to a typo, both UNSUBSCRIBER and OLD_UNSUBSCRIBER are supported
OLD_UNSUBSCRIBER = os.environ.get("OLD_UNSUBSCRIBER") OLD_UNSUBSCRIBER = os.environ.get("OLD_UNSUBSCRIBER")

View file

@ -17,7 +17,7 @@ from app.models import Alias, Contact, UnsubscribeBehaviourEnum
class UnsubscribeGenerator: class UnsubscribeGenerator:
def _calculate_header_with_original_behaviour( def _calculate_header_with_original_behaviour(
self, alias: Alias, message: Message self, alias: Alias, message: Message, force_web: bool = False
) -> dict[str, str]: ) -> dict[str, str]:
""" """
Generate a header that will encode the original unsub request. To do so Generate a header that will encode the original unsub request. To do so
@ -83,6 +83,7 @@ class UnsubscribeGenerator:
unsub_link = UnsubscribeEncoder.encode( unsub_link = UnsubscribeEncoder.encode(
UnsubscribeAction.OriginalUnsubscribeMailto, UnsubscribeAction.OriginalUnsubscribeMailto,
UnsubscribeOriginalData(alias.id, mailto_unsubs[0], mailto_unsubs[1]), UnsubscribeOriginalData(alias.id, mailto_unsubs[0], mailto_unsubs[1]),
force_web=force_web,
) )
LOG.debug(f"Adding unsub link {unsub_link.link}") LOG.debug(f"Adding unsub link {unsub_link.link}")
out = {headers.LIST_UNSUBSCRIBE: f"<{unsub_link.link}>"} out = {headers.LIST_UNSUBSCRIBE: f"<{unsub_link.link}>"}
@ -100,9 +101,11 @@ class UnsubscribeGenerator:
return message return message
def _add_unsubscribe_header( def _add_unsubscribe_header(
self, message: Message, unsub: UnsubscribeData self, message: Message, unsub: UnsubscribeData, force_web: bool = False
) -> Message: ) -> Message:
unsub_link = UnsubscribeEncoder.encode(unsub.action, unsub.data) unsub_link = UnsubscribeEncoder.encode(
unsub.action, unsub.data, force_web=force_web
)
add_or_replace_header(message, headers.LIST_UNSUBSCRIBE, f"<{unsub_link.link}>") add_or_replace_header(message, headers.LIST_UNSUBSCRIBE, f"<{unsub_link.link}>")
if not unsub_link.via_email: if not unsub_link.via_email:
@ -117,19 +120,22 @@ class UnsubscribeGenerator:
""" """
Add List-Unsubscribe header based on the user preference. Add List-Unsubscribe header based on the user preference.
""" """
force_web = False
if alias.user_id in config.USERS_WITH_HTTP_UNSUBSCRIBE:
force_web = True
unsub_behaviour = alias.user.unsub_behaviour unsub_behaviour = alias.user.unsub_behaviour
original_unsub_proxied = self._calculate_header_with_original_behaviour( original_unsub_proxied = self._calculate_header_with_original_behaviour(
alias, message alias, message, force_web=force_web
) )
message = self.__preserve_original_headers(message, original_unsub_proxied) message = self.__preserve_original_headers(message, original_unsub_proxied)
if unsub_behaviour == UnsubscribeBehaviourEnum.PreserveOriginal: if unsub_behaviour == UnsubscribeBehaviourEnum.PreserveOriginal:
return self.__replace_unsub_headers(message, original_unsub_proxied) return self.__replace_unsub_headers(message, original_unsub_proxied)
elif unsub_behaviour == UnsubscribeBehaviourEnum.DisableAlias: elif unsub_behaviour == UnsubscribeBehaviourEnum.DisableAlias:
unsub = UnsubscribeData(UnsubscribeAction.DisableAlias, alias.id) unsub = UnsubscribeData(UnsubscribeAction.DisableAlias, alias.id)
return self._add_unsubscribe_header(message, unsub) return self._add_unsubscribe_header(message, unsub, force_web=force_web)
else: else:
unsub = UnsubscribeData(UnsubscribeAction.DisableContact, contact.id) unsub = UnsubscribeData(UnsubscribeAction.DisableContact, contact.id)
return self._add_unsubscribe_header(message, unsub) return self._add_unsubscribe_header(message, unsub, force_web=force_web)
def __preserve_original_headers( def __preserve_original_headers(
self, message: Message, original_unsub_proxied: dict[str, str] self, message: Message, original_unsub_proxied: dict[str, str]