Отправить Outlook электронную почту через Python? - PullRequest
46 голосов
/ 13 июня 2011

Я использую Outlook 2003.

Как лучше всего отправить электронную почту (через Outlook 2003), используя Python?

Ответы [ 8 ]

95 голосов
/ 26 июля 2013
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()

Будет использовать вашу локальную учетную запись outlook для отправки.

Обратите внимание, что если вы пытаетесь сделать что-то, не упомянутое выше, посмотрите свойства / методы COM-документов: https://msdn.microsoft.com/en-us/vba/outlook-vba/articles/mailitem-object-outlook. Вприведенный выше код, mail является объектом MailItem.

27 голосов
/ 13 июня 2011

Проверьте через Google, есть много примеров, см. здесь для одного.

Встроенный для удобства просмотра:

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()
20 голосов
/ 13 июня 2011

Используйте smtplib, который поставляется с python. Обратите внимание, что для этого потребуется, чтобы ваша учетная запись электронной почты поддерживала протокол smtp, который не обязательно включен по умолчанию.

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()

РЕДАКТИРОВАТЬ: в этом примере используются зарезервированные домены, как описано в 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()

Чтобы он действительно работал с Gmail, мистеру Доу нужно будет перейти на вкладку параметров в Gmail и настроить его на разрешение SMTP-подключений.

Обратите внимание на добавление строки входа в систему для аутентификации на удаленном сервере. Оригинальная версия не включает это, упущение с моей стороны.

7 голосов
/ 13 июня 2011

с использованием 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()
2 голосов
/ 27 сентября 2018

Простейшее из всех решений для ОФИСА 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()

здесь df - это кадр данных, преобразованный в HTML-таблицу, которая вставляется вhtml_template

0 голосов
/ 03 января 2018

Я попробовал использовать 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 = "xyz@abc.com"
    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 голосов
/ 12 октября 2017

Кроме win32, если ваша компания настроила ваш веб-интерфейс, вы также можете попробовать PYTHON REST API, который официально сделан Microsoft.(https://msdn.microsoft.com/en-us/office/office365/api/mail-rest-operations)

0 голосов
/ 01 июля 2017

Я хотел отправить электронную почту, используя SMTPLIB, это проще и не требует локальной настройки.После того, как другие ответы оказались бесполезными, я так и сделал.

Откройте Outlook в браузере;Перейдите в верхний правый угол, щелкните значок шестеренки для «Настройки», выберите «Параметры» в раскрывающемся списке.Перейдите в «Аккаунты», нажмите «Pop and Imap», вы увидите опцию: «Разрешить устройствам и приложениям использовать pop»,

Выберите «Да» и «Сохранить изменения».

Воткод там после;Отредактируйте где необходимо.Самое важное - включить здесь протокол POP и код сервера;

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
...