Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Le Blog (Vert) d'Arnaud JUND

Bienvenue sur mon éco blog

Actualités

SharePoint - Envoi d'un document en pièce jointe

Avec SharePoint 2007, que ce soit SharePoint Services ou MOSS, vous pouvez depuis n'importe quel document faire un envoi par mail du document sous forme de lien.  C'est très pratique, mais cela a tout de  même un inconvénient majeur lorsque vous voulez envoyer un document à quelqu'un qui n'a pas accès au dit document, ou quelqu'un d'externe à votre plateforme SharePoint.

Voilà ce que je voulais arriver à faire : envoyer un document par mail mais en pièce jointe.

Les problèmes fonctionnels qui se sont présentés à moi :

1) L'adresse mail de destination
Tout simple, passer par une page ASPX, qui au travers d'une zone de texte demande à l'utilisateur d'introduire l'adresse mail de destination.

2) L'adresse mail de l'expéditeur :
Par défaut, l'adresse mail de l'expéditeur doit être celle de l'utilisateur qui effectue l'envoi du document.
Par contre, il se peut que l'on ne puisse pas identifier l'utilisateur (accès anonyme), alors l'adresse d'expédition sera celle configurée dans le services "Outgoing mail" de SharePoint.  Mais dans ce cas là, l'utilisateur peut lui-même introduire une adresse mail.

3) Avoir un menu personnalisé uniquement lié aux documents publiés dans mes librairies de documents. 

 

image_thumb_1_thumb_4C7B692B

4) Avoir une copie carbonne cachée :
L'envoi va se faire via un serveur SMTP, donc il faut une trace de l'envoi dans la boite mail de l'expéditeur.

Mon but ici n'est pas de faire un tutoriel sur comment écrire une feature SharePoint, de nombreux articles font ça bien mieux que moi.  Je vais juste décrire ma solution que je vous laisse étudier et utiliser à votre convenance.

Le cab file de déploiement : http://blog.jund.be/Ressources/SendDocument/SendDocument.cab
Le fichier zip avec le code source : http://blog.jund.be/Ressources/SendDocument/Send_Document.zip

Ma solution est fournie telle quelle, et ni moi, ni Vision EZOS sommes responsables de l'usage que vous en feriez.

 

Construction de la structure ma solution :

1) Nouveau projet de type "Class Library" en C# sous Visual Studio 2005, projet nommé "SendDocument"
- Ajout des référence Windows.SharePoint.Services, System, System.Data, System.Xml et System.Web
- Création de deux répertoires sur la racine du projet "DEPLOYEMENT" et "TEMPLATE"
- Création de deux répertoires dans le dossier "TEMPLATE", "FEATURES" et "LAYOUTS"
- Création d'un répertoire dans le dossier "FEATURES", "SendDocument"

 image_thumb_4_thumb_4C7B692B
 
2) Création de la page ASPX - SendDocument.aspx
- Création d'un fichier de type text nommé "SendDocument.aspx" dans le répertoire "TEMPLATE\LAYOUTS"
- Création du fichier contenant le code behind associé à la page, "SendDocument.aspx.cs" dans le répertoire "TEMPLATE\FEATURES\SendDocument"
 
Le code de la page aspx : SendDocument.aspx

<%@ Page Language="C#" MasterPageFile="~/_layouts/application.master" Inherits="SendDocument.SendDocument, SendDocument, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Your Public Key Token" %>

<asp:Content ID="Title" runat="server" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea">
    Send Document in attach by Email
</asp:Content>

<asp:Content ID="ContentMain" runat="server" ContentPlaceHolderID="PlaceHolderMain">
    <asp:Panel ID="MailDocumentPanel" runat="server">
    Please enter the destination email address :<br />
    <asp:TextBox ID="EmailAddress" runat="server" Width="300"/><br /><br />
    The sender email address :<br />
    <asp:TextBox ID="SenderAddress" runat="server" Enabled="false"  Width="300"/>
    <asp:Button ID="SendButton" runat="server" Text="Send" OnClick="SendButton_Click" /></asp:Panel>
    <asp:Label ID="Information" runat="server"/>
</asp:Content>

 
Le code behind associé  : SendDocument.aspx.cs

using System;
using System.IO;
using System.Net.Mail;
using System.Net.Mime;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.WebControls;

namespace SendDocument
{
    public class SendDocument : LayoutsPageBase
    {
        //Private Members to control debugging information and error handling
        private string debugMessage = "";
        private bool isError = false;
        private bool displaySenderTextBox = false;

        private void Page_Load(object sender, System.EventArgs e)
        {
            string smtpFromAddress = "";
            ContentPlaceHolder mainContentPlaceholder = this.Master.FindControl("PlaceHolderMain") as ContentPlaceHolder;
          
          
//Set Sender Email Address
            smtpFromAddress = GetSenderEmailAddress();
            debugMessage = debugMessage + "<br>Mail Message From Address : " + smtpFromAddress;

            ((TextBox)mainContentPlaceholder.FindControl("SenderAddress")).Text = smtpFromAddress;
            if (displaySenderTextBox)
            {
                ((TextBox)mainContentPlaceholder.FindControl("SenderAddress")).Enabled = true;
            }
        }

        //Event Handler about the Send Button
        protected void SendButton_Click(object sender, EventArgs e)
        {
            debugMessage = "<br>SendButton_Click()";
            ContentPlaceHolder mainContentPlaceholder = this.Master.FindControl("PlaceHolderMain") as ContentPlaceHolder;

            try
            {
                //Get the current SharePoint List and cast it to a Document Library
                SPList list = SPContext.Current.Web.Lists[new Guid(Request.QueryString["ListId"])];
                SPDocumentLibrary docLib = (SPDocumentLibrary)list;
                //Get the current item from this SharePoint Document Library
                int id = System.Convert.ToInt32(Request.QueryString["ItemId"]);
                SPListItem listItem = docLib.Items.GetItemById(id);
                //If there is a file associated with the SharePoint Item, the file will be send bu email as attachment
                if (listItem.File != null)
                {
                    string destinationAddress = ((TextBox)mainContentPlaceholder.FindControl("EmailAddress")).Text.Trim();
                    string senderAddress = ((TextBox)mainContentPlaceholder.FindControl("SenderAddress")).Text.Trim();
                    SendDocumentbyEmail(destinationAddress, senderAddress, "Document : " + listItem.Name + " from " + list.Title, listItem, list);
                }
            }
            catch (Exception  ex)
            {
                isError = true;
                debugMessage = debugMessage + "<br>Error - SendButton_Click() : <br>Error Message : " + ex.Message + "<br>Stack Error : " + ex.StackTrace.ToString();
            }

            //Show all debug and error messages if an error occured, othewise show a successfull message
            ((Panel)mainContentPlaceholder.FindControl("MailDocumentPanel")).Visible = false;
            if (isError)
            {
                debugMessage = debugMessage + "<br>The document has not been sent in attachment by email.";
            }
            else
            {
                debugMessage = "The document has been sent in attachment by email.";
            }
            ((Label)mainContentPlaceholder.FindControl("Information")).Text = debugMessage;
        }

        //Create a new SMTP Message and send it
        private void SendDocumentbyEmail(string destinationAddress,string senderAddress, string messageSubject, SPListItem document, SPList list)
        {
            string smtpServerAddress = "";

            string documentAuhtor = "";
            string documentName = "";
            string documentMajorVersion = "";
            string documentMinorVersion = "";
            string documentLenght = "";
            string documentUrl = "";

            string listUrl = "";
            string listName = "";

            Stream stream = null;
            try
            {
                debugMessage = debugMessage + "<br>SendDocumentbyEmail(" + destinationAddress + "," + senderAddress + "," + messageSubject + ",File,List)";
                SPWebApplication currentWebApplication = SPContext.Current.Site.WebApplication;

                //Get Information about OutboundMailServiceInstance
                SPOutboundMailServiceInstance smtpServer = currentWebApplication.OutboundMailServiceInstance;
                smtpServerAddress = smtpServer.Server.Address;
                debugMessage = debugMessage + "<br>Get OutboundMailServiceInstance Name : " + smtpServerAddress;
                //Set Document Information
                documentAuhtor = document.File.Author.ToString();
                documentName = document.File.Name;
                documentMajorVersion = document.File.MajorVersion.ToString();
                documentMinorVersion = document.File.MinorVersion.ToString();
                documentLenght = document.File.Length.ToString();
                documentUrl = document.Url.ToString();
                debugMessage = debugMessage + "<br>Get Document Information (Author, Name, Version, Lenght and Url)";

                //Set List Information
                listUrl = SPContext.Current.Web.Url + list.DefaultViewUrl;
                listName = SPContext.Current.Web.Name;

                debugMessage = debugMessage + "<br>Create MailMessage : new MailMessage(" + senderAddress + "," + destinationAddress + ")";
                MailMessage message = new MailMessage(senderAddress, destinationAddress);
                message.Subject = messageSubject;
                message.Bcc.Add(senderAddress);
                message.IsBodyHtml = true;
                message.Body = "This document was sent from the following SharePoint list: " +
                "<a href=\"" + listUrl + "\">" + listName + "</a>.<br><br>Author = " + documentAuhtor + "<br>Name : " + documentName + "<br>Major Version : " + documentMajorVersion +
                "<br>Minor Version : " + documentMinorVersion + "<br>Url : " + documentUrl;

                stream = document.File.OpenBinaryStream();
                debugMessage = debugMessage + "<br>Document Stream Opened";

                //Create the attachment without mime type information
                Attachment attachment = new Attachment(stream,"");

                attachment.Name = document.File.Name;
                message.Attachments.Add(attachment);
                debugMessage = debugMessage + "<br>Document set as attachment to the mail";

                debugMessage = debugMessage + "<br>Create SmtpClient : new SmtpClient(" + smtpServerAddress + ")";
                SmtpClient client = new SmtpClient(smtpServerAddress);

                debugMessage = debugMessage + "<br>Send the message";
                client.Send(message);

            }
            catch (Exception ex)
            {
                debugMessage = debugMessage + "<br>Error - SendDocumentbyEmail() : <br>Error Message : " + ex.Message + "<br>Stack Error : " + ex.StackTrace.ToString();
                isError = true;
            }
            finally
            {
                try
                {
                    stream.Close();
                }
                catch { }
            }

        }

        //Get the Sender Email Address
        private string GetSenderEmailAddress()
        {

            string fromEmailAddress = "";
            try
            {
                //Try to get the current connected user email address
                debugMessage = debugMessage + "<br>Get CurrentUser Email Address";
                fromEmailAddress = SPContext.Current.Web.CurrentUser.Email;
            }
            catch (Exception ex)
            {
                debugMessage = debugMessage + "<br>Error - SendButton_Click() : <br>Error Message : " + ex.Message + "<br>Stack Error : " + ex.StackTrace.ToString();
                try
                {
                    //Try to get the Sender Address used by the OutBoundMail Configuration
                    displaySenderTextBox = true;
                    debugMessage = debugMessage + "<br>Get OutboundMail Sender Mail Address";
                    fromEmailAddress = SPContext.Current.Site.WebApplication.OutboundMailSenderAddress.ToString();
                }
                catch (Exception e)
                {
                    debugMessage = debugMessage + "<br>Error - SendButton_Click() : <br>Error Message : " + e.Message + "<br>Stack Error : " + e.StackTrace.ToString();
                    fromEmailAddress = "";
                }
            }

            return fromEmailAddress;
        }

    }
}

 
3) Création de la Custom Action : Positionnement du menu "E-Mail the document" associé à chaque document publié dans SharePoint : elements.xml

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="
http://schemas.microsoft.com/sharepoint/">
    <CustomAction
        Id="SendDocument.Link"
        RegistrationType="ContentType"
        RegistrationId="0x0101"
        Location="EditControlBlock"
        Sequence="350"
        Title="E-mail the Document"
        ImageUrl="/_layouts/IMAGES/EML16.GIF"
        Description="Allows a user to send a document by email as attachment." >
        <UrlAction Url="~site/_layouts/SendDocument.aspx?ItemId={ItemId}&amp;ListId={ListId}"/>
    </CustomAction>
</Elements>


RegistrationType="ContentType" & RegistrationId = "0x0101", positionne donc cette action sur tout les éléments dont le content type est équivalent à un document.
Location="EditControlBlock", positionne dans le menu d'édition de chaque item concerné

4) Description de la feature : feature.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="
http://schemas.microsoft.com/sharepoint/"
         Id="AF27505D-D3B0-4024-8576-CCACA3D66B06"
         Title="Send Document by Email"
         Scope="Web" Hidden="false" Version="1.0.0.0"
         Description="Allows you to e-mail a document as attachment from any Document Libraries">
    <ElementManifests>
        <ElementManifest Location="elements.xml"/>
    </ElementManifests>
</Feature>

 
5) Manifest de déploiement : manifest.xml

<?xml version="1.0" encoding="utf-8" ?>
<Solution xmlns="
http://schemas.microsoft.com/sharepoint/"
     SolutionId="87EA5682-EA48-4e19-B890-B8FF699985E4"
     ResetWebServer="TRUE">
    <FeatureManifests>
        <FeatureManifest Location="SendDocument\feature.xml"/>
    </FeatureManifests>
    <TemplateFiles>
        <TemplateFile Location="LAYOUTS\SendDocument.aspx"/>
    </TemplateFiles>
    <Assemblies>
        <Assembly DeploymentTarget="GlobalAssemblyCache" Location="SendDocument.dll" />
    </Assemblies>
</Solution>

 
Le reste est lié directement à la création et au déploiement de features pour SharePoint 2007 (Cab File, ddf et targets file).
 
La commande pour déployer le cab file est toujours la même :
stsadm -o addsolution -f "completecabfilepath"
 
J'espère que vous apprécierez cet outil, si vous avez la moindre question ou que vous rencontrez le moindre souci, n'hésitez pas à me contacter.
 
Je tiens à remercier Becky Bertram pour son article sur le sujet, Stéphane Eyskens pour ses conseils, et Ludovic Lefort pour son aide et son article sur les custom actions

 

 

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: vendredi 13 juin 2008 20:23 par junarnoalg
Classé sous :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01