Microsoft 365 VBA envoi Mail avec Outlook

epicot

XLDnaute Nouveau
Bonjour, j'ai une macro qui génère et envoi automatiquement un mail. jusque la pas de problème ;)
En revanche si outlook n'est pas ouvert le mail se met en attente et ne s'envoie qu'au moment ou j'ouvre Outlook

est ce que quelqu'un a un code pour solutionner mon problème.

eric
 

mromain

XLDnaute Barbatruc
Bonjour à tous,

@epicot : tu trouveras ci-dessous un essai avec un module de classe dédié à gérer l'application Outlook.

Code du module de classe nommé Cls_Outlook :
VB:
Option Explicit

'Nécessite d'activer la référence 'Microsoft Outlook XX.0 Object Library'

Private m_o_olApp As Outlook.Application
Private m_o_olOutbox As Outlook.Folder
Private WithEvents m_o_itemsSent As Outlook.Items
Private m_b_alreadyOpened As Boolean


Public Property Get olApp() As Outlook.Application
    If m_o_olApp Is Nothing Then
        'essayer de récupérer l'instance d'Outlook s'il est déjà ouvert
        On Error Resume Next
         Set m_o_olApp = GetObject(, "Outlook.Application")
        On Error GoTo 0
        'si Outlook n'était pas ouvert, créer une nouvelle instance
        m_b_alreadyOpened = Not m_o_olApp Is Nothing
        If Not m_b_alreadyOpened Then Set m_o_olApp = CreateObject("Outlook.Application")
        'récupérer l'outbox et les éléments envoyés
        If m_o_olOutbox Is Nothing Then
            Set m_o_olOutbox = m_o_olApp.Session.GetDefaultFolder(olFolderOutbox)
            Set m_o_itemsSent = m_o_olApp.Session.GetDefaultFolder(olFolderSentMail).Items
        End If
    End If
    Set olApp = m_o_olApp
End Property

'évènement se déclenchant quand un élément est ajouté au dossier 'éléments envoyés'
Private Sub m_o_itemsSent_ItemAdd(ByVal Item As Object)
    'si outlook n'était pas ouvert et que l'outbox est vide
    If (Not m_b_alreadyOpened) And (m_o_olOutbox.Items.Count = 0) Then
        'fermer outlook
        m_o_olApp.Quit
        Set m_o_olApp = Nothing
        Set m_o_olOutbox = Nothing
        Set m_o_itemsSent = Nothing
    End If
End Sub

Et ensuite, un code montrant comment l'utiliser (dans un module standard) :
VB:
Private Property Get olApp() As Outlook.Application
Static l_o_ol As Cls_Outlook
    If l_o_ol Is Nothing Then Set l_o_ol = New Cls_Outlook
    Set olApp = l_o_ol.olApp
End Property


Sub Test()
Dim l_o_mail As Outlook.MailItem
   
    Set l_o_mail = olApp.CreateItem(olMailItem)
    With l_o_mail
        .To = "toto.tutufree.fr"
        .Subject = "test9998"
        .Body = "Coucou"
        .Send
    End With
   
    Set l_o_mail = Nothing
End Sub

Le module de classe Cls_Outlook permet d'accéder à l'application Outlook : si Outlook est déjà ouvert, on utilise cette instance, sinon, on en crée une nouvelle.
Il écoute les évènements du dossier éléments envoyés (se déclenchant chaque fois qu'un élément est transféré dans ce dossier). Ainsi, on peut dire à Outlook de se fermer uniquement s'il n'était pas ouvert au préalable et quand tous les éléments ont été envoyés.

Par contre, cette solution nécessite d'activer la référence Microsoft Outlook XX.0 Object Library, ce qui peut poser problème si le même fichier est utilisé par plusieurs utilisateurs ayant des versions différentes d'Office.

A+
 

Discussions similaires

Réponses
2
Affichages
240
Réponses
1
Affichages
119
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 225
Messages
2 086 412
Membres
103 202
dernier inscrit
Claire2BM