libMail : une bibliothèque VBA pour expédier des emails avec ou sans pièces jointes

Dans la série : « comment, à partir d’Access, expédier un email avec ou sans pièces jointes ?« , voici une méthode alternative proposée par Denis Scheidt (également contributeur sur les forums self-access.com)…

La bibliothèque libMAIL fournie par Denis implémente ce qu’il faut de la RFC821 pour permettre l’envoi de mails à partir d’Access. Le tout en pur VBA et sous licence LGPL… Ca vous dit d’essayer ?

à lire avant tout !
Depuis la version 1.20, vous pouvez trouver la bibliothèque libMAIL à cette adresse :
http://www.self-access.com/cms/access/assistants/libmail
La bibliothèque évoluant régulièrement, il vous sera maintenant plus facile de retrouver sa page dédiée.La page que vous lisez actuellement contient la documentation jusqu’à la version 1.10 uniquement.

Présentation de libMAIL

Je cite directement l’introduction de libMAIL :

Il arrive régulièrement que l’on ait besoin d’envoyer un état ou un fichier (résultat d’une requête, par exemple) par messagerie électronique à partir d’une application Access.

Access n’offre que deux méthodes pour effectuer cette action : la méthode SendObject de l’objet DoCmd ou l’utilisation d’un objet Outlook.Application (si Outlook est le client de messagerie utilisé par le poste).

Ces deux solutions présentent l’avantage de la simplicité, mais ont également quelques inconvénients non négligeables :

  • La méthode SendObject ne permet d’envoyer que des objets Access (formulaire, état, module, etc…). Il n’est pas possible de joindre un fichier externe. De plus, la mise en page est perdue, seules les données étant transmises.
  • Lorsqu’une application est diffusée chez plusieurs clients, par exemple, rien ne permet d’être sûr qu’un poste disposera de MS-Outlook. Il peut utiliser un autre client de messagerie (qui ne sera peut-être pas compatible MAPI), ou même ne disposer d’aucun logiciel de messagerie électronique. Écrire un code tenant compte de tous les cas possibles peut vite devenir très compliqué.
  • Piloter une application tiers pose également des problèmes : il faut s’assurer que l’application existe sur le poste, éventuellement l’inclure dans le jeu d’installation de l’application Access. Cette application risque d’être mise à jour par ailleurs, et perturber ainsi le déroulement de l’application Access.

Ces différentes contraintes peuvent nous faire préférer une solution plus souple et efficace : avoir un mini-serveur SMTP, écrit en VBA, donc utilisable directement depuis une application Access, et ne dépendant d’aucun composant ou logiciel externe.

Avantages de libMAIL

La bibliothèque libMail présente plusieurs avantages :

  • Vous pouvez expédier des messages avec ou sans pièces jointes ;
  • Vous n’avez besoin d’aucun logiciel externe (la bibliothèque est développée en VBA) ;
  • Vous n’aurez pas d’avertissement de sécurité, comme c’est le cas lorsque vous utilisez Outlook Automation.
  • La bibliothèque est sous licence LGPL : le code source est donc public et ré-exploitable librement.

Téléchargement

La version stable actuelle est numérotée 1.10.
Vous trouverez le changelog en bas de cette page.

  1. Téléchargez libMAIL.
  2. Une fois le fichier Zip téléchargé, cliquez sur son icône du bouton droit de la souris, puis sélectionnez Extraire tout.
    Vous obtenez un dossier contenant lui-même 3 sous-dossiers :
    code : le code VBA et tout ce qui constitue la bibliothèque libMAIL.
    doc : la documentation de la bibliothèque, sous plusieurs formats (PDF, OpenOffice).
    licence : la licence LGPL.
  3. Consultez la documentation pour bien comprendre le fonctionnement et l’installation de libMAIL.

Installation express

Si vous êtes pressé, voici une idée générale de l’installation :

  1. Créez une base de données vide que vous nommerez par exemple libMAIL.mdb.
  2. Copiez dans le même dossier tous les fichiers du sous-dossier code fourni avec libMAIL.
  3. Importez le module Outils.MOD.
  4. Vérifiez que la bibliothèque DAO est activée dans votre projet (voir plus bas).
  5. Dans la fenêtre Exécution, tapez :
    ChargeVB puis appuyez sur la touche [Entrée].
    Vous pouvez aussi placer le curseur dans la procédure ChargeVB, et cliquer sur l’icône Exécuter Sub/UserForm.
Important
libMAIL fait appel à la bibliothèque DAO (Microsoft DAO Object Library). Cette bibliothèque doit donc être associée à votre base de données pour que le programme fonctionne.

Pour plus de détails sur les références, consultez cette page.
Pensez aussi à compiler votre code VBA, après l’installation, pour vérifier que tout est correct.

Une fois la bibliothèque créée…

… il faut l’ajouter à votre projet (donc à votre base de données principale).
Pour cela, vous avez aussi plusieurs possibilités :

  • Vous pouvez transformer votre bibliothèque libMAIL.mdb en un complément Access (libMAIL.mda), et l’installer ensuite sur votre machine. Le processus est un peu long et sort du cadre de cet article.
  • Vous pouvez lier la bibliothèque libMAIL.mdb comme n’importe quelle référence VBA.
Screencast
Si tout ça ne vous paraît pas bien clair, je vous ai prévu une petite vidéo – en bas cet article – pour illustrer tout le processus. Z’êtes gatés, non ?

Et si on expédiait un mail ?

Ce qu’il faut bien comprendre avant de démarrer, c’est que l’envoi de mails se fait en 2 étapes :

  1. Vous devez d’abord préparer vos messages (normal, non ?).
  2. Vous devez ensuite démarrer le serveur SMTP qui va se charger de l’envoi des messages.

Exemple #1 : envoi de messages simples

Commençons par un cas simple : on souhaite expédier un message sans pièce jointe. Recopiez le code ci-dessous dans un module standard de votre base de données :

Sachant que :

  • L’adresse destinataire@fournisseur.fr doit bien sûr être remplacée par celle de votre destinataire réel. Vous pouvez écrire plusieurs adresses, séparées par des virgules ou des points-virgules.
  • Le second paramètre est le sujet du message.
  • Le troisième paramètre est le corps du message.
  • L’adresse emetteur@provider.com est en principe votre propre adresse e-mail.
  • CurrentUser donne le nom d’utilisateur Access qui expédie le message (généralement : Admin). Ce paramètre n’est pas utilisé dans le message, mais seulement dans les journaux de suivi.
    Nouveauté de la version 1.01 : ce paramètre est facultatif (si vous l’omettez, c’est le nom de l’utilisateur Windows qui est pris en comp
    te).

Une fois le message créé, la procédure SMTPLance démarre le serveur proprement dit. Elle accepte au minimum 2 paramètres :

  • Le nom du serveur SMTP à utiliser pour l’envoi des messages. En général, celui de votre fournisseur d’accès.
    Par exemple, si vous êtes abonné Free, vous utiliserez : smtp.free.fr
  • Le nom de domaine avec lequel libMAIL va s’identifier auprès du serveur SMTP. Ca peut être votre nom de domaine si vous en avez un, sinon celui de votre fournisseur d’accès.
    Toujours pour Free, vous pouvez utiliser : free.fr
Astuces
Les procédures CreeMail et SMTPLance proposent de nombreuses autres options, notamment la prise en charge des destinataires en copie simple ou cachée (Cc et Bcc). Vous trouverez plus de détails dans la documentation de libMAIL.

Exemple #2 : envoi de pièces jointes

Le principe est le même si vous devez joindre des documents à votre message. Il va falloir en plus :

  • Stocker la liste des pièces jointes dans un tableau VBA.
  • Transmettre ce tableau à la procédure CreeMail.

Conseil
Comme vous utiliserez probablement souvent les mêmes informations SMTP pour appeler SMTPLance, vous devriez en faire des constantes VBA, ou – encore mieux – des paramètres de votre application.

Questions fréquentes

Pourquoi ne pas livrer la bibliothèque directement sous forme de fichier .mdb ou .accdb ?

La réponse est dans la question 🙂 : parce que les formats des fichiers Access évoluent, et qu’il est difficile de fournir un fichier pour chaque version d’Access. L’approche retenue permet de livrer une version unique, compatible avec tous les Access du moment (au moins depuis 97 !).

Est-ce que je peux intégrer les modules et le formulaire directement dans ma base de données ?

C’est possible aussi, et ça marchera aussi bien…
Il y a quand même quelques petites choses à prendre en compte :

  • Les inconvénients de gestion : si vous devez mettre à jour la bibliothèque, vous devrez remplacer manuellement les anciens modules VBA (et le formulaire SMTP) par les nouveaux. Et vous ne pourrez pas utiliser le module Outils pour cette opération (rappelons qu’il ne doit être utilisé que pour construire la bibliothèque « from scratch« ).
  • La bibliothèque est sous licence LGPL. Tant qu’elle est liée à votre application, votre base Access n’est pas concernée. Par contre, si le code de la bibliothèque est intégré à votre base, celle-ci passe également sous licence LGPL. Consultez la licence pour plus de détails.

Support

Si vous avez des questions ou des problèmes avec libMail, vous pouvez…

  • les poster sur ce blog, comme commentaires ;
  • les poster sur le forum Access de self-access.com ;
  • écrire directement à l’auteur (Denis), dont l’adresse figure dans la documentation.

Change Log

Vous aimerez aussi...

23 réponses

  1. OLELA dit :

    Je suis hyper satisfait

  2. Hervé Inisan dit :

    nexeg > Content que ça puisse dépanner ! 🙂

    (et merci à Denis pour son support)

  3. nexeg dit :

    Bonjour, j’ai suivi ton conseil. Denis m’a assisté, chaperonné je devrais plutôt dire.
    C’est top. Merci de toute votre démarche Messieurs. Nous avons 1 chance inoui…
    Je démarre avec son système de messagerie. Un vrai plaisir et des perspectives des plus intéressantes…
    Je l’intègre dans 1 application de gestion interne que nous utilisons depuis plusieurs années. C’est je crois le module dont nous avions besoin…
    Bien à vous tous

  4. Hervé Inisan dit :

    nexeg > S’il s’agit d’une question spécifique libMAIL, le meilleur endroit pour la poster est le forum dédié libMAIL. Denis se fera un plaisir de te répondre.

  5. nexeg dit :

    Bonjour, Semble-t-il, j’ai moins de chance que tout le monde… Je tente d’utiliser la bibliothèque libMAIL, qui me serait bien utile dans mon application, mais en vain. Mon serveur SMTP requiert 1 authentification… Il nécessite aussi 1 compte utilisateur déclaré ainsi que de son mot de passe…
    J’aurai bien voulu disposer de la doc de libMAIL où tout cela doit être certainement commenté, mais je suis passé à côté.
    Merci de vos bons conseils.

  6. mumen dit :

    Excellente initiative que ce module qui va probablement résoudre ce problème récurrent de l’installation de MAPI sur les machines client. Ca va me donner du boulot perso pour intégrer le module en automatique sur les postes clients, mais ça vaut le coup. Je repasserai ici donner mes impressions.

    Merci

  7. DenisS dit :

    Merci à vous deux pour cette appréciation 🙂

  8. Hervé Inisan dit :

    jb85 > Je suis d’accord ! Si DenisS passe par là, je plussoie… 🙂

  9. jb85 dit :

    Un immense merci au concepteur de cet extraordinaire programme. Je viens de l’utiliser pour 2 applications d’une association (épicerie sociale et solidaire). C’est impeccable.
    Encore bravo, superbe travail !

  10. Hervé Inisan dit :

    Weric > Merci d’avoir continué la conversation sur le forum. La suite se trouve donc par là, pour ceux que ça intéresse aussi. 🙂

  11. Weric dit :

    Bonjour à tous,

    je viens de tester libmail (sous Access 97 et 2003), mais je n’arrive pas à le configurer pour qu’il utilise le serveur smtp de gmail.

    Pouvez-vous me renseigner ?

    Merci d’avance et bonne journée
    Weric

  12. msikato dit :

    merci bien 🙂

  13. DenisS dit :

    A priori, libMAIL fonctionne correctement sous Access 2007.

    Toutefois, la version 1.10 pose un problème particulier sous Access 2007, dans le sens ou l’interface se fige complètement lorsqu’on laisse bLogData = False (la valeur par défaut) dans SMTPLance.

    Un autre bug à été repéré, qui peut conduire à la corruption de certaines pièces jointes (lorsqu’elle dépassent les 600 Ko environ). Ce problème n’est pas spécifique à Access 2007.

    Ces deux problèmes sont corrigés dans la version 1.20, qui devrait sortir très prochainement.

    As-tu rencontré d’autres soucis dans l’utilisation de la bibliothèque ?

  14. zineb dit :

    Bonjour,

    est-il possible de paramétrer la bibliothèque pour l’utiliser sous Access 2007?
    Merci de votre réponse!

  15. DenisS dit :

    Merci ! 🙂

    Le tableau PJ() sert à transmettre les informations nécessaires à la procédure CreeMail.
    Cela permet de passer un nombre quelconque de références de PJ à la procédure à l’aide d’un seul paramètre.
    CreeMail va ensuite parcourir ce tableau, lire les fichiers correspondants, et enregistrer tout ça dans la table.
    Le code de CreeMail s’attend à voir un tableau de type String, à deux dimensions. Il faudra donc déclarer un tableau pour appeler la procédure, même si ce tableau ne contient qu’une seule ligne.
    Par contre, ce tableau peut parfaitement être initialisé à l’aide de tes variables.

    Tu peux, bien entendu, modifier le code source et l’adapter à tes besoins, mais cette modif sera à refaire lors de la sortie de la prochaine version…

  16. Baba75 dit :

    Bravo ! Superbe application ! que je viens de tester avec succès. Par contre dans mon programme je crée des états différents que je transforme en PDF et ensuite je les fusionnes en un seul et ensuite je dois le joindre systématiquement avec le mail du client en cours de traitement. Je n’ai donc pas besoin d’utiliser un tableau. Le nom du fichier et le chemin sont déjà stockés dans des variables.
    Je pense qu’il est possible à la place de tbPJ() de faire référence à mes propres variables.
    Merci pour vos conseils.

    Alain

  17. hamid dit :

    Merci beaucoup cher Deniss et salut à Mr Hervé
    Test réussi . A bientot

  18. DenisS dit :

    smtp.provider.com n’est là que pour l’exemple. Ce paramètre doit être remplacé par le nom du serveur SMTP de *TON* fournisseur d’accès.

    Ex. smtp.free.fr si tu es chez Free, etc…

    Ton FAI a dû te fournir ces informations.

    Tu dois avoir une adresse mail valide chez ce FAI, que tu dois mettre en adresse d’expéditeur, sinon le serveur refusera la connexion.

  19. hamid dit :

    bonjour cher Deniss
    j’ai crée un fichier journal sur C:Temp

    apres le test j’y ai trouvé un fichier avec la ligne suivante :

    Erreur de conversion de smtp.provider.com vers IP.
    12/02/2009 09:24:25 Fermeture du socket… (884) [0]
    12/02/2009 09:24:25 Libération des ressources. [0]
    12/02/2009 09:24:25 Déchargement du serveur.
    12/02/2009 09:24:25

  20. hamid dit :

    Merci bien cher Hervé
    Access 2002 2003
    le formulaire frm_SMTP existe ds la bd libMAIL.mdb . il s’ouvre en mode « minimized « 

  21. DenisS dit :

    Par défaut, libMail va tenter de créer un fichier journal sur C:Temp. Si ce dossier n’existe pas, l’erreur vient probablement de là.
    Au lieu de laisser le paramètre vide dans SMTPLance, met «  ». Le log ne se fera que dans la fenêtre, pas vers le disque dur.

  22. Hervé Inisan dit :

    hamid > Quelle est ta version d’Access ?

    Est-ce que le formulaire existe bien dans la base libMAIL.mdb ?

  23. hamid dit :

    Bonjour .

    je reçois ce message :

    run time error 76
    path not found

    code à deboguer:

    Sub SMTPRelance()
    Call Application.Forms.frm_SMTP.Demarrer
    End Sub

    Amicalement votre

Laisser un commentaire

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