86 votes

Envoyer un email Outlook via Python ?

J'utilise Outlook 2003 .

Quelle est la meilleure façon d'envoyer un courriel (par le biais de Outlook 2003 ) en utilisant Python ?

2 votes

@ThiefMaster : mon smtp n'est pas le même que celui de mon courrier électronique. channel mon smtp via mon fournisseur d'accès internet ( att ), même si j'utilise une adresse de courrier électronique différente (non att's ) pour envoyer le courriel. Outlook est déjà configuré pour gérer cela. S'il existe d'autres solutions (non Outlook ) qui prendront également en charge cette fonction, je serais heureux d'entendre des suggestions.

0 votes

La bonne solution consiste à utiliser l'outil python smtplib

180voto

TheoretiCAL Points 1308
import win32com.client as win32
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.To = 'To address'
mail.Subject = 'Message subject'
mail.Body = 'Message body'
mail.HTMLBody = '<h2>HTML Message body</h2>' #this field is optional

# To attach a file to the email (optional):
attachment  = "Path to the attachment"
mail.Attachments.Add(attachment)

mail.Send()

Utilisera votre compte Outlook local pour l'envoi.

Si vous essayez de faire quelque chose qui n'est pas mentionné ci-dessus, consultez les propriétés/méthodes de la documentation COM : https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/mailitem-object-outlook . Dans le code ci-dessus, mail est un objet MailItem.

0 votes

Est-il possible de créer un corps html ? Comme un corps d'email avec des images

3 votes

Réponse mise à jour. mail.HTMLBody vous permet de le définir comme une chaîne de caractères html.

7 votes

Une réponse simple et directe ! Fonctionne correctement dans Python 3.6.1.

42voto

Spencer Rathbun Points 6171

Pour une solution qui utilise outlook, voir La réponse de TheoretiCAL .

Sinon, utilisez le smtplib fourni avec python. Notez que cela nécessite que votre compte de messagerie permette le smtp, ce qui n'est pas nécessairement activé par défaut.

SERVER = "smtp.example.com"
FROM = "yourEmail@example.com"
TO = ["listOfEmails"] # must be a list

SUBJECT = "Subject"
TEXT = "Your Text"

# Prepare actual message
message = """From: %s\r\nTo: %s\r\nSubject: %s\r\n\

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail
import smtplib
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

EDIT : cet exemple utilise des domaines réservés comme décrit dans RFC2606

SERVER = "smtp.example.com"
FROM = "johnDoe@example.com"
TO = ["JaneDoe@example.com"] # must be a list

SUBJECT = "Hello!"
TEXT = "This is a test of emailing through smtp of example.com."

# Prepare actual message
message = """From: %s\r\nTo: %s\r\nSubject: %s\r\n\

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail
import smtplib
server = smtplib.SMTP(SERVER)
server.login("MrDoe", "PASSWORD")
server.sendmail(FROM, TO, message)
server.quit()

Pour que cela fonctionne réellement avec gmail, M. Doe devra aller dans l'onglet des options de gmail et le configurer pour autoriser les connexions smtp.

Notez l'ajout de la ligne de connexion pour s'authentifier auprès du serveur distant. La version originale ne l'inclut pas, un oubli de ma part.

14 votes

Ce n'était pas la question. La question porte sur l'utilisation de l'API Win32 afin de contrôler Outlook.

0 votes

@Spencer Rathbun : merci. Le problème est le suivant : mon smtp n'est pas le même que celui de mon courrier électronique. channel mon smtp via mon fournisseur d'accès internet ( att ), même si j'utilise une adresse de courrier électronique différente (non att's ) pour envoyer le courriel. Outlook est déjà configuré pour gérer cela. S'il existe d'autres solutions (non Outlook ) qui prendront également en charge cette fonction, je serais heureux d'entendre des suggestions.

1 votes

@user3262424 Donc votre adresse email n'est pas la même que votre serveur smtp ? Cela devrait être géré sur le serveur smtp. Il doit être configuré pour transmettre les e-mails qui ne proviennent pas de ce serveur au serveur de messagerie approprié. S'il est mal configuré, il permet aux spammeurs de vous contourner. Mais vraisemblablement, vous connaissez les adresses IP concernées et pouvez les placer sur une liste d'autorisation.

31voto

Steve Townsend Points 36948

Vérifiez via Google, il y a beaucoup d'exemples, voir aquí pour un.

Intégré pour faciliter la visualisation :

import win32com.client

def send_mail_via_com(text, subject, recipient, profilename="Outlook2003"):
    s = win32com.client.Dispatch("Mapi.Session")
    o = win32com.client.Dispatch("Outlook.Application")
    s.Logon(profilename)

    Msg = o.CreateItem(0)
    Msg.To = recipient

    Msg.CC = "moreaddresses here"
    Msg.BCC = "address"

    Msg.Subject = subject
    Msg.Body = text

    attachment1 = "Path to attachment no. 1"
    attachment2 = "Path to attachment no. 2"
    Msg.Attachments.Add(attachment1)
    Msg.Attachments.Add(attachment2)

    Msg.Send()

0 votes

Merci, c'est bien. Le problème est qu'Outlook continue de générer un alert message me demandant si je veux continuer ou, au contraire, terminer l'accès au script. Existe-t-il un moyen d'ignorer cette alert message ?

0 votes

@user3262424 - Quel est le contenu exact de la popup ?

0 votes

Je ne suis pas à côté de cet ordinateur en ce moment. Quelque chose informant qu'un script essaie d'accéder à outlook et que ça pourrait être un virus, etc. et si je veux continuer.

7voto

simic0de Points 751

Je voulais envoyer des e-mails en utilisant SMTPLIB, c'est plus facile et cela ne nécessite pas de configuration locale. Après que d'autres réponses n'aient pas été directement utiles, voici ce que j'ai fait.

Ouvrez Outlook dans un navigateur ; Allez dans le coin supérieur droit, cliquez sur l'icône de l'engrenage pour les paramètres, choisissez "Options" dans la liste déroulante qui apparaît. Allez dans 'Comptes', cliquez sur 'Pop et Imap', Vous verrez l'option : "Laisser les appareils et les applications utiliser le pop",

Choisissez l'option Oui et enregistrez les modifications.

Voici le code qui suit ; modifiez-le si nécessaire. La chose la plus importante est d'activer POP et le code du serveur ici ;

import smtplib

body = 'Subject: Subject Here .\nDear ContactName, \n\n' + 'Email\'s BODY text' + '\nYour :: Signature/Innitials'
try:
    smtpObj = smtplib.SMTP('smtp-mail.outlook.com', 587)
except Exception as e:
    print(e)
    smtpObj = smtplib.SMTP_SSL('smtp-mail.outlook.com', 465)
#type(smtpObj) 
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login('me@outlook.com', "password") 
smtpObj.sendmail('sender@outlook.com', 'recipient@gmail.com', body) # Or recipient@outlook

smtpObj.quit()
pass

2 votes

Cette méthode fonctionne également avec smtp.office365.com pour ceux qui se posent la question.

7voto

Corey Goldberg Points 15625

En utilisant pywin32 :

from win32com.client import Dispatch

session = Dispatch('MAPI.session')
session.Logon('','',0,1,0,0,'exchange.foo.com\nUserName');
msg = session.Outbox.Messages.Add('Hello', 'This is a test')
msg.Recipients.Add('Corey', 'SMTP:corey@foo.com')
msg.Send()
session.Logoff()

0 votes

Merci. Cela ne va-t-il pas générer l'ennuyeux outlook message d'erreur ?

1 votes

Cela pourrait déclencher une validation sur les nouvelles versions de Windows. Je ne sais pas comment le supprimer. Je n'utilise plus Windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X