Dans un billet précédent, je vous avais montré comment on pouvait personnaliser l'apparence des emails générés par les alertes de recherche. Cependant, lors de la phase de développement de cette apparence, il serait bien que l'on puisse générer l'email à envoyer, pour pouvoir vérifier que le résultat correspond bien au besoin.
Je sais que cela devient lourd à la longue :-) mais en "introspectant" l'assembly Microsoft.Office.Server.Search grâce à .NET Reflector, on trouve la classe SearchAlertHandler, celle qui est appelée avant chaque envoi d'email (dans la configuration par défaut du template OSS.Search).
Dans cette classe, on se rend compte que SharePoint vérifie, en fonction de la périodicité de l'alerte, si il est temps d'envoyer l'email ou non. Grosso modo, il récupère la date et l'heure de création de l'alerte, ajoute le TimeSpan en fonction de la périodicité (e.g. TimeSpan.FromDays(1.0) pour les journalières et TimeSpan.FromDays(7.0) pour les hebdomadaires) et si cette date calculée n'est pas encore passée, alors l'envoi est annulé ….
En conclusion, pour envoyer l'email, il faut tricher, et modifier la date de création de l'alerte (ôter un jour pour une journalière ou 7 pour une hebdomadaire) et ainsi l'email partira.
Ci-dessous, un petit bout du code. L'idée serait bien entendu de l'encapsuler dans une commande stsadm (idéalement) ou une application console.
1: using (SPSite site = new SPSite("http://SHAREPOINT/Site_de_Recherche")) 2: { 3: using (SPWeb web = site.OpenWeb())
4: { 5: // Pour chacune des alertes du web courant
6: foreach (SPAlert alert in web.CurrentUser.Alerts)
7: { 8: // On vérifie si c'est bien une alerte de recherche
9: if (alert.AlertTemplate.DisplayName == "OSS.Search")
10: { 11: // Si c'est la cas, on calcule l'intervalle à retirer, en fonction de la périodicité
12: TimeSpan offset = (alert.AlertFrequency == SPAlertFrequency.Weekly ? TimeSpan.FromDays(7.0) : TimeSpan.FromDays(1.0));
13: alert.AlertTime = alert.AlertTime - offset;
14: // Important!
15: alert.Update();
16: }
17: }
18: }
19: }
20:
Vous pouvez maintenant créer une alerte de recherche, et exécuter le code précédent. Ainsi, lors du prochain passage dans la classe SearchAlertHandler, nos alertes de recherches seront envoyées. …