【问题标题】:Trying to send a mail from Outlook 2007 using Python (win32com.client)尝试使用 Python (win32com.client) 从 Outlook 2007 发送邮件
【发布时间】:2017-06-16 23:36:22
【问题描述】:

我正在尝试使用 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

非常感谢

【问题讨论】:

    标签: python automation outlook


    【解决方案1】:

    没关系……

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

    【讨论】:

      【解决方案2】:

      上面的代码也适用于 Python 2.7。 原帖中的错误是由以下原因引起的:

      s = win32com.client.Dispatch("Mapi.Session") 回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“c:\Python27\lib\site-packages\win32com\client__init__.py”,第 95 行,在 Dispatch 调度,用户名 = 动态。_GetGoodDispatchAndUserName(调度,用户名,clsctx) _GetGoodDispatchAndUserName 中的文件“c:\Python27\lib\site-packages\win32com\client\dynamic.py”,第 108 行 返回(_GetGoodDispatch(IDispatch,clsctx),用户名) _GetGoodDispatch 中的文件“c:\Python27\lib\site-packages\win32com\client\dynamic.py”,第 85 行 IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)

      它曾经在 Outlook 2003 中工作。我想 2007 根本不需要 MAPI 和登录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多