Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 
C

Compte Supprimé 979

Guest
Bonjour à tous,

Navré de te contredire @Oneida, mais avec la dernière version d'Office et selon les statégies de sécurité, Outlook doit être ouvert si l'on veut que le mail parte

@kiki29, le site de Ron commence à dater, même si les codes qui y figurent sont toujours viables, il existe ce fameux problème aujourd'hui.

@epicot, seule solution si ta société le permet, l'envoi via la méthode CDO
Je site également le site de Rn : https://www.rondebruin.nl/win/s1/cdo.htm

A+
 

epicot

XLDnaute Nouveau
merci pour vos retours, j'ai trouvé un code qui m'ouvre et ferme outlook avant l'envoi en revanche j'ai l'affichage classic de outlook ( fermeture avant envoi ....)

quelqu'un sait il si il est possible de fermer outlook seulement après l'envoi du mail ?
 
C

Compte Supprimé 979

Guest
Bonjour epicot,

Ne soyez pas égoïste, il serait bien de donner ici le code trouvé
comme cela si quelqu'un d'autre cherche la même solution il l'aura

A+
 

Oneida

XLDnaute Impliqué
Bonjour,
dernière version d'Office Outlook doit être ouvert
Ok, pour ceux qui ont la derniere version

société le permet, l'envoi via la méthode CDO
Pas mal de soucis avec: courriels bloques cote server et le plus souvent en pourriels
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
@BrunoM45
ce n'est pas du forcement du a la nouvelle version
quand j'etais sur W7 avec 2007 ou 2013 ça me le faisait aussi
et attention CDO de plus en plus les serveurs on des protocoles pour empêcher l'utilisation d'applications tiers (sans protocole d'accords )a l'image de gmail par exemple qui fut le premier à le faire

@epicot je rejoins Bruno sur ce point aussi
tu viens chercher une réponse et tu nous dis que tu a trouvé c'est bien
mais ne pas le partager c'est presque un manque de respect pour ceux qui ont pris la peine de t ' accompagner pendant un moment

ben si tu partage on te donnera la marche a suivre pour allumer et éteindre automatiquement après le mail
 
Dernière édition:

epicot

XLDnaute Nouveau
bonjour,
pas de problème pour partager et désolé si vous avez eu l'impression d'un manque de respect

VB:
Private Sub btn_fermer_Click()

Dim Appli As Object
    Dim SessionOutlook, myOlApp
    Const Chemin As String = "C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.exe"   '---> tu adaptes ce chemin si c'est nécessaire
 
    On Error Resume Next
    Set Appli = GetObject(, "Outlook.Application")
 
    'Tester si l'application est ouverte ou non
    If Appli Is Nothing Then
            MsgBox "Outlook est fermé"   '---> Donc ouvre moi une session
            SessionOutlook = Shell(Chemin, 1)

'sauvegarde fichier

    sauvegarde_fichier_fermeture
    

' envoi MAIL
    
    envoi_mail_fermeture
    
            Else
            
'sauvegarde fichier

    sauvegarde_fichier_fermeture
    

' envoi MAIL
    
    envoi_mail_fermeture
    End If
    
      
    'Set myOlApp = CreateObject("Outlook.Application")
    '        myOlApp.Quit
      
    'Application.Quit

End Sub

Sub sauvegarde_fichier_fermeture()

'sauvegarde fichier
    Dim dossier1 As String
    Dim fichier As String
    Dim datevalidation As String
    Dim datevalidationmaj As String
        
    datevalidation = Date
    datevalidationmaj = Format(Date, "DD-mm-yy")
    dossier1 = Sheets("dossier").Range("b2")
    fichier = Sheets("dossier").Range("C2")
    
    ActiveWindow.SmallScroll Down:=-100 'repositionner ecran
    
    Application.DisplayAlerts = False
      
    With ActiveWorkbook
    .SaveAs Filename:=dossier1 & fichier & " - " & datevalidationmaj, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
 
    End With
    
'sauvegarde fichier_bureau
    Dim dossier2 As String
    Dim fichier2 As String
    
    
    dossier2 = Sheets("dossier").Range("b4")
    fichier2 = Sheets("dossier").Range("C4")
    
    Application.DisplayAlerts = False
      
    With ActiveWorkbook
    .SaveAs Filename:=dossier2 & fichier2, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
 
    End With
    
    Application.DisplayAlerts = True
      
' Message de confirmation

'MsgBox ("Le fichier a bien été sauvegardé" & vbCrLf & vbCrLf & "Merci ")

End Sub

Sub envoi_mail_fermeture()

    Dim xOutlook As Object
    Dim xMailItem As Object
    Dim xEmailAddr As String
    Dim xEmailAddrCC As String
    On Error Resume Next
    
    Dim dossier1 As String
    Dim fichier As String
    Dim datevalidation As String
    Dim datevalidationmaj As String
        
    datevalidation = Date
    datevalidationmaj = Format(Date, "DD-mm-yy")
    dossier1 = Sheets("dossier").Range("b2")
    fichier = Sheets("dossier").Range("C2")
          
    Set xOutlook = CreateObject("Outlook.Application")
    Set xMailItem = xOutlook.CreateItem(0)
      
'Selection de la page des adresses mail
    Worksheets("Dossier").Activate
'Selection de la cellule nommée 'CELL_ADR_MAIL' représentant le nom de la colonne des mails dans le tableau
    Sheets("Dossier").Range("CELL_ADRESSE_MAIL").Select
'Déplacement d'une ligne en dessous pour débuter la boucle de lecture des adresses mail
    ActiveCell.Offset(1, 0).Select
    
    Do Until IsEmpty(ActiveCell)
        'If ActiveCell.Value Like "*@*" Then ' si celulle active contient une adresse mail
        If ActiveCell.Value <> "" Then ' si cellule active non vide
            If xEmailAddr = "" Then
                xEmailAddr = ActiveCell.Value
            Else
                xEmailAddr = xEmailAddr & ";" & ActiveCell.Value
            End If
        End If
        
'Lecture de l'adresse mail suivante, une ligne en dessous
        ActiveCell.Offset(1, 0).Select
    Loop
    
'Si la liste des adresses mail n'est pas vide on diffuse
    
    If xEmailAddr <> "" Then
        With xMailItem
            
            .To = xEmailAddr
            .CC = xEmailAddrCC
            .Subject = "Essai Fermeture fichier " & datevalidationmaj
            '.body = "Bonjour,"
            .Attachments.Add dossier1 & fichier & " - " & datevalidationmaj & ".xlsm"
            .display
            .Send 'validation envoi
        End With
        
        Set xOutlook = Nothing
        Set xMailItem = Nothing
    End If
    
    Combo_user = ""
    TextBox_mdp = ""
        
    
    'Annule le Masquage l'éxécution de la macro
    Application.ScreenUpdating = True

End Sub
 

patricktoulon

XLDnaute Barbatruc
re
d'accords Merci pour ce partage
mais sauf erreur de ma part il n'y a pas la fermeture de la session outlook lancé par shell
tu n'a donc que la moitié de la solution
et tu te retrouve avec une instance de outlook ouverte (peut etre même invisible )sans pouvoir l'atteindre car tu lance un shell simple
on récupère toujours le handleprocess d'un shell ; ne serait ce que pour l'identifier pour éventuellement le fermer
 

epicot

XLDnaute Nouveau
tu as tous compris, si je demande la fermeture de outlook avec le code ci dessous, j'ai cette fenetre pop up qui s'affiche



et qui me bloque tout

l'idéal pour moi serait que la création du mail et son envoi soit totalement transparent

VB:
'Set myOlApp = CreateObject("Outlook.Application")
    '        myOlApp.Quit
      
    'Application.Quit
 

patricktoulon

XLDnaute Barbatruc
deja il faut les supprimer ces message en attente outlook ne le fait pas tout seul

tu a ces brouillons car tu a tenter plusieurs fois sans succes
mais cela n'a rien a voir avec l'instance lancée par shell
il y donc celle ci (créée par createobject celle dont tu te sert) et l'autre par shell
tu n'a donc pas la solution
j'ai retrouvé dans mes archives le truc mais sur W10 ca ferme tout les process outlook
j'ouvre avec shell en recuperant le handle process et je le ferme en faisant un terminate sur le process en le designant par son handle avec WMI mais probleme ca ferme toute les instance d'outlook et pas que celle lancée avec shell

nous revoilà donc à la case départ
 

epicot

XLDnaute Nouveau
j'ai contourné le problème en mettant en pause la macro quelques secondes
ce n'est pas l'idéal je sais

il ne me reste plus qu'a trouver un code pour laisser au premier plan mon fichier excel et outlook au second plan
as tu une solution ?
 

patricktoulon

XLDnaute Barbatruc
re

je ne vois pas ce qu'une pose vient faire la dedans



voilà ça avant ça fonctionnait
ça fermait juste l'instance de outlook ouvert par shell
VB:
Dim ProcessId As LongPtr
Sub test()

    ProcessId = Shell("C:\Program Files (x86)\Microsoft Office\Office15\OUTLOOK.EXE", vbNormal)


    With CreateObject("outlook.application")
        Set Email = .CreateItem(0)

        With Email

            .Subject = "toto"
            .body = "coucou"



            .display
            '.send

        End With

    End With
End Sub

Sub fermeoutlook()
    Set WMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set ProcessList = WMIService.ExecQuery("Select * from Win32_Process Where Name = 'Outlook.exe'")

    'le problème est que chaque instance est enfant de la première
    'donc quand je ferme celle dont j'ai le processID toute les autres sont fermées aussi
    For Each process In ProcessList
        If process.Handle = ProcessId Then process.Terminate
    Next

End Sub
sauf que aujourd'hui les instance sont imbriquée

mais le handle process obtenu avec le shell est celui de la mère de tous
donc quand je ferme avec la sub ferme ça les ferme tous
c'est balloh!!!!
alors quand on en a qu'un c'est pas grave , mais quand on en a plusieurs et que l'on veut garder les autres ouvertes c'est plus ennuyeux
 

Discussions similaires

Réponses
2
Affichages
657
Réponses
1
Affichages
342
Compte Supprimé 979
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…