Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Automation d'envoi de mail VBA Outlook : ?

13 réponses
Avatar
Gadget
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en enlevant
par exemple les articles 'New'. Il ne m'ouvrait alors qu'une instance, mais
n'envoyait jamais rien (bien que les mails se retourvent dasns les 'Elements
envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi du
mail (chaque mail faisant 400ko, son envoi peut prendre quelques secondes)
?

10 réponses

1 2
Avatar
papou
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?





Avatar
michdenis
Remplace ceci :

Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit

Par
Set ol = Nothing



"papou" a écrit dans le message
de news:
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?





Avatar
Gadget
J'appelle cette macro à partir d'une autre macro classique qui crée des pdfs
et stocke leur chemin complet dans le tableau nommé ici tableauPJ. IL y a 3
docs au maximum.
'Attendre 5' est une petite routine d'attente qui mermet de faire une pause
de 5 secondes. J'ai rajouté ça en pensant que le téléscopage des instances
était dû à la trop rapide succession d'appel de cette macro. Les 2
instructions MyOlApp servent, je crois, en principe, à quitter Outlook après
usage. C'est bien ça ?

"papou" a écrit dans le message
de news:
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro
ouvre des instances d'Outlook sans jamais les refermer, si bien qu'après
une douzaine de mails, j'ai un message du genre 'Outlook est utilisé par
trop d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?









Avatar
michdenis
Ta procédure générale devrait plutôt ressembler à ceci :

Ce qui suit devrait être dans le même module :

'Dans le haut de ton module, déclaration de tes variables

Dim ol As Outlook.Application
Dim olmail As MailItem

'Dans la procédure qui appelle la sub "EnvoyerMailOutlook"
'tu crées une instance et c'est la même instance qui enverra
'tous tes messages. Il s'agit de créer la boucle pour renseigner
'adéquatement les variables de la sub "EnvoyerMailOutlook"
'Ceci n'a pas été testé évidemment, mais c'est la structure
'que tu devrais essayer de mettre en place.
'--------------------------------------------
Sub test()
Dim i
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)

'Création de la boucle ....
tableau = "???"
Destinataire = "???"
Sujet = "???"
Corps = "???"
EnvoyerMailOutlook tableau, Destinataire, Sujet, Corps

'Quand tous tes courriels sont envoyés, tu supprimes tes objets.
ol.Quit
Set olmail = Nothing: Set ol = Nothing

End Sub
'--------------------------------------------
Sub EnvoyerMailOutlook(TableauPJ() As String, _
Destinataire As String, _
Sujet As String, _
Corps As String)

olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
End Sub
'--------------------------------------------






"michdenis" a écrit dans le message de news:

Remplace ceci :

Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit

Par
Set ol = Nothing



"papou" a écrit dans le message
de news:
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?





Avatar
Gadget
OK je vais faire comme ça. Petite question : si ol.quit s'execute avant que
tous les mails aient été envoyés (ils sont assez gros), ça va poser un
problème, ou bien les derniers mails vont être envoyés indépendamment de la
fermeture ?
Merci.
"michdenis" a écrit dans le message de news:

Ta procédure générale devrait plutôt ressembler à ceci :

Ce qui suit devrait être dans le même module :

'Dans le haut de ton module, déclaration de tes variables

Dim ol As Outlook.Application
Dim olmail As MailItem

'Dans la procédure qui appelle la sub "EnvoyerMailOutlook"
'tu crées une instance et c'est la même instance qui enverra
'tous tes messages. Il s'agit de créer la boucle pour renseigner
'adéquatement les variables de la sub "EnvoyerMailOutlook"
'Ceci n'a pas été testé évidemment, mais c'est la structure
'que tu devrais essayer de mettre en place.
'--------------------------------------------
Sub test()
Dim i
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)

'Création de la boucle ....
tableau = "???"
Destinataire = "???"
Sujet = "???"
Corps = "???"
EnvoyerMailOutlook tableau, Destinataire, Sujet, Corps

'Quand tous tes courriels sont envoyés, tu supprimes tes objets.
ol.Quit
Set olmail = Nothing: Set ol = Nothing

End Sub
'--------------------------------------------
Sub EnvoyerMailOutlook(TableauPJ() As String, _
Destinataire As String, _
Sujet As String, _
Corps As String)

olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
End Sub
'--------------------------------------------






"michdenis" a écrit dans le message de news:

Remplace ceci :

Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit

Par
Set ol = Nothing



"papou" a écrit dans le
message
de news:
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro
ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par
trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?









Avatar
Gadget
Merci MichDenis.
J'ai modifié ma proc à peu près comme indiqué - il semble que celà marche
mieux si on crée une instantce CreateItem(OlMailItem) par envoi, ce qui
n'est pas le cas dans la proc que tu proposes, qui en crée une seule pour
tous les envois .
J'ai maintenent un nouveau problème : mes mails étant assez gros, ils ne
sont pas encore tous envoyés quand survient ol.Quit. Sur mon poste, ça se
manifeste de deux manières : soit ca bloque, soit ma macro se termine
normalement, mais des instances d'Outlook restent ouvertes dans le
gestionnaire des tâches, et des mails 'disparaissent' : ils ne sont ni dans
la boite d'envoi ni dans les éléments envoyés.
Cela n'arrive pas si je configure Outlook pour ne pas envoyer/recevoir
automatiquement, mais sur demande : je dois alors après execution de ma
macro principale ouvrir Outlook et donner l'ordre manuellement d'envoyer.
Voici donc ma question : y a-t-il moyen de laisser Outlook en 'ne pas
envoyer/recevoir dès ouverture', afin que ma macro se déroule normalement
jusqu'au bout, et de donner l'ordre par macro d'envoyer/recevoir après, en
laissant outlook se débrouiller de celà sans bloquer ou retarder ma macro
excel ?
Je sais c'est un peu confus, mais bon c'est là ou j'en suis.
Merci d'avance si l'un d'entre vous a une solution...

"michdenis" a écrit dans le message de news:

Ta procédure générale devrait plutôt ressembler à ceci :

Ce qui suit devrait être dans le même module :

'Dans le haut de ton module, déclaration de tes variables

Dim ol As Outlook.Application
Dim olmail As MailItem

'Dans la procédure qui appelle la sub "EnvoyerMailOutlook"
'tu crées une instance et c'est la même instance qui enverra
'tous tes messages. Il s'agit de créer la boucle pour renseigner
'adéquatement les variables de la sub "EnvoyerMailOutlook"
'Ceci n'a pas été testé évidemment, mais c'est la structure
'que tu devrais essayer de mettre en place.
'--------------------------------------------
Sub test()
Dim i
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)

'Création de la boucle ....
tableau = "???"
Destinataire = "???"
Sujet = "???"
Corps = "???"
EnvoyerMailOutlook tableau, Destinataire, Sujet, Corps

'Quand tous tes courriels sont envoyés, tu supprimes tes objets.
ol.Quit
Set olmail = Nothing: Set ol = Nothing

End Sub
'--------------------------------------------
Sub EnvoyerMailOutlook(TableauPJ() As String, _
Destinataire As String, _
Sujet As String, _
Corps As String)

olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
End Sub
'--------------------------------------------






"michdenis" a écrit dans le message de news:

Remplace ceci :

Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit

Par
Set ol = Nothing



"papou" a écrit dans le
message
de news:
Bonjour
Quelques questions :
1°) Comment appelles-tu la procédure EnvoyerMailOutlook ?
2°) Que viennent faire ces instructions dans la procédure ?
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5

Cordialement
Pascal

"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro
ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par
trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant par exemple les articles 'New'. Il ne m'ouvrait alors qu'une
instance, mais n'envoyait jamais rien (bien que les mails se retourvent
dasns les 'Elements envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du mail (chaque mail faisant 400ko, son envoi peut prendre quelques
secondes) ?









Avatar
michdenis
Pourquoi tu n'utilises pas quelque chose comme ceci...
ça règlerait bien des problèmes ....


Pour ton information, la bibliothèque responsable est :
Bibliothèque : CDO
Fichier responsable : c:Windowssystem32cdosys.dll
Référence : Microsoft CDO for Windows 2000 Library




'-----------------------------------------
Sub test()

Dim ObjMail As Object
Dim ServeurSMTP As String, Texte As String
Dim Suget As String, Fichier As String
Dim Destinataire As String, Expediteur As String
Dim FichiersJoints As String
Dim AutresDestinataires As String

'*********** à Définir******************
ServeurSMTP = "smtp. ...à définir"
Sujet = "La raison du message "
Texte = "Texte du Message "
'Si plusieurs fichiers : séparer par un point-virgule
FichiersJoints = "c:classeur1.xls" ' si requis
Destinataire = ""
Expediteur = ""
'Si plusieurs adresses : séparer par un point-virgule"
AutresDestinataires = ""
'****************************************

Set ObjMail = CreateObject("CDO.Message")
With ObjMail
.To = Destinataire ' ""
.From = Expediteur
.CC = AutresDestinataires
.Subject = Sujet
.MimeFormatted = True
.GetStream.Charset = cdoISO_8859_15
.BodyPart.Charset = cdoISO_8859_15
.BodyPart.ContentTransferEncoding = "base64"
.TextBody = Texte
If Dir(Fichier) <> "" Then
.AddAttachment FichiersJoints
End If
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") =
2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") =
ServeurSMTP
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")
= 25
.Update
End With
.Send
End With

End Sub
'-----------------------------------------




"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en enlevant
par exemple les articles 'New'. Il ne m'ouvrait alors qu'une instance, mais
n'envoyait jamais rien (bien que les mails se retourvent dasns les 'Elements
envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi du
mail (chaque mail faisant 400ko, son envoi peut prendre quelques secondes)
?
Avatar
Gadget
Merci encore MichDenis.
Seul petit problème : je n'arrive pas à exploiter l'énorme base de données
de MSDN : par exemple, je voulais ajouter un avis de lecture. Je suis allé
piocher dans les caractéristiques de CDO dans la base MSDN, et, me référant
à la ligne VB :
Set ObjMail = CreateObject("CDO.Message")
J'ai supposé que l'objet CDO qui était manipulé est 'Message' ; j'ai trouvé
cet objet dans la base msdn
(http://msdn.microsoft.com/en-us/library/ms526130(EXCHG.10).aspx), et j'ai
trouvé là propriété DeliveryReceipt. J'ai donc ajouté :
.DeliveryReceipt = True
au code, et ça ne marche pas. D'ailleurs je ne retrouve pas dans la liste
des propriétés/Méthodes de l'objet Message de MSDN celles qui sont utilisées
dans le code. Ce n'est donc pas cet objet auquel on fait référence. Comme
j'aime comprendre ce que je copie/colle (pour éviter de redemander 10 fois
la même chose sur les fora), pourrais-tu m'expliquer succintement comment
utiliser la base MSDN pour retrouver l'objet que tu as utilisé, ou bien me
donner un lien sur un tutoriel quelconque ?
Merci.

"michdenis" a écrit dans le message de news:

Pourquoi tu n'utilises pas quelque chose comme ceci...
ça règlerait bien des problèmes ....


Pour ton information, la bibliothèque responsable est :
Bibliothèque : CDO
Fichier responsable : c:Windowssystem32cdosys.dll
Référence : Microsoft CDO for Windows 2000 Library




'-----------------------------------------
Sub test()

Dim ObjMail As Object
Dim ServeurSMTP As String, Texte As String
Dim Suget As String, Fichier As String
Dim Destinataire As String, Expediteur As String
Dim FichiersJoints As String
Dim AutresDestinataires As String

'*********** à Définir******************
ServeurSMTP = "smtp. ...à définir"
Sujet = "La raison du message "
Texte = "Texte du Message "
'Si plusieurs fichiers : séparer par un point-virgule
FichiersJoints = "c:classeur1.xls" ' si requis
Destinataire = ""
Expediteur = ""
'Si plusieurs adresses : séparer par un point-virgule"
AutresDestinataires = ""
'****************************************

Set ObjMail = CreateObject("CDO.Message")
With ObjMail
.To = Destinataire ' ""
.From = Expediteur
.CC = AutresDestinataires
.Subject = Sujet
.MimeFormatted = True
.GetStream.Charset = cdoISO_8859_15
.BodyPart.Charset = cdoISO_8859_15
.BodyPart.ContentTransferEncoding = "base64"
.TextBody = Texte
If Dir(Fichier) <> "" Then
.AddAttachment FichiersJoints
End If
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") > 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")
> ServeurSMTP

.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")
= 25
.Update
End With
.Send
End With

End Sub
'-----------------------------------------




"Gadget" a écrit dans le message de news:
48b3c4a6$0$890$
Salut à tous.
J'ai fait une routine d'envoi de mails par VBA Excel avec appel précoce à
Outlook. Ces mails comprennent 3 pièces jointes chacun et sont envoyés
nombreux à chaque fois.
Voici la routine d'envoi de mail :

Sub EnvoyerMailOutlook(TableauPJ() As String, Expediteur As String,
Destinataire As String, Sujet As String, Corps As String)

Application.DisplayAlerts = False

Dim i
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
olmail.To = Destinataire
olmail.Subject = Sujet
olmail.Body = Corps
For i = 1 To 3
If TableauPJ(i) = "" Then Exit For
olmail.Attachments.Add TableauPJ(i)
Next i
olmail.Send
Application.DisplayAlerts = True
Set myolapp = CreateObject("Outlook.Application")
myolapp.Quit
Attendre 5
ol.Quit
End Sub

En surveillant le gestionnaire de tâches, j'ai remarqué que la macro ouvre
des instances d'Outlook sans jamais les refermer, si bien qu'après une
douzaine de mails, j'ai un message du genre 'Outlook est utilisé par trop
d'applications'. J'ai essayé à l'aveugle de modifier la routine, en
enlevant
par exemple les articles 'New'. Il ne m'ouvrait alors qu'une instance,
mais
n'envoyait jamais rien (bien que les mails se retourvent dasns les
'Elements
envoyés').
Comment puis-je refermer les instances ouvertes sans interrompre l'envoi
du
mail (chaque mail faisant 400ko, son envoi peut prendre quelques secondes)
?





Avatar
michdenis
Sub test()

Dim ObjMail As Object
Dim ServeurSMTP As String, Texte As String
Dim Suget As String, Fichier As String
Dim Destinataire As String, Expediteur As String
Dim FichiersJoints As String
Dim AutresDestinataires As String

'*********** à Définir******************
ServeurSMTP = "smtp....."
Sujet = "La raison du message "
Texte = "Texte du Message "
'Si plusieurs fichiers : séparer par un point-virgule
FichiersJoints = "c:classeur1.xls" ' si requis
Destinataire = ""
Expediteur = ""
'Si plusieurs adresses : séparer par un point-virgule"
AutresDestinataires = ""
'****************************************

Set ObjMail = CreateObject("CDO.Message")
With ObjMail
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") =
2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") =
ServeurSMTP
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")
= 25

'*********************************
.Item(cdoDispositionNotificationTo) = ""
.Item(cdoReturnReceiptTo) = ""
'*********************************
.Update
End With
.To = Destinataire
.From = Expediteur
.CC = AutresDestinataires
.Subject = Sujet
.MimeFormatted = True
.GetStream.Charset = cdoISO_8859_15
.BodyPart.Charset = cdoISO_8859_15
.BodyPart.ContentTransferEncoding = "base64"
.TextBody = Texte
If Dir(Fichier) <> "" Then
.AddAttachment FichiersJoints
End If
.Send
End With

End Sub
Avatar
Gadget
Merci encore.
Les constantes cdoDispositionNotificationTo et cdoReturnReceiptTo n'étant
pas définies dans mon projet, je les ai remplacées par leur valeur (trouvées
sur le net, respectivement
"urn:schemas:mailheader:disposition-notification-to" et
"urn:schemas:mailheader:return-receipt-to". Ca ne bugge pas mais ça ne donne
rien (je me suis envoyé un mail qui ne m'a pas demandé d'avis de lecture).
Est-ce que j'ai oublié quelque chose ?
Merci.
"michdenis" a écrit dans le message de news:

Sub test()

Dim ObjMail As Object
Dim ServeurSMTP As String, Texte As String
Dim Suget As String, Fichier As String
Dim Destinataire As String, Expediteur As String
Dim FichiersJoints As String
Dim AutresDestinataires As String

'*********** à Définir******************
ServeurSMTP = "smtp....."
Sujet = "La raison du message "
Texte = "Texte du Message "
'Si plusieurs fichiers : séparer par un point-virgule
FichiersJoints = "c:classeur1.xls" ' si requis
Destinataire = ""
Expediteur = ""
'Si plusieurs adresses : séparer par un point-virgule"
AutresDestinataires = ""
'****************************************

Set ObjMail = CreateObject("CDO.Message")
With ObjMail
With .Configuration.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") > 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")
> ServeurSMTP

.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")
= 25

'*********************************
.Item(cdoDispositionNotificationTo) = ""
.Item(cdoReturnReceiptTo) = ""
'*********************************
.Update
End With
.To = Destinataire
.From = Expediteur
.CC = AutresDestinataires
.Subject = Sujet
.MimeFormatted = True
.GetStream.Charset = cdoISO_8859_15
.BodyPart.Charset = cdoISO_8859_15
.BodyPart.ContentTransferEncoding = "base64"
.TextBody = Texte
If Dir(Fichier) <> "" Then
.AddAttachment FichiersJoints
End If
.Send
End With

End Sub



1 2