Skip to main content
 首页 » 编程设计

python之尝试使用 Python (win32com.client) 从 Outlook 2007 发送邮件

2025年05月04日28rubylouvre

我正在尝试使用 Python 启动一些 Outlook 2007 自动化。我在这个线程上从 Steve Townsend 那里得到了这个很棒的脚本(如下):Send Outlook Email Via Python?

但我在开始时遇到了麻烦。

import win32com.client 
 
def send_mail_via_com(text, subject, recipient, profilename="Outlook2007"): 
    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() 
 
 
send_mail_via_com("test text","test subject", "removed@security.obv","Outlook2007") 

但我得到以下错误:

Traceback (most recent call last): 
  File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 83, in _ 
GetGoodDispatch 
    IDispatch = pythoncom.connect(IDispatch) 
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None) 
 
During handling of the above exception, another exception occurred: 
 
Traceback (most recent call last): 
  File "C:\PROJECTS\Python\send_mail_test.py", line 25, in <module> 
    send_mail_via_com("test text","test subject", "removed@security.obv","Outloo 
k2007") 
  File "C:\PROJECTS\Python\send_mail_test.py", line 4, in send_mail_via_com 
    s = win32com.client.Dispatch("Mapi.Session") 
  File "C:\Python32\lib\site-packages\win32com\client\__init__.py", line 95, in 
Dispatch 
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c 
lsctx) 
  File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 108, in 
_GetGoodDispatchAndUserName 
    return (_GetGoodDispatch(IDispatch, clsctx), userName) 
  File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 85, in _ 
GetGoodDispatch 
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II 
D_IDispatch) 
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None) 

这可能是我错过的一些愚蠢的事情。

是Python 3.2并且已经安装了PyWin32

非常感谢

请您参考如下方法:

没关系...

import win32com.client 
olMailItem = 0x0 
obj = win32com.client.Dispatch("Outlook.Application") 
newMail = obj.CreateItem(olMailItem) 
newMail.Subject = "I AM SUBJECT!!" 
newMail.Body = "I AM IN THE BODY\nSO AM I!!!" 
newMail.To = "who_to_send_to@example.com" 
#newMail.CC = "moreaddresses here" 
#newMail.BCC = "address" 
#attachment1 = "Path to attachment no. 1" 
#attachment2 = "Path to attachment no. 2" 
#newMail.Attachments.Add(attachment1) 
#newMail.Attachments.Add(attachment2) 
#newMail.display() 
newMail.Send() 

这适用于安装了 PyWin32 的 Python 3.2.3。如果你想玩这个,我已经注释掉了一些行。

[2017 EDIT] - 添加 HTML 电子邮件支持(以防任何人方便)

import win32com.client 
 
#some constants (from http://msdn.microsoft.com/en-us/library/office/aa219371%28v=office.11%29.aspx) 
olFormatHTML = 2 
olFormatPlain = 1 
olFormatRichText = 3 
olFormatUnspecified = 0 
olMailItem = 0x0 
 
 
obj = win32com.client.Dispatch("Outlook.Application") 
newMail = obj.CreateItem(olMailItem) 
newMail.Subject = "I AM SUBJECT!!" 
newMail.BodyFormat = olFormatHTML    #or olFormatRichText or olFormatPlain 
newMail.HTMLBody = "<h1>I am a title</h1><p>I am a paragraph</p>" 
newMail.To = "who_to_send_to@example.com; anotherrecipient@email.fake" 
 
# carbon copies and attachments (optional) 
 
#newMail.CC = "moreaddresses here" 
#newMail.BCC = "address" 
#attachment1 = "Path to attachment no. 1" 
#attachment2 = "Path to attachment no. 2" 
#newMail.Attachments.Add(attachment1) 
#newMail.Attachments.Add(attachment2) 
 
# open up in a new window and allow review before send 
newMail.display() 
 
# or just use this instead of .display() if you want to send immediately 
#newMail.Send()