Envoyer des e-mails ou des fax avec Access

Comment envoyer des e-mails ou des fax avec Access ?

Access 97 et les versions suivantes disposent d’une fonction qui permet d’expédier des e-mails ou des fax (à condition que votre ordinateur ait un système de messagerie d’installé, comme Outlook ou Exchange). Cette fonction s’appelle SendObject (dépendante de l’objet DoCmd).

Remarque
SendObject ne permet pas d’expédier des pièces jointes, excepté des objets Access. Si tel est votre souhait, il faut passer plutôt par Automation avec Outlook, par exemple. Consultez le tag automation du blog.

Le code Visual Basic

Voici une procédure Visual Basic mettant en place la commande SendObject.

Pour des raisons pratiques, nous gérons l’envoi d’un message simple (destinataire, objet, message). Les champs CC: (copie à) et CCI: (copie cachée à) ne sont pas gérés (mais vous pourrez améliorer tout ça en consultant la documentation Access).

Le dernier paramètre (blnEdit) peut valoir True (Vrai) ou False (Faux).
S’il vaut True, le message sera affiché à l’écran pour modification éventuelle avant envoi. Dans le cas contraire, le message est expédié directement.

Comment tester ?

Voici une petite procédure, à taper dans un module puis à exécuter.
On pourrait améliorer (on peut toujours !) en écrivant une procédure qui envoie un e-mail à toutes les personnes contenues dans une table.

Vous aimerez aussi...

38 réponses

  1. Arnaud dit :

    Bonjour,
    Je souhaiterais que le destinataire du mail soit toujours l émetteur . Comment faire pour récupérer l adresse de l émetteur Pour le replacer dans le script d émission du mail ?
    Merci de votre aide

    • Hervé Inisan dit :

      Si j’ai suivi la question, l’adresse de l’émetteur ne peut pas être récupérée simplement, puisque SendObject sous-traite l’envoi au logiciel de messagerie installé (et configuré) sur la machine.
      On peut par contre imaginer de stocker cette info dans une table Access.

  2. bbm dit :

    Chez Rien ne marche, Erreur End Sub attendu, y a t-il de prealable pour que l’envoi marche?

    • Hervé Inisan dit :

      S’il y a un End Sub attendu, ça veut dire que le code recopié est incorrect.

      • Est-ce que le code est bien conforme à ce qu’il y a sur le site ?
      • Est-ce que le code a bien été copié dans un module standard ?
      • Est-ce qu’il pourrait y avoir d’autres bouts de VBA incorrects dans d’autres modules ?
  3. Serge dit :

    Super tout fonctionne 🙂
    Un grand merci à vous Hervé.

  4. serge dit :

    Ainsi que l’objet du mail qui se nomme « Info: » voit apparaître à coté le nom du champ client correspondant. ex « info xxx »
    Encore merci.

  5. serge dit :

    Bonjour,
    étant plus que novice , je tourne en rond depuis un bon moment.
    Au lieur de saisir le mail dans la msgbox, j’aurais souhaité que l’adresse mail du destinataire s’affiche en rapport avec l’enregistrement sur lequel je clique dans mon champ Mail de mon formulaire.
    Si vous avez une petite idée !
    Merci .

  6. Hervé Inisan dit :

    marcgsc > Le problème vient du champ « Lien hypertexte ». En recopiant la fonction donnée dans l’article Nettoyer des liens hypertexte à la volée, et en remplaçant la ligne :

    par :

    … ça devrait mieux marcher.

    Ouala ! 🙂

  7. marcgsc dit :

    Bonjour. Merci pour toutes ces informations très pratiques. J’ai un problème avec le format de l’adresse mail.
    J’ai enregistré la procédure à partir d’un bouton de commande dans un formulaire et je récupère automatiquement l’adresse mail d’un champs du formulaire (Zone de texte nommée Mail Expert – format lien hypertexte).
    A la place de la boite de dialogue, j’ai codé l’adresse mail comme suit : strDest = Me![Mail Expert].
    Ca marche mais dans la zone destinataire du mail (Outlook), l’adresse est enregistrée 2 fois : xxxxx@orange.fr#mailto:xxxxx@orange.fr#
    Auriez vous une solution ?
    Précision : le champs [Mail Expert] est alimenté par une table liée.
    Bien cordialement

  8. Hervé Inisan dit :

    Laurent > Je n’ai pas testé avec Windows Live Mail, mais la commande SendObject appelle le client mail configuré par défaut sur la machine. Est-ce que ton WLM est bien configuré comme messagerie par défaut ?

  9. LAURENT dit :

    Bonjour,

    J’ai crée un bouton sur Access, qui permet de récupérer l’adresse mail et sa commande. Celui-ci fonctionne très bien sur un pc équipé de Outlook. Par contre, lors de test avec de nouveau pc équipé de Windows Live Mail, ce bouton ne fonctionne plus, il me dit aue la commande sendobject n’est pas disponible pour l’instant. Est-ce une incompatibilité entre les 2 programmes, Windows Live Mail et Access2010 ?

  10. Hervé Inisan dit :

    bishop > SendMail utilise la messagerie du poste par défaut, ce n’est pas Access qui décide. Donc ce serait plutôt du côté messagerie qu’il faudrait regarder. Une solution alternative peut consister à passer par libMAIL, qui est plus autonome et paramétrable.

  11. bishop dit :

    salut a tous,
    Je viens d’utiliser cette petite appli et c’est bien sympa, par contre est-il possible de changer l’adresse de l’expéditeur pour la forcer en dur quelque soit le terminal qui expédit le mail (je suis en TSE).
    Merci d’avance
    W.Pierre

  12. Hervé Inisan dit :

    sab > Si, si, c’est possible ! 🙂 Il suffit d’aménager la partie qui crée le message (strMessage) en injectant des champs du formulaire. Par exemple :

    J’ai supposé que :

    1. Le code était tapé dans le formulaire concerné. Sinon, il faut remplacer Me par Forms![Nom du formulaire].
    2. Le champ s’appelle Numéro Client.
  13. sab dit :

    Bonjour,

    En passant, votre macro fonctionne a merveille. Je me posais la question suivante, j’ai ajouté un bouton dans mon formulaire qui effectue cette macro. Est-ce possible d’ajouter dans cette macro une donnée de ce formulaire?

    Exemple dans l’objet du message, inscrire automatiquement le numéro du client qui est inscrit dans le formulaire?

    MERCI À L’AVANCE!

  14. Philobee dit :

    Merci beacoup! à retardement ;o)

    Fini les vacances, je vais essayer et je vous reviens!

    Bonne journée!

  15. Hervé Inisan dit :

    Philobee > A froid comme ça, je dirais qu’il faut aménager l’appel de SendMail de cette manière :

    A condition que le formulaire contienne un champ (zone de texte) appelé « Corps du message ». On peut faire pareil avec l’objet du message (que je n’ai pas changé ici).  Le corps du message peut être long, ça ne posera pas de souci.

  16. Philobee dit :

    Bonjour, dabord un gros merci!! grâce à vous j’avance dans l’aventure de créer une BD..
    Le 6 janvier 2010 Vous avez répondu à la question de Dorian:

    la réponse était:dans ce cas, à supposer qu’on soit dans le Sub/End Sub du bouton, il faudrait écrire :

    SendMail Me![Nom du champ Email], « Objet du message », « Corps du message », True
    L’objet et le corps peuvent également être des champs provenant du formulaire (du style Me![Nom d’un champ]).

    Je l’ai essayée et ça fonctionne bien. Cependant, j’essai de changer le corps du message comme avec la première procédure que vous nous avez montré et je n’y arrive pas.. Je débute en VBA et j’ai beau essayé de toute les manières j’ai toujours une erreur.. C’est que mon corps de message est plutôt long et doit apparaitre sur plusieurs lignes.. Je ne sais pas si je suis claire…

    Quoi qu’il en soit merci quand même!! ;o)

  17. Hervé Inisan dit :

    pouetpouet 😉 > Si j’ai suivi, il suffit de passer l’adresse email voulue. Dans l’exemple donné, il faudrait remplacer « bill.gates@microsoft.com » par autre chose. Le client peut être un client mail quelconque, de fait. Ou bien… ?

  18. pouetpouet dit :

    Bonjour, concernant l’envoi de mails directement depuis access 2010, comment définir une messagerie webmail type @me.com ou @gmail.com comme client ?
    merci d’avance.

  19. Hervé Inisan dit :

    Delphine > Tout ça est faisable, techniquement. Comme il s’agit de construire des mails personnalisés selon chaque personne, je verrais 2 boucles imbriquées :

    1. La première boucle pour parcourir la liste des personnes, avec leurs e-mails. Ce qui va permettre de construire l’en-tête de chaque message.
    2. La deuxième boucle, à l’intérieur de la 1ère, pour parcourir la liste des actions de chaque personne.

    Chaque boucle parcourt une table, une requête ou une instruction SQL dynamique. Ça veut dire qu’il s’agit de parcourir des Recordsets. Tu as plusieurs exemples d’utilisation de Recordsets DAO sur le blog, ça peut déjà permettre de démarrer. Notamment cet article qui est proche de ce que tu cherches à faire.

  20. Delphine dit :

    Bonjour,
    Ma question était-elle trop compliquée ou inréalisable ?? Je suis toujours bloquée dessus mais si vous-même vous n’avez pas de réponse… je suis encore moins confiante.
    Cordialement

  21. Delphine dit :

    Bonjour Hervé,

    J’ai construi une base de données permettant à un administrateur de rentrer différentes informations en réunion d’entreprise, la date, le lieu, le type, le thème, les personnes présentes, l’action, le pilote et le co-pilote. Tout cela sur un formulaire avec choix par bandes déroulantes reliées à des tables. On peut donc rajouter des lieux, des types, des personnes…

    J’ai aussi un formulaire de mise à jour des actions par les pilotes.

    Maintenant j’aimerais envoyer un mail à chaque pilote pour lui envoyer ses actions personnelles, on utilise tous outlook à l’entreprise.
    Comment puis-je faire ? Boucles ?
    Pour l’instant g créer une liste d’adresses mails et j’arrive en un clic à envoyer le même message à tout le monde, mais je voudrais des messages personnels….

    Merci d’avance, bonne journée !!

  22. Hervé Inisan dit :

    AF > Ça veut dire que la bibliothèque « Microsoft Outlook Object Library » n’est pas attachée au projet VBA. Consulte cet article pour plus de détails.

  23. AF dit :

    Bonjour,

    J’ai testé les procédures vba d’envoi de mails par le biais d’Access 2003.
    Mais lors de la compilation de mon module, j’obtiens l’erreur « Type défini par l’utilisateur non défini » sur la ligne « dim ol as outlook.application ».
    Auriez-vous une explication ?
    Merci

  24. Hervé Inisan dit :

    Diablogy > Tu as bien recopié la procédure SendMail dans un module standard ?

  25. Diablogy dit :

    Bonjour ,

    Lorsque j’utilise votre code pour un bouton d’access 2003 j’ai le message d’erreur  » SendMail fonction ou sub non définie ».

    Merci de m’aider s’il vous plait.

  26. Dorian dit :

    Merci beaucoup, ça fonctionne parfaitement !

  27. Hervé Inisan dit :

    Dorian > Dans ce cas, à supposer qu’on soit dans le Sub/End Sub du bouton, il faudrait écrire :

    L’objet et le corps peuvent également être des champs provenant du formulaire (du style Me![Nom d'un champ]).

  28. Dorian dit :

    Bonjour,

    J’ai utilisé les codes ci dessus qui fonctionne très bien.
    Cependant, j’aimerais exécuter cette fonction à partir d’un bouton de commande placé sur le formulaire.
    (l’utilisateur click sur un bouton « envoyer un mail » à partir du formulaire, il renseigne l’adresse e-mail, et la page Outlook s’ouvre pré-remplie)

    Merci d’avance pour votre aide !

  29. Hervé Inisan dit :

    jair > SendObject prend en charge les destinataires multiples. Il suffit de fournir les adresses (la variable strEmail, donc, dans l’exemple) sous la forme "email1@provider1.com;email2@provider2.com".

  30. jair dit :

    Bonjour,

    svp comment envoyer email a plusieurs destinataires? adresse email doivent être séparer avec ‘;’
    merci d’avance

  31. Hervé Inisan dit :

    Christian > Les portails web en eux-mêmes ne sont pas scriptables facilement. Ils sont juste des interfaces pour des serveurs POP et SMTP. C’est donc plutôt l’adresse de ces serveurs qui serait à utiliser dans Access. Le fait de passer par un logiciel local (Outlook-tout-court ou Outlook Express, ou une couche MAPI…) facilite cet accès. Ce que font SendObject (dans cet article) ou l’Automation Outlook (dans d’autres articles).

    A noter que DenisS (participant des forums self-access.com) prépare un complément Access de type « relais SMTP ». Ce qui pourrait faciliter l’envoi de mails sans passer par les couches du dessus. Bientôt dans le grenier 🙂

  32. Christian dit :

    Bonjour
    Peut on créer un envoi de mails avec une appli standard, qui serait installée dans des associations différentes et qui disposeraient de système de messagerie divers ou autres que Outlook ? Autrement dit peut on utiliser directement leur portail en précisant simplement le nom de leur adresse mail ?

  33. Hervé Inisan dit :

    Christophe > La gestion de la sécurité est effectivement très lourde sur Outlook, mais ça semble s’améliorer avec Outlook 2007. Il faut par contre quelques conditions supplémentaires pour que tout marche :

    • Remplacer le code de cet article (qui utilise SendObject) par du code pilotant Outlook.
      Je viens d’ajouter sur le site un article qui explique comment faire. Le bout de code donné en exemple est complètement compatible avec le SendMail de cet article-ci. Il suffira donc de remplacer tous les SendMail par les SendOLMail du nouvel article (ou de renommer les Sub, au choix).
      L’article est ici : Expédier des emails via Outlook.
    • Installer impérativement un anti-virus. La nouvelle sécurité d’Outlook 2007 repose en partie sur le Centre de sécurité de Windows, qui vérifie la présence d’un anti-virus (à jour bien sûr).
  34. Christophe dit :

    Bonjour,

    J’utilise votre procédure SendMail sous Outlook 2007 via Access 2007 afin de confirmer des dates à mes clients.

    Cela fonctionne assez bien, cependant, je suis obligé de confirmer l’envoie de chaque message (boîte de dialogue message d’alerte Outlook « Un programme tente d’envoyer un message électronique de votre part »
    Auriez-vous une solution pour palier à cette problématique ?
    OS : Vista / pas d’anti virus / Office 2007 avec licence
    Mercissss

Laisser un commentaire

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