1. #1
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 75
    Points : 61
    Points
    61

    Par défaut Envoyer des messages avec l'agent SQL au format calendrier exchange

    Bonjour

    J'envoi actuellement des messages depuis l'agent SQL en utilisant la procédure exec msdb.dbo.sp_send_dbmail.
    Nickel.

    Depuis peu, certains de ces messages sont des avis de rendez-vous.
    Le message est une page html dans lequel figure la date-heure de rendez-vous.

    Les destinataires souhaitent que le message mette directement à jour leur calendrier (nous sommes tous membres d'une même entreprise utilisant exchange et outlook).

    J'avais supposé que modifier l'entête du message suffirait.
    En fait, il est totalement illisible, je ne peux donc pas le copier.

    Existe-t-il une possibilité de réaliser ce type de message, toujours via requête SQL ?

    Merci pour les idées.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2008
    Messages
    642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : octobre 2008
    Messages : 642
    Points : 572
    Points
    572

    Par défaut

    A chaque fois que c'est un peu compliqué j'essai de placé une assembly... donc ...

    Avec une assembly bien ficelée, vous pourriez fixer directement les rendez-vous Outlook dans le calendrier des destinataires.
    Il y a plusieurs tutoriels sur comment le faire en C#

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 75
    Points : 61
    Points
    61

    Par défaut utiliser une application tierce en C# ...

    Merci pour cette solution, mais je souhaite rester avec SQL Server.
    Au pire utiliser les SSIS.

    Merci

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 332
    Points : 40 139
    Points
    40 139
    Billets dans le blog
    1

    Par défaut

    Justement une ASSEMBLY peut être intégrée à SQL Server sous forme par exemple de fonction afin de pisser les données au format désiré !
    https://msdn.microsoft.com/fr-fr/lib...=sql.120).aspx

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 75
    Points : 61
    Points
    61

    Par défaut solution avec assembly

    merci pour cette info sur l'assembly.
    Reste à développer celle-ci dont je n'aurai sans doute pas les compétences.
    Je clos donc cette discussion.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2008
    Messages
    642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : octobre 2008
    Messages : 642
    Points : 572
    Points
    572

    Par défaut

    Il y a beaucoup de tutoriel sur les assembly SQL.
    A la limite ça se fait presque tout seul.

    Et avec des notions de C# tu vas surement y arriver.
    Les framework de microsoft sont généralement assez bien fait.
    Et dans une certaine mesure auto explicatif.

    Bonne chance.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 75
    Points : 61
    Points
    61

    Par défaut option avec un fichier ics

    Bonjour

    J'ai trouvé une autre possibilité pour pouvoir obtenir une synchronisation du calendrier du destinataire.
    Il suffit de générer un fichier joint au format ics.

    Et cela me semble beaucoup plus facile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    EXEC msdb.dbo.sp_send_dbmail
    @recipients = 'prenom.nom@xxx.fr'
    ,@subject = 'Test mise à jour calendrier outlook' 
    ,@body = 'Test mise à jour calendrier outlook'
    -- , @body_format = 'body_format'
    --, @importance = 'importance'
    --- , @sensitivity = 'sensitivity' 
    , @query = 
    '
    --
    SET NOCOUNT ON;
    --
    SELECT ''BEGIN:VCALENDAR'' 
    + CHAR(13) + CHAR(10)
    + ''PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN'' 
    + CHAR(13) + CHAR(10)
    + ''VERSION:2.0'' 
    + CHAR(13) + CHAR(10)
    + ''METHOD:PUBLISH'' 
    + CHAR(13) + CHAR(10)
    + ''X-MS-OLK-FORCEINSPECTOROPEN:TRUE'' 
    + CHAR(13) + CHAR(10)
    + ''BEGIN:VTIMEZONE'' 
    + CHAR(13) + CHAR(10)
    + ''TZID:Romance Standard Time'' 
    + CHAR(13) + CHAR(10)
    + ''BEGIN:STANDARD'' 
    + CHAR(13) + CHAR(10)
    + ''DTSTART:16011028T030000'' 
    + CHAR(13) + CHAR(10)
    + ''RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10'' 
    + CHAR(13) + CHAR(10)
    + ''TZOFFSETFROM:+0200'' 
    + CHAR(13) + CHAR(10)
    + ''TZOFFSETTO:+0100'' 
    + CHAR(13) + CHAR(10)
    + ''END:STANDARD'' 
    + CHAR(13) + CHAR(10)
    + ''BEGIN:DAYLIGHT'' 
    + CHAR(13) + CHAR(10)
    + ''DTSTART:16010325T020000'' 
    + CHAR(13) + CHAR(10)
    + ''RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3'' 
    + CHAR(13) + CHAR(10)
    + ''TZOFFSETFROM:+0100'' 
    + CHAR(13) + CHAR(10)
    + ''TZOFFSETTO:+0200'' 
    + CHAR(13) + CHAR(10)
    + ''END:DAYLIGHT'' 
    + CHAR(13) + CHAR(10)
    + ''END:VTIMEZONE'' 
    + CHAR(13) + CHAR(10)
    + ''BEGIN:VEVENT'' 
    + CHAR(13) + CHAR(10)
    + ''CLASS:PRIVATE'' 
    + CHAR(13) + CHAR(10)
    + ''DESCRIPTION:'' + a.Objet 
    + CHAR(13) + CHAR(10)
    + ''CREATED:'' + a.DateStamp
    + CHAR(13) + CHAR(10)
    + ''DTSTAMP:'' + a.DateStamp
    + CHAR(13) + CHAR(10)
    + ''DTEND;TZID="Romance Standard Time":'' + a.DateFin
    + CHAR(13) + CHAR(10)
    + ''DTSTART;TZID="Romance Standard Time":'' + a.DateDebut
    + CHAR(13) + CHAR(10)
    + ''LOCATION:'' + a.Lieu
    + CHAR(13) + CHAR(10)
    + ''ATTENDEE;CN="'' + a.DestiCompte + ''";RSVP=TRUE:mailto:'' + a.DestiMail
    + CHAR(13) + CHAR(10)
    + ''ORGANIZER;CN="'' + a.EmetteurCompte + ''";RSVP=TRUE:mailto:'' + a.EmetteurMail
    + CHAR(13) + CHAR(10)
    + ''UID:0'' 
    + CHAR(13) + CHAR(10)
    + ''SUMMARY;LANGUAGE=fr:'' + a.Objet
    + CHAR(13) + CHAR(10)
    + ''END:VEVENT'' 
    + CHAR(13) + CHAR(10)
    + ''END:VCALENDAR''
    + CHAR(13) + CHAR(10)
    FROM
    (select Objet,Description,Lieu,DestiCompte,DestiMail,EmetteurCompte,EmetteurMail,
    REPLACE(REPLACE(CONVERT ( varchar(19), V.Debut , 127 ), ''-'', ''''),'':'','''') + ''Z'' as DateStamp,
    REPLACE(REPLACE(CONVERT ( varchar(19), V.Fin , 127 ), ''-'', ''''),'':'','''') as DateFin,
    REPLACE(REPLACE(CONVERT ( varchar(19), V.Debut , 127 ), ''-'', ''''),'':'','''') as DateDebut
    from (
    SELECT
    ''Convocation médicale'' as Objet,
    ''Convocation médicale\n\nMettez à jour votre calendrier\n'' as Description, 
    convert(smalldatetime,''13/09/2017 10:00'') as Creation, 
    convert(smalldatetime,''13/09/2017 10:00'') as Debut, 
    convert(smalldatetime,''13/09/2017 11:00'') as Fin, 
    ''Bat médical'' as Lieu,
    ''Nom Prenom'' as DestiCompte,
    ''prenom.nom@xxx.fr'' as DestiMail,
    ''Nom Prenom'' as EmetteurCompte,
    ''prenom.nom@xxx.fr'' as EmetteurMail ) as V
    ) as a
    ' 
    , @attach_query_result_as_file = 1
    , @query_result_header = 0
    , @query_result_separator = 'CHAR(10)+CHAR(13)'
    , @exclude_query_output = 1 
    , @query_attachment_filename = 'convocation.ics'
    Cela fonctionne très bien.
    Le destinataire a juste à double cliquer sur la pièce jointe dans outlook (logiciel retenu pour l'entreprise) et le rendez-vous est mémorisé.

    Le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    BEGIN:VCALENDAR
    PRODID:-//Microsoft Corporation//Outlook 15.0 MIMEDIR//EN
    VERSION:2.0
    METHOD:PUBLISH
    X-MS-OLK-FORCEINSPECTOROPEN:TRUE
    BEGIN:VTIMEZONE
    TZID:Romance Standard Time
    BEGIN:STANDARD
    DTSTART:16011028T030000
    RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
    TZOFFSETFROM:+0200
    TZOFFSETTO:+0100
    END:STANDARD
    BEGIN:DAYLIGHT
    DTSTART:16010325T020000
    RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
    TZOFFSETFROM:+0100
    TZOFFSETTO:+0200
    END:DAYLIGHT
    END:VTIMEZONE
    BEGIN:VEVENT
    CLASS:PRIVATE
    DESCRIPTION:Convocation médicale
    CREATED:20170913T100000Z
    DTSTAMP:20170913T100000Z
    DTEND;TZID="Romance Standard Time":20170913T110000
    DTSTART;TZID="Romance Standard Time":20170913T100000
    LOCATION:Bat 15
    ATTENDEE;CN="Nom Prenom";RSVP=TRUE:mailto:prenom.nom@xxx.fr
    ORGANIZER;CN="Nom Prenom";RSVP=TRUE:mailto:prenom.nom@xxx.fr
    UID:0
    SUMMARY;LANGUAGE=fr:Convocation médicale
    END:VEVENT
    END:VCALENDAR
    Il me reste un souci, car le fichier généré est encodé en UCS-2 LE BOM (vu avec Notepad++)
    Les accentuations ne sont pas interprétées correctement.

    J'ai trouvé un moyen pour imposer à la fonction système msdb.dbo.sp_send_dbmail de convertir la chaine de caractères en ANSI.
    (voir https://www.experts-exchange.com/que...SI-format.html)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -- remove BOM mark from unicode
    convert(varbinary(max), substring( convert(varchar(max), CONVERT (nvarchar(max), Chaine)), 2, DATALENGTH(Chaine)/2)  )
    Reste à trouver l'équivalent pour UTF-8.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2008
    Messages : 75
    Points : 61
    Points
    61

    Par défaut abandon de cette solution

    En fait les convocations sont issues d'un fichier texte, que PHP mouline pour les mettre en base de données (avec un traitement plus facile et d'autres fonctionnalités).
    Le sp_send_dbmail n'est là que pour envoyer les convocations.
    Puisque je passe déjà par un outil tierce (PHP) j'en profite pour lui faire créer les fichiers ics au bon format.
    Le sp_send_dbmail peut alors joindre les fichiers tout prêts aux messages.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2014, 16h31
  2. Réponses: 0
    Dernier message: 02/06/2010, 15h58
  3. Envoyer des messages à d'autres postes en réseau
    Par Wilco dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/07/2005, 13h32
  4. Réponses: 4
    Dernier message: 28/03/2005, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo