fix: use %20 encoding instead of + for Outlook deeplink body and add --only option

This commit is contained in:
kdeterme 2026-09-04 09:41:04 +02:00
parent a1f8b4412e
commit 4bb57962dc
2 changed files with 31 additions and 11 deletions

View file

@ -302,12 +302,12 @@ class Command(BaseCommand):
"source_user": source_user.username, "source_user": source_user.username,
}) })
# URL Outlook Web Deep Link pour composer directement # URL Outlook Web Deep Link pour composer directement (%20 au lieu de + pour les espaces)
deeplink_params = urllib.parse.urlencode({ deeplink_params = urllib.parse.urlencode({
"to": email, "to": email,
"subject": subject, "subject": subject,
"body": body, "body": body,
}) }, quote_via=urllib.parse.quote)
outlook_deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{deeplink_params}" outlook_deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{deeplink_params}"
drafts_payload.append({ drafts_payload.append({

View file

@ -94,8 +94,8 @@ def main():
parser.add_argument( parser.add_argument(
"--delay", "--delay",
type=float, type=float,
default=2.5, default=6.0,
help="Délai en secondes entre l'ouverture de chaque brouillon en mode automatique (défaut : 2.5s).", help="Délai en secondes entre l'ouverture de chaque brouillon en mode automatique (défaut : 6.0s).",
) )
parser.add_argument( parser.add_argument(
"--step", "--step",
@ -103,6 +103,12 @@ def main():
default=False, default=False,
help="Mode pas-à-pas : demande confirmation avant d'ouvrir chaque brouillon.", help="Mode pas-à-pas : demande confirmation avant d'ouvrir chaque brouillon.",
) )
parser.add_argument(
"--only",
type=str,
default=None,
help="Filtre pour n'ouvrir que les brouillons correspondant à ce texte (nom, email ou login).",
)
parser.add_argument( parser.add_argument(
"--dry-run", "--dry-run",
action="store_true", action="store_true",
@ -136,6 +142,18 @@ def main():
print("Aucun brouillon trouvé dans la charge utile.") print("Aucun brouillon trouvé dans la charge utile.")
return return
if args.only:
pattern = args.only.lower()
drafts = [
d
for d in drafts
if pattern in d.get("to", "").lower()
or pattern in d.get("first_name", "").lower()
or pattern in d.get("last_name", "").lower()
or pattern in d.get("username", "").lower()
]
print(f"Filtre '{args.only}' appliqué : {len(drafts)} brouillon(s) sélectionné(s).")
print(f"Chargement de {len(drafts)} brouillon(s) depuis {payload_file.name}...") print(f"Chargement de {len(drafts)} brouillon(s) depuis {payload_file.name}...")
# Mode HTML # Mode HTML
@ -189,17 +207,19 @@ def main():
for idx, item in enumerate(drafts, start=1): for idx, item in enumerate(drafts, start=1):
to_email = item.get("to", "") to_email = item.get("to", "")
subject = item.get("subject", "") subject = item.get("subject", "")
deeplink = item.get("outlook_deeplink")
first_name = item.get("first_name", "") first_name = item.get("first_name", "")
last_name = item.get("last_name", "") last_name = item.get("last_name", "")
# Reconstruire le deep link pour garantir l'encodage %20 des espaces (supprime les '+' intempestifs)
if not deeplink: body = item.get("body", "")
params = urllib.parse.urlencode({ params = urllib.parse.urlencode(
{
"to": to_email, "to": to_email,
"subject": subject, "subject": subject,
"body": item.get("body", ""), "body": body,
}) },
deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{params}" quote_via=urllib.parse.quote,
)
deeplink = f"https://outlook.cloud.microsoft/mail/deeplink/compose?{params}"
print(f"[{idx}/{len(drafts)}] {first_name} {last_name} <{to_email}>") print(f"[{idx}/{len(drafts)}] {first_name} {last_name} <{to_email}>")