问题描述
我是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,那里描述的方法只是允许您发送邮件。 (是的,就是这样。您甚至无法查看收件箱。您将需要 imaplib
或 poplib
。)
对我来说 smtp 的优点是,如果您有他/她的凭据,您可以从另一个人的邮箱发送电子邮件。如果您要使用 win32com.client
,则需要退出您自己的 Outlook,登录到该特定人员的 Outlook,然后运行代码。对我来说,我面临的问题是我必须等待他/她的收件箱完成加载,然后才能发送任何内容。如果您只需要从多个邮箱发送邮件(并且对读取或删除邮件等任何其他功能不感兴趣),则这是不可行的。
[更新] 我最近在一个个人项目中使用了 smtplib
和 email
(一个 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
简单多了(呸~)。互联网上到处都是代码示例(here 和 here),下面是一个简单的示例:
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
的信息了。