使用Python发送Outlook电子邮件的方法差异

问题描述

我是Python的新手,最近尝试了两种方法自动在Outlook 365上发送电子邮件,一种方法比另一种方法更成功。我想问一下主要区别是什么,因为它们看起来有很大不同。

第一种方法实质上是在Automate the Boring Stuff书中概述的方法,使用SMTP或IMAP。我尝试了此操作,但由于使用办公计算机的身份验证问题而无法使其正常工作。

我有用的第二种方法不涉及身份验证,我只需导入win32com客户端和以下代码

outlook = client.dispatch('outlook.application')
message = outlook.CreateItem(0)
message.display() 
message.To = "redacted"
message.CC = "redacted"
message.Subject = "Hello"

我想问一下这两种方法的主要区别是什么。似乎第二个可能依赖于打开Outlook并登录我,但是如果我的计算机处于睡眠状态,第一个也可以工作吗?

当我已经登录Windows并无需输入用户ID和密码即可访问Outlook时,为什么要采用涉及身份验证的第一种方法

我认为这是一个问题,可能对其他刚接触Python和电子邮件自动化的人有用,因为他们在寻找解决方案时可能还会遇到两种方法

解决方法

tldr;如果您需要从不同的邮箱发送邮件,请使用 smtplib。如果您要自动化可以使用 Outlook 手动执行的操作,请使用 win32com.client

SMTP

参考用于 SMTP 的官方 python docs,那里描述的方法只是允许您发送邮件。 (是的,就是这样。您甚至无法查看收件箱。您将需要 imaplibpoplib。)

对我来说 smtp 的优点是,如果您有他/她的凭据,您可以从另一个人的邮箱发送电子邮件。如果您要使用 win32com.client,则需要退出您自己的 Outlook,登录到该特定人员的 Outlook,然后运行代码。对我来说,我面临的问题是我必须等待他/她的收件箱完成加载,然后才能发送任何内容。如果您只需要从多个邮箱发送邮件(并且对读取或删除邮件等任何其他功能不感兴趣),则这是不可行的。

[更新] 我最近在一个个人项目中使用了 smtplibemail(一个 Python 内置包)。由于这是个人项目,我不想使用我的办公室电子邮件,因此我决定使用 smtplib 代替。虽然需要设置初始连接,但它非常简单。由于无法在发送前将电子邮件保存为草稿,因此合乎逻辑的解决方法是将其发送到您自己的电子邮件地址(或任何其他“安全”电子邮件)以测试它是否按预期工作。

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg['From'] = 'YOUR_EMAIL@GMAIL.COM'
msg['Subject'] = 'Some subject here'
msg['To'] = ','.join(['adam@gmail.com','bob@gmail.com','candice@gmail.com'])
        
msg.set_content('Some text here')

with smtplib.SMTP_SSL('smtp.gmail.com',465) as smtp:
    smtp.login('YOUR_EMAIL@GMAIL.COM','PASSWORD123')
    smtp.send_message(msg)
    print('Email sent!')

win32com.client(专注于 Outlook 应用程序)

如果您想自动化您可以在您有权访问的 Outlook 邮箱上执行的操作,则应使用此库。语法往往更简单,它允许您做不可能的事情仅使用 smtplib

这里有两个例子来说明我的观点。

示例 1:自动发送日历邀请

如果您要使用 SMTP 执行此操作,则需要更多代码和另一个库 email,特别是 .MIMEMultipart.MIMEBase.MIMEText、{{1} }.至少可以说,语法看起来令人生畏。看看下面的 stackoverflow answer.Utils 变量:

ical

ical = "BEGIN:VCALENDAR"+CRLF+"PRODID:pyICSParser"+CRLF+"VERSION:2.0"+CRLF+"CALSCALE:GREGORIAN"+CRLF ical+="METHOD:REQUEST"+CRLF+"BEGIN:VEVENT"+CRLF+"DTSTART:"+dtstart+CRLF+"DTEND:"+dtend+CRLF+"DTSTAMP:"+dtstamp+CRLF+organizer+CRLF ical+= "UID:FIXMEUID"+dtstamp+CRLF ical+= attendee+"CREATED:"+dtstamp+CRLF+description+"LAST-MODIFIED:"+dtstamp+CRLF+"LOCATION:"+CRLF+"SEQUENCE:0"+CRLF+"STATUS:CONFIRMED"+CRLF ical+= "SUMMARY:test "+ddtstart.strftime("%Y%m%d @ %H:%M")+CRLF+"TRANSP:OPAQUE"+CRLF+"END:VEVENT"+CRLF+"END:VCALENDAR"+CRLF 简单多了(呸~)。互联网上到处都是代码示例(herehere),下面是一个简单的示例:

win32com.client

示例 2:将电子邮件保存为草稿

我经常为同事自动完成工作,当您批量发送电子邮件时,强烈建议将创建的邮件项保存为草稿进行测试。 ol = w32.Dispatch('Outlook.Application') appt = ol.CreateItem(1) appt.Start = '2021-02-06 15:00' appt.Save() 允许您将邮件项保存为草稿(即 win32com.client),但 .Save() 不允许您这样做(重申一下,它只允许您发送邮件。)>

[免责声明] 我在 Outlook 上做了一些自动化工作,我一直使用 smtplib,我最近才开始将 win32com.client 用于个人项目。这个问题引起了我的兴趣,我决定是时候至少阅读更多关于 smtplib 的信息了。