更改 Outlook 邮件项目中的 'From' 字段

Change the 'From' field in Outlook mail item

我正在尝试自动发送群发电子邮件,需要更改 Outlook 中的 'From' 字段。电子邮件不能 'Sent on Behalf of' per compliance reasons. When I attempted this solution,我收到以下错误...

pywintypes.com_error: (-2147352571, 'Type mismatch.', None, 1)

此错误引用了 mail._oleobj_.Invoke(*(64209, 0, 8, 0, email_from)) 行。代码片段如下。让我知道我做错了什么或者是否有更好的方法。

to = 'jsmith@external_domain.com'
cc = 'my_group_e-mail@my_domain.com'
subject = personalized_subject_from_data_source
body = f'''personalized body from other data source with a {table}'''

outlook = win32.Dispatch('outlook.application')
# adding the code suggested by h0r53:
email_from = None
for account in outlook.Session.Accounts:
    if account.DisplayName == 'why_i_asked_email@my_domain.com':
        email_from = account
        break
mail = outlook.CreateItem(0)
# email_from = 'why_i_asked_email@my_domain.com'
mail._oleobj_.Invoke(*(64209, 0, 8, 0, email_from))
mail.To = to
mail.CC = cc
mail.Subject = subject
mail.HTMLbody = body
mail.Display(True)

编辑 添加 h0r53 建议的代码后,我仍然收到相同的错误。变量 account 被列为 <COMObject <unknown>>,因此永远不会满足逻辑门,当 for 迭代完成时,email_from == None 会抛出相同的错误。感谢任何进一步的帮助

谢谢!!

我是这样想出来的:Python - Reveal a COM object。在 for 方法中,它不是 outlook.Session.Accounts,而是 outlook.GetNamespace('MAPI').Accounts,如下所示:

    for account in outlook.GetNamespace('MAPI').Accounts:
        if str(account) == 'the_e-mail_in_question':
            email_from = account
            break
    mail = outlook.CreateItem(0)
    mail._oleobj_.Invoke(*(64209, 0, 8, 0, email_from))
    mail.To = to
    mail.CC = cc
    mail.Subject = subject
    mail.HTMLbody = body
    mail.Display(True)