none
Envoyer un message Outlook avec Ole RRS feed

  • Question

  • Bonjour,

    je souhaiterai envoyer un message outlook à partir d'un programme développé en C++ (gestion de tickets de maintenance).

    Quelqu'un aurait une idée en utilisant une liaison OLE ?

    D'avance Merci de votre réponse.

    jeudi 6 août 2015 08:09

Réponses

  • Effectivement pour une fois je suis d'accord avec vous : laissez tomber.

    De plus, me dire que je ne veux pas m'investir un minimum dans la théorie montre bien que vous n'aviez pas compris la question à l'origine. C'est sans doute de ma faute. Les principes OLE/COM je les connais et ce n'était pas la question.

    Ceci dit entre-temps j'ai pu répondre à la question d'origine pour les éventuels lecteurs postérieurs :

    vOOutlook = Variant::GetActiveObject("Outlook.Application"); vONameSpace = vOOutlook.OleFunction(WideString("GetNameSpace"),WideString("MAPI")); vONameSpace.OleFunction(WideString("Logon"), WideString(""), WideString(""), true, true); vOMessages=vOOutlook.OleFunction(WideString("CreateItem"), 0); vOMessages.OlePropertySet(WideString("Subject"), WideString("Sujet du nouveau mail.")); vOMessages.OleFunction(WideString("Display");

    Sur ce bonne journée !

    vendredi 7 août 2015 09:59

Toutes les réponses

  • Pourquoi passer par Outlook et pas directement attaquer le serveur de Mail ?

    Paul Bacelar, Ex - MVP VC++

    jeudi 6 août 2015 08:39
    Modérateur
  • Merci de votre réponse.

    Je passe par Outlook pour garder un historique des messages envoyés avec ceux qui n'ont rien à voir avec la maintenance (objet du programme). Il faut en effet que le message envoyé par le programme soit présent dans la liste des messages envoyés.

    jeudi 6 août 2015 08:55
  • OK.

    Avec les MFC ?

    Si oui => https://support.microsoft.com/en-us/kb/2575036


    Paul Bacelar, Ex - MVP VC++

    jeudi 6 août 2015 09:44
    Modérateur
  • Le lien ne me donne pas de piste.

    En fait le problème se situe plus dans les fonctions et leurs paramètres pour afficher la fenêtre d'un nouveau message et pré-renseigner le From et Subject

    J'ouvre Outlook avec CreateObject("Outlook.Application");

    puis après ?...

    Merci de vos réponses

    jeudi 6 août 2015 09:56
  • >J'ouvre Outlook avec CreateObject("Outlook.Application");

    C'est inexact, vous n'ouvrez pas Outlook, vous obtenez un pointeur ou un objet permettant de dialoguer avec le server COM associé au ProgID "Outlook.Application".

    Après, bin vous utilisez la documentation pour savoir quels composants et quelles méthodes utilisées pour envoyer un mail, mais c'est plus simple de lire l'exemple fourni jusqu'au bout vu qu'il envoie une mail à l'étape8, sur 10.

    En OLE, vous ne pilotez pas l'IHM d'une application, vous dialoguez directement avec un composant, donc on s'en fout d'afficher un message/IHM à l'utilisateur, en général.


    Paul Bacelar, Ex - MVP VC++

    jeudi 6 août 2015 12:49
    Modérateur
  • C'est justement le cœur du problème. Où est la documentation ????

    Où sont documentées les OleFunction et OleProcedure et leurs paramètres. Certes après le CreateObject il ne se passe rien. J'initialise simplement un Variant. Mais ma question est que faire après pour afficher la fenêtre Outlook d'un nouveau message en ayant la possibilité de pré-renseigner le sujet, l'émetteur et le destinataire ? Et ce n'est pas en disant il suffit de regarder la documentation que le problème sera résolu. Ce n'est que par quelques exemples de codes que l'on va deviner ce qu'il faut écrire.  En ce qui concerne l'IHM avec Word j'y arrive très bien : CreateObject("Word.Document", false) dans une container Ole. Donc on ne s'en fout pas...

    jeudi 6 août 2015 13:15
  • La documentation ?

    Google référence très très bien MSDN.

    La preuve :

    https://msdn.microsoft.com/en-us/library/office/ff869635.aspx

    Les omposant COM sont auto-descriptifs, si vous chargez le composant dans un outils comme OLE/COM Viewer, cela vous donne la liste des méthodes, des propriétés, des interfaces supportées, pour chacun des composants dans la typelibrairie, donc même sans Internet ou Google, c'est documenté.

    >J'initialise simplement un Variant

    Un Variant, ç'est tout et n'importe quoi, vous n'avez pas un simple Variant, vous avez une référence sur un objet COM de dialogue avec Outlook.

    >pour afficher la fenêtre Outlook d'un nouveau message en ayant la possibilité de pré-renseigner le sujet

    cf. le lien sur la "documentation", un simple CreateItem avec la constante qui va bien.

    >Et ce n'est pas en disant il suffit de regarder la documentation que le problème sera résolu.

    Une méthode dans l'objet racine d'Outlook, c'est pas ce que j'appelle une API ultra planqué. Et Google la donne facilement.

    >Ce n'est que par quelques exemples de codes que l'on va deviner ce qu'il faut écrire

    Non, mais cela donne un bon aperçu de comment coder et de comment lire la documentation.

    >En ce qui concerne l'IHM avec Word j'y arrive très bien : CreateObject("Word.Document", false) dans une container Ole. Donc on ne s'en fout pas...

    C'est parce que vous arrivez à faire un machin avec un truc que cela devient un truc utile ?

    Ma logique un peu limiter à celle du premier ordre (merci Socrate) m'indique comme une déduction des plus bancale, mais bon, je suis un peu limité en "logique".


    Paul Bacelar, Ex - MVP VC++

    jeudi 6 août 2015 18:02
    Modérateur
  • Les omposant COM sont auto-descriptifs, si vous chargez le composant dans un outils comme OLE/COM Viewer, cela vous donne la liste des méthodes, des propriétés, des interfaces supportées, pour chacun des composants dans la typelibrairie, donc même sans Internet ou Google, c'est documenté.

    Désolé, mais OLE/COM viewer (que j'ai téléchargé et installé) ne me donne pas la documentation recherchée et de plus je n'ai aucun composant à charger dans OLECOM viewer !...

    C'est parce que vous arrivez à faire un machin avec un truc que cela devient un truc utile ?

    C'est sur quand faisant exprès de rien comprendre on a de grande chance de ne pas répondre aux questions de manière efficace. Je ne vous en veux pas car quand nous programmeurs on utilise les forums on a très souvent des gens très intelligents théoriciens de l'informatique qui vous explique que la question est sans objet et que le problème n'est pas fondé. Mais l'utilisateur/client est roi et vous savez sans doute ce qu'est un cahier des charges. Ce n'est pas en expliquant au client qui vous paie que sa requête est nulle que l'on fait preuve de maitrise !

    Bref, je souhaiterai donc simplement faire apparaitre une fenêtre 'nouveau message' outlook dans laquelle je puisse par programme pré-renseigner le sujet, l'emetteur et le destinataire. C'est le cahier des charges et ce n'est pas discutable!... Si vous avez la réponse tant mieux et je vous en remercierai sinon arrêter de vous demander comment on peut faire autrement en étalant des principes théoriques qui n'ont rien à voir avec la question.

    D'avance Merci

    Quant à votre conclusion :

    Ma logique un peu limiter à celle du premier ordre (merci Socrate) m'indique comme une déduction des plus bancale, mais bon, je suis un peu limité en "logique".

    Désolé, je n'ai rien compris... problème de formulation et de syntaxe ?

    jeudi 6 août 2015 22:55
  • Je laisse tombé, vous êtes réfractaire aux conseils, tempi.

    Si c'est pour afficher une IHM pour de l'assistance à la saisie, un Add-Ins dans Outlook aurait été plus judicieux, mais bien sûr, ce n'est que théorique. J'écris pas ça pour phpdev59 mais pour d'éventuels lecteurs postérieurs.

    > plus je n'ai aucun composant à charger dans OLECOM viewer

    Vous devez assez mal connaitre COM alors.

    Tous les codes que vous verrez sur de l'automation commence par l'instanciation d'un composant COM via un ProgID. Vous n'avez qu'à chercher ce ProgID dans la base de registre pour avoir les informations nécessaire pour trouver le fichier contenant le composant et donc pour pouvoir le charger dans OLECOM viewer.

    Je ne relève pas vos jérémiades sur le client roi, votre devoir de conseil, on s'assoie dessus. Mais effectivement je n'ai pas tous les éléments, mais je fais des assertions probables. Car vous ne donnez vraiment pas beaucoup de détails.

    Vous ne voulez pas vous investir un minimum dans la "théorie", vous n'avez qu'à re-pomper le code qui est dans le lien que j'ai déjà donné est qui fait EXACTEMENT ce que vous demandez.

    Si vous voulez qu'on vous réponde, dites au moins pourquoi le code déjà qu'on vous à déjà fourni ne vous convient pas.

    Le théoricien vous dit bonne chance, il va aller travailler sur un projet "théorique" avec un client "virtuel".


    Paul Bacelar, Ex - MVP VC++

    vendredi 7 août 2015 09:29
    Modérateur
  • Effectivement pour une fois je suis d'accord avec vous : laissez tomber.

    De plus, me dire que je ne veux pas m'investir un minimum dans la théorie montre bien que vous n'aviez pas compris la question à l'origine. C'est sans doute de ma faute. Les principes OLE/COM je les connais et ce n'était pas la question.

    Ceci dit entre-temps j'ai pu répondre à la question d'origine pour les éventuels lecteurs postérieurs :

    vOOutlook = Variant::GetActiveObject("Outlook.Application"); vONameSpace = vOOutlook.OleFunction(WideString("GetNameSpace"),WideString("MAPI")); vONameSpace.OleFunction(WideString("Logon"), WideString(""), WideString(""), true, true); vOMessages=vOOutlook.OleFunction(WideString("CreateItem"), 0); vOMessages.OlePropertySet(WideString("Subject"), WideString("Sujet du nouveau mail.")); vOMessages.OleFunction(WideString("Display");

    Sur ce bonne journée !

    vendredi 7 août 2015 09:59