Envoyer un rapport SSRS au format MHTML, en tant que corps de mail

On peut avoir besoin d’envoyer un rapport Sql Server Reporting Services (SSRS) dans un mail. En général pour cela, on génère un fichier au format choisi (PDF, Excel, Word…), qui est ajouté en pièce jointe au mail. Ceci dit on peut aussi avoir besoin d’envoyer ce rapport en tant que corps du mail, en utilisant un export au format html. A première vue ça a l’air assez basique, mais la solution technique ne l’est pas tant que ça, et on peut trouver des bouts de solutions, mais jamais la solution complète. Elle existe pourtant, et je vais la détailler.

Mais d’abord un petit rappel sur la manière dont on génère un rapport dans du code, cette génération se fait en utilisant le web service « ReportExecution2005.asmx » présent sur le serveur de rapports. Voici un exemple de code C# :

Le paramètre « format » correspond au format d’export (ici PDF), à choisir parmi les formats disponibles. Il ne reste plus qu’à écrire le contenu de la valeur de retour « results » dans un fichier avec la bonne extension, et c’est bon.

Maintenant pour générer un email avec un rapport en tant que corps de mail, le but va être de faire un rendu du rapport au format html, pour intégrer ce rendu en tant que corps d’un mail.

Reporting services supporte 2 types de format html, qui sont « HTML4.0 » et « MHTML ». Le premier format nous donne un code html compréhensible et utilisable, mais si le rapport contient des images, elles sont fournies comme des liens vers le serveur de rapport, ce qui n’est pas acceptable, les images doivent être intégrées dans l’email. On va donc se diriger vers le format « MHTML », qui contient toutes les données et est normalement adapté à ce genre d’usage.

Ceci dit en essayant de générer un rapport en MHTML, on se rend compte que le contenu est encodé en base64, et s’il peut être ouvert dans un navigateur, ce contenu n’est pas reconnu par les clients email et il ne peut donc pas être envoyé tel quel.

On peut essayer de décoder ce contenu (c’est assez complexe), mais il existe une solution beaucoup plus simple si on s’intéresse au paramètre « deviceInfo » de la fonction de rendu du web service SSRS. Ce paramètre, souvent passé à null pour avoir des valeurs par défaut, est en fait un descriptif au format XML, permettant de positionner certaines valeurs pour le rendu. Parmi ces valeurs, il y a l’attribut « MHTMLFragment » qui permet de déterminer si on doit générer le html avec les tags html et body, ou s’il est intégré dans un tag table, et surtout l’attribut « OutlookCompat » qui a l’air intéressant dans le cadre d’une utilisation pour un email.

On peut donc essayer de générer le rapport au format MHTML, en utilisant la valeur de deviceInfo :

<DeviceInfo><OutlookCompat>True</OutlookCompat><MHTMLFragment>True</MHTMLFragment></DeviceInfo>

En regardant le résultat, on voit enfin du html utilisable, mais les images ne sont pas présentes. Ceci dit les références à ces images dans le html sont sous la forme « cid:a64b27da3c7a464d9102053b5fa7e8d1 », qui ressemble bien à ce qu’on trouve dans un email html, on approche. Reste à trouver à quoi correspond cette valeur, et où trouver l’image en question. La piste se trouve en regardant le contenu de la variable de sortie streamIDs, récupérée dans la fonction de rendu du rapport. Cette variable contient en fait la liste des codes correspondant aux liens vers les images du rapport, bingo ! il reste ensuite à récupérer le contenu de ces images à partir de ces streamIDs, pour pouvoir les intégrer au mail. Ceci se fait grâce à une autre fonction du web service de SSRS : « RenderStream ».

On a donc le html, les images et la liaison entre les deux grâce à ces ID, il ne reste plus qu’à construire un mail avec toutes ces données ! Si on utilise la classe « MailMessage » du Framework .NET, il va nous falloir passer par un objet de type « AlternateView », qui permet de définir des ressources liées au mail telles les images insérées. Voici donc un exemple de code final en C# qui permet de générer un tel mail :

Il faut juste rajouter certaines données à l’email (expéditeur, destinataire, sujet…), et il est prêt à être envoyé !

La procédure n’est pas très compliquée, mais reste mal documentée, j’espère que ce petit article sera utile.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.