Toute l'actualité de [self-access.com] en direct sur votre ordinateur !  Vous êtes ici : Accueil » Access » Assistants » libMAILConnexion
 


Introduction

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 ?

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.30.
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.

A s s i s t a n t s   A c c e s s  Taille Format Téléchargements
Bibliothèque libMAIL - Version 1.40b Update!Bibliothèque permettant l'envoi de mails à partir d'Access. Version 1.40b. 950 Ko 91
Bibliothèque libMAIL - Version 1.30 Bibliothèque permettant l'envoi de mails à partir d'Access. Version 1.30. 760 Ko 713
Bibliothèque libMAIL - Version 1.20 Bibliothèque permettant l'envoi de mails à partir d'Access 450 Ko 680


 1484 téléchargements depuis le 27/07/2009

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.
    Prenez soin d'enregistrer ce module sous le nom Outils, sinon l'exécution de la procédure ChargeVB provoquera le crash d'Access.
  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 de 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 :

Sub EnvoiMailSimple()
  ' Préparation du message
  CreeMail "destinataire@fournisseur.fr", _
    "Test de libMAIL", _
    "Ceci est un message envoyé par Access+libMAIL...", _
    "emetteur@provider.com", _
    CurrentUser
   
  ' Démarrage du serveur SMTP
  ' (et envoi du message)
  SMTPLance "smtp.provider.com", "provider.com"
End Sub

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 compte).

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

Astuce
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.
Sub EnvoiMailAvecPJ()
  ' Initialiser la liste des pièces jointes
  Dim tblPJ(1, 2) As String
  tblPJ(0, 0) = "Manuel_libMAIL.pdf"
  tblPJ(1, 0) = "C:\Documents and Settings\...\Manuel_libMAIL.pdf"
 
  tblPJ(0, 1) = "Hiver.jpg"
  tblPJ(1, 1) = "C:\Documents and Settings\...\Collines.jpg"
 
  tblPJ(0, 2) = "Coucher de soleil.jpg"
  tblPJ(1, 2) = "C:\Documents and Settings\...\Coucher de soleil.jpg"
 
  ' Préparation du message
  CreeMail "destinataire@fournisseur.fr", _
    "Test de libMAIL", _
    "Ceci est un message envoyé par Access+libMAIL...", _
    "emetteur@provider.com", _
    CurrentUser, , , tblPJ
   
  ' Démarrage du serveur SMTP
  ' (et envoi du message)
  SMTPLance "smtp.provider.com", "provider.com"
End Sub

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.

Est-ce que libMAIL est compatible avec le SMTP de Google Mail ?

Réponse de Denis sur les forums du site :

Malheureusement, libMAIL ne peut pas se connecter à GMail pour le moment. Smiley
La messagerie de Google sort un peu des sentiers battus :

  • elle utilise le port 587 au lieu du traditionnel port 25. La version 1.30 de libMAIL permet de spécifier un port non standard. Jusque là, ça irait...
  • GMail nécessite une connexion chiffrée TLS (anciennement SSL) (RFC-2246) Smiley

Ici, il n'y a que deux solutions :

  • trouver une bibliothèque ou une API TLS. Mais je veux limiter autant que possible les dépendances de libMAIL (une API native Windows, OK, une DLL supplémentaire, non).
  • implémenter moi-même la RFC-2246, directement en VBA. Mais, d'après ce que j'ai pu en voir, c'est assez touffu...

Si quelqu'un a dans ses cartons une implémentation VBA de TLS, et qu'il(elle) est prêt(e) à la mettre sous licence LGPL, je me ferai un plaisir de l'incorporer à la prochaine version winking smiley

Support

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

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

Nouveautés de la version 1.40b

  • Authentifications CRAM-MD5 et DIGEST-MD5.
  • Envoi d'objets Access en pièce jointe.
  • Options d'envoi différé et de conservation des messages.
  • Connexion avec l'adresse IP du serveur.
  • Annulation pendant la phase de connexion.
  • Choix automatique du Content-Type et du Content-Transfer-Encoding le plus compact pour les pièces jointes et le corps de message.
  • Importation d'un fichier HTML dans le formulaire d'édition de messages. ECreeMailMIME peut également charger un fichier HTML et le convertir en texte brut.
  • Exportation d'un message au format eml.

Nouveautés de la version 1.30

Voici les nouveautés de la version 1.30.
Pour plus de détails, consultez le ChangeLog plus bas.

  • La bibliothèque dispose d'une structure de données interne permettant de connaître son état à un instant t. Ces informations peuvent être utilisées par une application par l'intermédiaire d'une nouvelle fonction.
  • Le serveur affiche une icône dans la zone de notifications de Windows (system tray). Cette icône permet l'affichage de certaines notifications, ainsi que le contrôle du serveur.
  • Un nouveau formulaire permet d'afficher l'état du serveur, avec une barre de progression pendant l'envoi des messages. Le formulaire principal du serveur est maintenant masqué.
  • Un nouveau formulaire permet la gestion de la table BoiteMail.
  • Prise en charge des accusés de réception et de lecture.
  • Nouvelle commande EcreeMailMIME, permettant d'ajouter une partie HTML au message. ModifieMail permet la modification d'un message existant.
  • ChargeVB (du module Outils) tente d'ajouter automatiquement les références nécessaires (DAO, MSOffice)
  • Le paramètre HELOdomain des commandes (E)SMTPLance est maintenant facultatif. Par défaut, c'est le nom du PC. Les paramètres HELOdomain et OptionsESMTP de ESMTPLance ont été intervertis.
  • Nouvelles commandes et fonctions : SMTPAnnule, SMTPEnvoieMaintenant, SMTPEtatSrv, SMTPFormEtat, SMTPJournal, SMTPFormJnl, SMTPJnlRAZ, SMTPJnlFichier.
  • Commandes et fonctions modifiées : (E)SMTPLance : port non standard, SMTPRelance : modification du délai de scrutation.

Change Log

Version 1.40beta - juillet 2011
---------------------------
++ Fonction de hachage MD5.
++ Authentifications CRAM-MD5 et DIGEST-MD5.
++ Envoi d'objets Access en tant que P.J.
++ Nouvelles contantes pour les options étendues SMTP.
++ SMTPChange : permet de modifier des paramètres du serveur.
++ Options d'envoi différé et de durée de conservation d'un message.
++ Possibilité de se connecter avec l'adresse IP.
++ Choix automatique du Content-Type et du Content-Transfer-Encoding le plus compact pour les PJ et le corps de message.
++ Nouveaux états : lmlSrvConnexion et lmlSrvExecCmd.
++ Form. d'édition : bouton d'importation d'un fichier HTML.
   ECreeMailMIME peut importer une partie HTML depuis un fichier.
   Conversion HTML --> Texte brut automatique.
++ Export d'un message vers un fichier .eml.

--

** Extension de la fonction Purge. Efface également les enregistrements 'D'.
** Annulation possible pendant la phase de connexion.
** Erreur d'évaluation dans frm_SMTP.fNOTIFY : NEVER pouvait apparaître en même temps que DELAY ou FAILURE.
** Erreur lors du clic sur l'icône si l'application hôte est réduite (libMAIL au format MDE).
** L'affichage du journal par le formulaire est limité à 32767 car. (SelStart est un Entier).
** Différence entre OctetsTotal et OctetsEnvoyés à la fin de l'envoi.
** Conversion correcte des couleurs de l'icône en mode 16 bits (65536 couleurs).
** Enc_Base64 : réduction du temps d'encodage d'environ 50%.
** Dec_Base64 : réduction du temps de décodage d'environ 30%.
** UaUTF8 : réduction du temps d'encodage d'environ 40%.
** Correction de l'encodage et du décodage Quoted-printable.
** La modification d'un message ajoutait un CRLF parasite aux pièces jointes.
** Etat lmlSrvAttente sur SMTPRelance.
** Journal() appelle SMTPJnlRAZ si nécessaire.
** Extension de la variable interne de la bibliothèque. Suppression des Property de frm_SMTP.


Version 1.30 - Juin 2010
------------------------
++ Variable d'état du serveur et fonction d'interrogation.
++ Icône dans la zone de notification Windows (system tray).
++ Notifications pendant et à la fin de l'envoi.
++ Menu contextuel à partir de l'icône.
++ Commandes d'envoi immédiat, interrogation d'état et gestion du journal.
++ Annulation de l'envoi (sauf pour le message en cours).
++ Formulaire d'affichage de l'état du serveur, avec progression.
++ Fonctions UaUTF8() et UTF8aU(), conversion Unicode <--> UTF8.
++ Fonctions Enc_QP et Dec_QP : conversion d'une chaîne en Quoted printable.
++ Fonction ModifieMail() permettant la modification interactive d'un message non envoyé.
++ Formulaire de gestion de la table BoiteMail.
++ Options MDN (avis de réception et de lecture) : Disposition-Notification-To, Return-Receipt-To
++ Option de priorité de message.
++ Possibilité de spécifier le port de connexion au serveur SMTP.
++ Possibilité d'ajouter un corps au format HTML (fonction ECreeMailMIME()).
++ Création automatique des références par ChargeVB (DAO, Office)

-- Fonction Enc_UTF8.

** frm_SMTP n'est plus visible.
** Correction du calcul de la taille du message.
** Amélioration de la vitesse d'envoi (EnvoiCMD : DoEvents 'conditionnel' avant select(), DoEvents rapide après send()).
** SMTPRelance permet de changer le délai de scrutation.
** Limitation de SIZE à 2 Gio (cas d'un serveur retournant 82057666368 pour SIZE => dépassement de capacité).
** Exclusion des plages D800 à DFFF et FFFE à FFFF de l'encodage UTF-8.
** L'espace n'est plus considéré comme un séparateur d'adresses (fonction Delims()).
** Erreur de dimension pour UBound (ECreeMailMIME(), ErreursPJ())
** (E)SMTPLance : HELOdomain est maintenant facultatif. Nom du PC pris par défaut.
   !!! ATTENTION : Les paramètres HELOdomain et OptionsESMTP sont intervertis dans ESMTPLance !!!
** frm_EditeMail est dimensionnable.
   Contrôle des champs À, De, CC et CCi.


Version 1.20 - Juillet 2009
---------------------------
++ Prise en charge de l'extension DSN (accusés de réception - RFC 1891).
++ Fonction ECreeMail(), création de mail avec options étendues (DSN). Retourne un identifiant unique de message.
   ECreeMail() remonte les erreurs sur les pièces jointes. La fonction ErreursPJ() permet de déterminer s'il y a eu des erreurs.
++ Formulaire de création/modification de message, appelé à partir de (E)CreeMail, à l'aide de l'option EditeMail.
++ Ajout d'un champ 'X-Mailer:' à l'en-tête.
++ Fonction Enc_QP : encode une chaîne en Quoted-Printable.
++ Fonction Enc_UTF8 : encode une chaîne Unicode en UTF-8.
++ DTU supplémentaire pour les options de messages : tuESMTP_MSG
++ Ajout de la propriété VersTbl à la table BoiteMail.
++ Vérifie que le socket peut accepter des données avant send(). Certaines PJ pouvaient être tronquées.

--

** Enc_Base64 : Réduction du temps d'encodage d'environ 50% (conversion en tableau Byte de toute la chaîne d'entrée).
** Dec_Base64 : Réduction du temps de décodage d'environ 30%.
** Le module Outils est déclaré Private Module. Il n'y a pas de risque de l'appeler accidentellement depuis l'aplication principale.
** Les fonctions et procédures privées de la bibliothèques ont été réparties dans des modules distincts.
** Structure de la table BoiteMail : champs supplémentaires pour les extensions SMTP, identifiant de message (clé primaire).
** VerifieBAL refuse de créer la table dans la bibliothèque.
   Contrôle la version de la table et la met à jour si nécessaire.
   Sait mettre à jour une table attachée.
** L'objet, le corps de message et le nom de la P.J. sont transmis en quoted-printable (UTF-8), afin de préserver les caractères non ASCII (>127).


Version 1.10 - Mars 2009
------------------------
++ Support partiel des extensions SMTP (RFC2821). Connexion par EHLO, avec repli éventuel sur HELO.
   Les extensions SIZE, AUTH-LOGIN et AUTH-PLAIN sont prises en charge (RFC 2554).
++ ESMTPLance() pour les connexions avec authentification.
   SMTPLance() est toujours utilisable pour les connexions sans authentification.
++ Constantes et type défini par l'utilisateur pour l'authentification (voir la doc.).

--

** Le code de la fonction EnvoieTout() a été remanié.
** EnvoiCMD() ne renvoie que le premier caractère du code de retour (RFC 2821).
** Une estimation de la taille du mail est ajoutée à la commande MAIL si l'extension SIZE est prise en charge.


Version 1.01 - Février 2009
---------------------------
++ Fonction Dec_Base64() : décodage d'une chaîne codée en Base 64.
++ Fonction myCurrentUser() : retourne le login Windows.
--
** CreeMail() : le paramètre [sUtilisateur] est maintenant facultatif. Le login Windows est utilisé par défaut.
** SMTPRelance, SMTPSuspend et SMTPDecharge vérifient que le formulaire est chargé.
** SMTPLance : contrôle de la validité de la spec de fichier pour le journal.
** ChargeVB() positionne le nom de projet à  'libMail'. Ceci garantit une référence constante, même si le nom du fichier de BDD (utilisé par défaut pour la propriété) est différent de 'libMail'.




Mes livres sur Access...
[cliquez pour plus d'infos]





Hit-Parade 
 
[ Copyright 1997-2012 hervé inisan, self-access.com Reproduction interdite ]