IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Envoyer des mails avec CDO


Sujet :

VBA Access

  1. #1
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut Envoyer des mails avec CDO
    Bonjour à tous,
    peut être est ce que j'enfonce des portes ouvertes mais bon....
    CDO Collaborative Data Object

    1 Utilité
    Pour envoyer des mails en VBA on peut très bien utiliser les fonctions de la bibliothèque Outlook, tous se passe bien pour un mail (envoi d'un devis à un client par exemple) mais outlook averti qu'un programme tente d'envoyer un mail et demande une confirmation donc pour 300 les mails d'un mailling.......

    2 Téléchargement
    On peut técharger la bibliothèque chez microsoft ICI

    3 Utilisation
    Avec un serveur simple (chez moi et aussi chez mon client), j'ai réalisé ce petit moteur de publimailling: il illustre les diiférentes possiblité: objet, corps message, destinataire, pièce jointe, html dans le corps du message:
    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
    Private Sub Envoi_Click()
    Dim Rst_Mail As DAO.Recordset
    Dim Rst_Contact As DAO.Recordset
    Dim Emetteur As String
    Dim Serveur As String
    Dim Objet As String
    Dim Corps_message As String
    Dim Message As New CDO.Message
     
    ' Ouvre la ligne des caractéristiques du mailling dans la table "mails"
    Set Rst_Mail = CurrentDb.OpenRecordset("select * from mails where N°_mailling = " & N°_mailling)
    ' Ouvre la table_mails dans laquelle on a stocké les adresses mail
    Set Rst_Contact = CurrentDb.OpenRecordset("table_mails")
    ' récupère le serveur d'émission dans la table paramètres
    Serveur = DLookup("texte", "parametres", "Variable = 'SMTP'")
    ' récupère le nom de l'émetteur dans la table paramètres
    Emetteur = DLookup("texte", "parametres", "Variable = 'Emetteur'")
     
    Do Until Rst_Contact.EOF
        Set Message = CreateObject("CDO.Message")
        'initialisation et configuration de la connexion
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/smtpserver") = Serveur
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            Message.Configuration.Fields.Update
     
            Objet = Nz(Rst_Mail("Objet"), "  ")
            Corps_message = Nz(Rst_Mail("Corps_message"), "  ")
        With Message
                .From = Emetteur
                .TextBody = Corps_message
                .Subject = Objet
                .To = Rst_Contact("Mail_contact")
     
                Select Case Code_d_envoi
                    Case 1 	 'ouverture de l'état, sauvegarde en PDF et fermeture
                        DoCmd.OpenReport Rst_Mail("Nom_état"), acViewPreview, , "Mail_contact = '" & Rst_Contact("Mail_contact") & "'", acHidden
                        DoCmd.OutputTo acOutputReport, Rst_Mail("Nom_état"), "PDFFormat(*.pdf) ", Rst_Mail("Fichier_incorporé")
                        DoCmd.Close acReport, Rst_Mail("Nom_état")
                       ‘ Joindre le PDF
                        .AddAttachment Rst_Mail("Fichier_incorporé")
     
      Case 2           	'envoi du mail avec pièce jointe
                        .AddAttachment Rst_Mail("Fichier_joint")
     
                    Case 3		 'envoi du mail avec HTML incorporé dans le corps du mail
                        .CreateMHTMLBody Fichier_à_incorporer
     
                    Case 4		 'envoi du mail avec HTML personnalisé incorporé dans le corps du mail
                        .CreateMHTMLBody Fichier_incorporé
     
                End Select
                 'Envoi du mail
               .Send
         End With
            Set Message = Nothing
    Loop
    End Sub
    serveur, stocké dans la table paramètres est du genre smrp.infonie.fr
    2 est la valeur de la constante sendusingport qui décrit la méthode d'envoi (je n'ai pas les autres)
    25 est le port d'envoi (on trouve ça dans les exemples)
    à l'époque j'ai buté longtemps sur le .Update qui est indispensable

    Ensuite mon client est passé chez orange-business et là, plus rien n'a fonctionné ! !
    on a rapidement trouvé dans les docs orange remises à mon client que le serveur était devenu smtp.auth.orange-business.com et le port 587
    ensuite sur cette page microsoft on a trouvé les mots sendusername and sendpassword
    Il a encore fallu l'aide d'un programmeur et un exemple sur code osurce (je remercie tout le monde) pour finir par écrire le code qui marche: (juste les lignes en remplacement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        'initialisation et configuration de la connexion
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/smtpserver") = Serveur
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/sendusername") = "monadresse.mailling@monsiteoumonserveur"
            Message.Configuration("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "monmotdepasse"
            Message.Configuration.Fields.Update
    le plus dur à trouver a été le smtpauthenticate = 1 qui n'est pas mentionné sur la doc ci-dessus et dont la valeur dans l'exemple code source est: cdobasic avec le commentaire: je sais pas d'où ça vient mais ça marche (avec compassion et avec mes excuses pour l'exactitude de la citation)
    Il semble donc que la constante cdobasic soit égale à 1 qui signifie: "oui il faut une identification"
    suivent alors le username et le mot de passe que l'on peut trouver sur les documents remis par le fournisseur Internet

    En espérant vous aider et en attente de propositions d'amélios (même les fautes d'orthographe et de français) de cet article
    -------------------Simplifi----------comme si tout était simple--------

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut les messages
    Bonjour,

    C'est super CDO, Simplifi, mais ...on peut pas tout faire, perso les cdo je l'utilise que pour les notifications automatisées.


    Faudrait un beau tableau avec les 4 façons d'envoyer du mail avec l'access et les possibilités fonctionnelles de telle ou telle méthode, style avantages inconvénients.

    a+

  3. #3
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut on peut pas tout faire?
    Bonjour Naphta,
    pourrais tu éclairer un peu plus notre lanterne sur les limites de CDO
    et aussi sur les différentes manières d'envoyer des mails
    j'utilise déjà:
    - le bon vieux clic sur l'adresse mail stockée en lien hypertexte
    - la bibliothèque outlook en VBA
    - le menu courrier electronique
    - la commande docmd.sendobject
    quelles autres manières?
    -------------------Simplifi----------comme si tout était simple--------

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut les méthodes
    Bonjour,

    Après moult tentatives et tests voici en pièce attachée le résultat de mes impressions quant aux 4 méthodes.

    Sachant qu'il y en a une autre MSMAPI très complet mais équivalant à une référence sur outlook, et puis j'ai rien trouvé sur le net msmapi avec access.

    A bientôt
    Si le tableau pas complet ..ou faux

  5. #5
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Merci Naphta pour ce tableau
    il confirme bien mes impressions
    j'utilise donc bien CDO pour ses principaux avantages:
    - pas de trace dans éléments envoyés (pour 3000 mails c'est mieux)
    - surtout le point le + important: corps en html possible
    - éviter la sécurité d'outlook car 3000 yes, c'est insuportable

    C'est en fait parce que je trouve la doc microsoft à propos de CDO absolument minable que j'ai posté le code qui a solutionné mon problème.
    -------------------Simplifi----------comme si tout était simple--------

  6. #6
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour à tous

    Discussion très intéressante.
    Aux propositions de méthode référencées dans le tableau de Naphta, je mettrais un bémol sur l'automation avec Outlook, c'est que cette méthode utilise justement Outlook, ce qui n'est pas forcément le cas.

    C'est en tout cas le mien (lors d'une autre discussion quelqu'un signalait qui si on avait Access, on devait avoir Outlook.... certes, mais pas l'avoir n'est pas forcément l'utiliser)

    Par contre, j'aimerais bien qu'on m'éclaire sur la méthode "api mapi"? Qu'est-ce donc?

    Bonne journée.

    Pierre

  7. #7
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello Pierre,
    désolé, je ne connais pas Mapi, essaye le MP à Naphta et reviens nous donner le résultat
    -------------------Simplifi----------comme si tout était simple--------

  8. #8
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut
    Bonjour,

    Désolé de ce retard j’étais absent.

    le problème :
    Les commerciaux veulent envoyer des messages en les visualisant avec en pièces attachées le devis et tous les documents relatifs aux bazars figurant dans le devis.
    Les postes ont tous des clients de messagerie différents.

    Mapi :
    Normalement Mapi32.dll est livré de base aves tous les systèmes Microsoft.

    J’ai trouvé ce code sur le net un peu modifié et très pratique pour solutionner le problème exposé plus haut.

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
     
    Option Compare Database
    Option Explicit
     
    'Déclarations speciales pour MAPI
    Type MAPIMESSAGE
       Reserved As Long
       Subject As String
       NoteText As String
       MessageType As String
       DateReceived As String
       ConversationID As String
       flags As Long
       RecipCount As Long
       FileCount As Long
    End Type
     
    Type MapiRecip
       Reserved As Long
       RecipClass As Long
       Name As String
       Address As String
       EIDSize As Long
       EntryID As String
    End Type
     
    Type MapiFile
       Reserved As Long
       flags As Long
       position As Long
       PathName As String
       FileName As String
       FileType As String
    End Type
     
    Global Dialogue As MAPIMESSAGE
     
     
    Declare Function MAPISendMail _
                     Lib "MAPI32.DLL" _
                     Alias "BMAPISendMail" (ByVal Session&, _
                     ByVal UIParam&, _
                     Message As MAPIMESSAGE, _
                     Recipient() As MapiRecip, _
                     File() As MapiFile, _
                     ByVal flags&, _
                     ByVal Reserved&) As Long
     
    Global Const SUCCESS_SUCCESS = 0
    Global Const MAPI_TO = 1
    Global Const MAPI_CC = 2
    Global Const MAPI_CCO = 3
    Global Const MAPI_LOGON_UI = &H1
    Global Const MAPI_DIALOG = &H8
    Function CountWords(ByVal sSource As String, _
                        ByVal sDelim As String)
     
    Dim iDelimPos As Integer
    Dim iCount As Integer
     
     If sSource = "" Then
        CountWords = 0
     Else
        iDelimPos = InStr(1, sSource, sDelim)
     
        Do Until iDelimPos = 0
            iCount = iCount + 1
            iDelimPos = InStr(iDelimPos + 1, sSource, sDelim)
        Loop
            CountWords = iCount + _
                         IIf(right(sSource, 1) = sDelim, 0, 1)
     End If
    End Function
    Function GetWords(sSource As String, _
                      ByVal sDelim As String) As String
     
    Dim iDelimPos As Integer
     
    iDelimPos = InStr(1, sSource, sDelim)
     
        If (iDelimPos = 0) Then
            GetWords = Trim$(sSource)
            sSource = ""
        Else
            GetWords = Trim$(left$(sSource, iDelimPos - 1))
            sSource = Mid$(sSource, iDelimPos + 1)
        End If
     
    End Function
     
    Sub ParseWords(mArray() As String, _
                   ByVal sTokens As String, _
                   ByVal sDelim As String)
    Dim i As Integer
     
    For i = LBound(mArray) To UBound(mArray)
        mArray(i) = GetWords(sTokens, sDelim)
    Next i
     
    End Sub
    Function SendMail(sSubject As String, sMessage As String, Optional sTo As String, Optional sAttach As String) As Long
     
       Dim i As Integer
       Dim cto As Integer
       Dim cAttach As Integer
       Dim MAPI_Message As MAPIMESSAGE
     
        If Len(sTo) > 0 Then
           cto = CountWords(sTo, ";")
              ReDim rTo(0 To cto) As String
            ParseWords rTo(), sTo, ";"
     
            ReDim MAPI_Recip(0 To cto - 1) As MapiRecip
            For i = 0 To cto - 1
               MAPI_Recip(i).Name = rTo(i)
               MAPI_Recip(i).RecipClass = MAPI_TO
            Next i
     
        End If
     
        If Len(cAttach) > 0 Then
            cAttach = CountWords(sAttach, ";")
            ReDim rAttach(0 To cAttach) As String
            ParseWords rAttach(), sAttach, ";"
                ReDim MAPI_File(0 To cAttach) As MapiFile
            MAPI_Message.FileCount = cAttach
                For i = 0 To cAttach - 1
                   MAPI_File(i).position = -1
                   MAPI_File(i).PathName = rAttach(i)
                Next i
        End If
     
     
       MAPI_Message.Subject = sSubject
       MAPI_Message.NoteText = sMessage
       MAPI_Message.RecipCount = cto
       Dialogue.flags = MAPI_LOGON_UI + MAPI_DIALOG
     
        SendMail = MAPISendMail(0&, 0&, MAPI_Message, MAPI_Recip(), MAPI_File(), Dialogue.flags, 0)
     
     
    End Function
    à bientôt

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 09/05/2009, 21h54
  2. Longueur des mail avec cdo.messages
    Par roro06 dans le forum ASP
    Réponses: 4
    Dernier message: 05/05/2008, 11h57
  3. envoyer des mails avec wss 3.0
    Par maxban dans le forum SharePoint
    Réponses: 6
    Dernier message: 11/11/2007, 19h52
  4. [C# CF2.0] Envoyer des mails avec PocketOulook
    Par Jérôme Lambert dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 17/11/2006, 09h01
  5. [c#] Envoyé des mails avec c#
    Par olifile dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/10/2006, 20h57

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