Fonction envoi de mail par vba sans client local, par serveur smtp

Soyez le premier à donner votre avis sur cette source.

Snippet vu 33 499 fois - Téléchargée 19 fois

Contenu du snippet

Cette fonction est simple, courte, facile à utiliser, elle ne nécessite pas de Outlook ou autre Lotus installé en local, somme toute ça semble idéal. Il faut juste une DLL, donc cocher la référence associée:
"Microsoft CDO for windows 2000 library"
(correspondant au fichier system32/cdosys.dll)

Cette fonction envoie le mail avec la ou les pièce(s) jointe(s) (je n'utilise pas de body - texte dans le mail mais ça peut s'ajouter dans la fonction)
Pratique pour l'envoi en masse de messages sur une base Access.

J'utilise les constantes suivantes pour la configuration:

' configuration SMTP pour envoi de mail
Public Const MAIL_SENDUSING = 2
Public Const MAIL_AUTHENTICATE = 1
Public Const MAIL_CPT_SENDUSR = "<nom du compte>"
Public Const MAIL_CPT_SENDPASS = "<passe du compte>"
Public Const MAIL_FROM = "<mail de l'expéditeur>"
Public Const MAIL_SMTP_SERVER = "<nom serveur>"
Public Const MAIL_SMTP_SERVERPORT = 25

Source / Exemple :


'''""""""""""""""""""""""""""""""""""""""""""""""""""'''
'
'   FONCTION : envoyer un mail par SMTP
' pstrTo : 1 ou plusieurs destinataire(s)
' pstrSubject : objet du mail
' pvarAttachFile : 1 ou plusieurs fichiers joints - string ou array de string
'
'''""""""""""""""""""""""""""""""""""""""""""""""""""'''
Public Function SMTPSendMail(pstrTo As String, pstrSubject As String, Optional pvarAttachFile As Variant) As Boolean
On Error GoTo SMTPSendMail_Err

    Dim i As Long
    Dim objEmail As New CDO.Message
    'Set objEmail = CreateObject("CDO.Message")
    
    objEmail.From = MAIL_FROM
    objEmail.To = pstrTo
    objEmail.Subject = pstrSubject
    
    ' Aucun corps de message, uniquement la pièce jointe
    ' laisser un TextBody avec chaine vide, sinon le mail peut planter (pièce jointe incomplète)
    objEmail.TextBody = ""
    
    ' Ajout de la pièce jointe, 1 ou plusieurs fichiers
    If Not IsMissing(pvarAttachFile) Then
        If IsArray(pvarAttachFile) Then
            ' parcourrir le tableau
            For i = LBound(pvarAttachFile) To UBound(pvarAttachFile)
                objEmail.AddAttachment pvarAttachFile(i)
            Next i
        Else
            objEmail.AddAttachment pvarAttachFile ' "C:\temp\Bon de commande.pdf"
        End If
    End If
    
    With objEmail.Configuration.Fields
        .Item(CdoConfiguration.cdoSendUsingMethod) = MAIL_SENDUSING
        .Item(CdoConfiguration.cdoSMTPAuthenticate) = MAIL_AUTHENTICATE
        .Item(CdoConfiguration.cdoSendUserName) = MAIL_CPT_SENDUSR
        .Item(CdoConfiguration.cdoSendPassword) = MAIL_CPT_SENDPASS
        .Item(CdoConfiguration.cdoSMTPServer) = MAIL_SMTP_SERVER
        .Item(CdoConfiguration.cdoSMTPServerPort) = MAIL_SMTP_SERVERPORT
        .Update
    End With
    objEmail.Send

    SMTPSendMail = True
Exit Function
SMTPSendMail_Err:
    MsgBox Err.Description

End Function

Conclusion :


LA fonction renvoie TRUE en cas de succès, false sinon.

J'ai remarqué que si j'enlève la ligne suivante, les pièces jointes peuvent être illisibles (zip) ou incomplètes (pdf à moitié vierges!):
objEmail.TextBody = ""
Donc même si j'ai aucun texte dans le mail je le laisse.

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
mardi 7 février 2012
Statut
Membre
Dernière intervention
22 février 2012

Ah je pensais que les messages que j'avais laissé auparavant n'avaient pas fonctionné.
Merci à toi JB2718, grâce à toi tout marche.
Pour la signature j'ai trouvé une solution, en rajoutant un paramètre signature à la fonction qui me renvoie le chemin d'accès de l'image (car l'utilisateur choisi sa signature) :

Cette ligne pour récupérer juste le nom et l'extension de l'image :
NomSignature = Replace(pstrSignature, "C:\signatures", "")

strHTML = "<html>" & pstrCorps & "

</html>"
objEmail.HtmlBody = strHTML
objEmail.AddRelatedBodyPart pstrSignature, NomSignature, cdoRefTypeId

Ceci fonctionne malheureusement uniquement sur l'ordinateur.
En vérifiant l'email de chez moi, l'image n'apparait pas (petite croix).

Je pensais alors créer un fichier html affichant l'image, et l'utiliser dans le code comme ceci :
CreateMHTMLBody("file://" & CheminFichierHTML)
Mais j'arrive au mieux à aficher le code du fichier HTML dans le message mais pas le contenu..

Si quelqu'un a une idée.
Messages postés
5
Date d'inscription
mardi 7 février 2012
Statut
Membre
Dernière intervention
22 février 2012

Bonjour à tous,
Je suis actuellement en stage et je me sers de cette fonction qui est parfaite en tout point, seulement j'aimerai savoir si il serait possible d'ajouter une signature au mail ?
Merci d'avance
Messages postés
3
Date d'inscription
mardi 10 mai 2011
Statut
Membre
Dernière intervention
8 février 2012

Bonjour

Pour l'envoi à plusieurs destinataires, il suffit de les indiquer en séquence en les séparant par des points-virgules.
Exemple "jean.dupont@sfr.fr;alfred.durand@free.fr"

Cordialement

PS - pour l'envoi en copie cachée vous auriez pu ajouter un paramètre suplémentaire au lieu de le substituer à objEmail.To
Pour ma part j'ai généralisé la fonction de la façon suivante :

Public Function SMTPSendMail(Emetteur As String, _
Dest As String, _
Optional Cc As String, _
Optional CCi As String, _
Optional Objet As String, _
Optional Texte As String, _
Optional Pj As Variant _
) As Boolean

[...]

objMessage.From = Emetteur
objMessage.To = Dest
objMessage.Cc = Cc
objMessage.BCC = CCi
objMessage.Subject = Objet
objMessage.TextBody = Texte
Messages postés
5
Date d'inscription
mardi 7 février 2012
Statut
Membre
Dernière intervention
22 février 2012

En fait, pour le Bcc c'est bon, j'avais pas pensé à regarder si une méthode existé déjà, il suffit simplement de remplacer objEmail.To = pstrTo
par : objEmail.BCC = pstrTo

J'avais déjà réussi à envoyer plusieurs pièces jointes en passant par un array, est-ce la même procédure pour les destinataires ?
Messages postés
5
Date d'inscription
mardi 7 février 2012
Statut
Membre
Dernière intervention
22 février 2012

Bonjour !
Merci pour ce code qui fonctionne à merveille !
Je suis actuellement en stage et j'ai toutefois quelques question :
- Est-il possible passer en paramètre un mail de réponse différent de notre mail d'expéditeur (Le client répondra alors sur cette adresse) ?
- Plus important, je vois qu'il est possible d'envoyer le message à plusieurs destinataires mais je n'ai pas trouvé comment faire hélas, pourriez vous me donner des pistes ?
- Pour finir, est-il possible d'envoyer le message en Bcc ? (En effet pour l'entreprise dans laquelle j'effectue mon stage il n'est pas question que les clients puissent voir à qui d'autre a été envoyé le message...)

J'espère que vous pourrez me débloquer sur ces points (surtout les deux derniers).
Merci d'avance :-)
Afficher les 33 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.