2017-07-06 4 views
2

Ma situation:mail quand Outlook est pas déjà ouvert

Je suis en train d'envoyer des e-mails alors que Outlook n'est pas ouvert. Ce code fonctionnera si Outlook est en cours d'exécution. Si Outlook est fermé, le code créera un processus non visible que vous pouvez voir s'exécuter dans le Gestionnaire des tâches. Le code rencontre une erreur pendant le code .Send. Il renvoie l'erreur d'exécution 287.

D'après mon expérience, certaines méthodes VBA ne fonctionnent que lorsque l'objet est visible ou actif. Mon travail consiste à utiliser .Display(False) avant d'appeler .Send.

Après avoir appelé .Send, il met immédiatement fin au processus Outlook. (S'il vous plaît pointez-moi vers la bonne direction pourquoi.) Ensuite, l'e-mail reste coincé dans la boîte d'envoi.

je dois appliquer un autre travail autour en appelant une autre CreateObject("Outlook.Application") et soit en boucle à travers la boîte d'envoi While Outbox.Items.Count > 0

ou

Looping par SyncObjects et appeler manuellement .Start pour exécuter Envoyer/Recevoir sur la boîte d'envoi.

Ma question:

Y at-il un moyen d'utiliser directement la méthode .Send au lieu d'utiliser arounds de travail tout en ne pas avoir à ouvrir Outlook.

Mon code:

Sub emailer() 

Dim OutApp As Object 
Dim OutMail As Object 

Set OutApp = CreateObject("Outlook.Application") 
Set OutMail = OutApp.CreateItem(0) 

With OutMail 
    .to = "[email protected]" 
    .CC = "" 
    .BCC = "" 
    .Subject = "This is the Subject line" 
    .Body = "Hi there" 
    .Send 'or use .Display 
End With 

Set OutMail = Nothing 
Set OutApp = Nothing 

End Sub 
+0

essayer de mettre la « Alors que Outbox.Items.Count> 0 » boucle dans votre code juste après la ligne – jsotola

Répondre

0

utilisez Namespace.SendAndReceive. Gardez à l'esprit que Envoyer/Recevoir est asynchrone et vous devez weit la synchronisation pour terminer. vous pouvez utiliser Namespace.SyncObjects collection, lancer une synchronisation à l'aide SyncObject.Start, alors attendez le SyncObject.SyncEnd événement.

Pour empêcher Outlook de se fermer, vous devez conserver une référence dynamique à un objet Outlook Explorer ou Inspector. Vous pouvez récupérer le dossier Boîte de réception en utilisant Namespace.GetDefaultFolder, puis utiliser la méthode MAPIFolder.GetExplorer pour obtenir un pointeur vers un objet Explorer.

MISE À JOUR:

Vous pouvez également vous assurer que vous n'êtes pas connecté à un profil MAPI avant de créer et d'envoyer un message. Après la ligne de CreateObject, essayez d'ajouter ce qui suit

set NS = OutApp.GetNamespace("MAPI") 
NS.Logon 
+0

Savez-vous pourquoi '.Send' ne veut pas fonctionner quand il n'y a pas d'objet explorateur? – fcsr

+0

Outlook se ferme avant d'avoir la possibilité d'effectuer un envoi/réception. –

+0

Je ne pense pas que c'est la raison. Lorsque j'essaie d'exécuter .Send, je peux toujours voir Outlook.exe dans Resource Monitor runnning – fcsr

2

Une solution pour le problème de .send avec la fermeture d'Outlook peuvent éventuellement être résolus en changeant les paramètres d'envoi/réception. Allez dans Fichier -> Options -> Avancé -> trouvez Send/Receive... et appuyez dessus. Sous la rubrique « Paramétrage du groupe « Tous les comptes » est une case à cocher pour Perform an automatic send/receive when exiting Cochez cette case, et il peut résoudre le. « Coincé dans le numéro Outbox vous avez »

Voici une capture d'écran.

pour cette solution, nous espérons qu'il aide.

+0

Salut @Busse merci « End With » mais il ne se bloqué si j'utilise les combos '.Display' et' .Send'. Je veux un simple '.Send'. Si je n'utilise que '.Send', j'obtiens une erreur d'exécution 287 – fcsr

+0

Ah, désolé. Comment appelez-vous ce script? Outlook est fermé, vous appelez ce script, il crée un nouvel élément de courrier et tente d'envoyer. Comme il est l'ouverture du processus, il devrait envoyer. J'ai lu quelque part que cela peut être une chose de synchronisation, indiquant qu'il essaie d'envoyer trop rapidement, de sorte qu'ils ont ajouté un délai d'une seconde avant d'envoyer. – Busse

+0

J'utilise VBA dans Excel mais mon programme est vraiment en Python. J'utilise la bibliothèque 'pywin32' qui expose les objets COM. C'est comme si vous utilisiez du code VBA en Python. Je viens de créer un code en double dans VBA pour m'assurer que ce n'est pas un problème avec Python. J'ai essayé d'utiliser F8 pour parcourir le code et faire une pause longtemps avant d'exécuter la ligne '.Send' mais cela ne fonctionne toujours pas. Je pense que le problème est que je ne peux pas utiliser '.Send' quand Outlook n'est pas visible. Similaire à '.Paste' dans Excel. Où vous ne pouvez pas l'utiliser si le champ de destination n'est pas activé. – fcsr