web-dev-qa-db-fra.com

Envoyer un courrier électronique Outlook via Python?

J'utilise Outlook 2003.

Quel est le meilleur moyen d'envoyer un courrier électronique (via Outlook 2003) à l'aide de Python?

41
user3262424

Utilisez le smtplib fourni avec python. Notez que cela nécessitera que votre compte de messagerie autorise smtp, qui n'est pas nécessairement activé par défaut.

SERVER = "smtp.example.com"
FROM = "[email protected]"
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 = "[email protected]"
TO = ["[email protected]"] # 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 accéder à l'onglet Options de gmail et le configurer pour autoriser les connexions smtp.

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

15
Spencer Rathbun
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 envoyer.

Remarque Si vous essayez de faire quelque chose de non 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.

75
TheoretiCAL

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

En ligne 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()
26
Steve Townsend

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:[email protected]')
msg.Send()
session.Logoff()
6
Corey Goldberg

La solution la plus simple pour Office 365:

from O365 import Message

html_template =     """ 
            <html>
            <head>
                <title></title>
            </head>
            <body>
                    {}
            </body>
            </html>
        """

final_html_data = html_template.format(df.to_html(index=False))

o365_auth = ('sender_username@company_email.com','Password')
m = Message(auth=o365_auth)
m.setRecipients('receiver_username@company_email.com')
m.setSubject('Weekly report')
m.setBodyHTML(final)
m.sendMessage()

ici df est un cadre de données converti en table html, qui est injecté dans html_template

1
Gil Baggio

Outre win32, si votre société a configuré votre Web Outlook, vous pouvez également essayer l’API PYTHON REST, qui est officiellement créée par Microsoft. ( https://msdn.Microsoft.com/en-us/office/office365/api/mail-rest-operations )

0
LinconFive

C’est celui que j’ai essayé avec Win32:

import win32com.client as win32
import psutil
import os
import subprocess
import sys

# Drafting and sending email notification to senders. You can add other senders' email in the list
def send_notification():


    Outlook = win32.Dispatch('Outlook.application')
    olFormatHTML = 2
    olFormatPlain = 1
    olFormatRichText = 3
    olFormatUnspecified = 0
    olMailItem = 0x0

    newMail = Outlook.CreateItem(olMailItem)
    newMail.Subject = sys.argv[1]
    #newMail.Subject = "check"
    newMail.BodyFormat = olFormatHTML    #or olFormatRichText or olFormatPlain
    #newMail.HTMLBody = "test"
    newMail.HTMLBody = sys.argv[2]
    newMail.To = "[email protected]"
    attachment1 = sys.argv[3]
    attachment2 = sys.argv[4]
    newMail.Attachments.Add(attachment1)
    newMail.Attachments.Add(attachment2)

    newMail.display()
    # or just use this instead of .display() if you want to send immediately
    newMail.Send()





# Open Outlook.exe. Path may vary according to system config
# Please check the path to .exe file and update below
def open_Outlook():
    try:
        subprocess.call(['C:\Program Files\Microsoft Office\Office15\Outlook.exe'])
        os.system("C:\Program Files\Microsoft Office\Office15\Outlook.exe");
    except:
        print("Outlook didn't open successfully")     
#

# Checking if Outlook is already opened. If not, open Outlook.exe and send email
for item in psutil.pids():
    p = psutil.Process(item)
    if p.name() == "Outlook.EXE":
        flag = 1
        break
    else:
        flag = 0

if (flag == 1):
    send_notification()
else:
    open_Outlook()
    send_notification()
0
Buni_Buni

Je voulais envoyer un email en utilisant SMTPLIB, c'est plus facile et cela ne nécessite pas de configuration locale. Après d'autres réponses n'étaient pas directement utiles, C'est ce que j'ai fait.

Ouvrez Outlook dans un navigateur. Allez dans le coin en haut à droite, cliquez sur l'icône représentant une roue dentée pour les paramètres, choisissez "Options" dans la liste déroulante ....a allez dans "Comptes", cliquez sur "Pop et imap", : "Laisser les appareils et les applications utiliser pop",

Choisissez l'option Oui et Enregistrer les modifications.

Voici le code ci-après; Modifiez où nécessaire . La chose la plus importante est d’activer POP et le code 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('[email protected]', "password") 
smtpObj.sendmail('[email protected]', '[email protected]', body) # Or recipient@Outlook

smtpObj.quit()
pass
0
simic0de