You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA中Outlook自动发邮件.SentOnBehalfOfName失效求助

Outlook VBA SentOnBehalfOfName属性失效问题排查与解决

我用Excel VBA开发Outlook自动发邮件程序,之前.SentOnBehalfOfName属性正常工作,但现在新旧程序里该属性都失效。我拥有目标邮箱的发送权限,手动可以从该邮箱发邮件,程序能正常生成邮件,但发件人始终显示我的个人工作邮箱,必须手动修改。相关VBA代码如下:

Sub Make_Email(Wood As Variant, metal As Variant, SendID As Variant)
    Dim oFSO As Object
    Dim oFolder As Object
    Dim oFile As Object
    Dim i As Integer
    Dim NewSubject As Variant
    Dim InvoiceCount As Integer
    Dim PartnerName As Variant
    Dim Folder As Variant
    Dim EmailLR As Variant
    Dim EmailArray As Variant
    Dim mainWB As Workbook
    Dim CCID
    Dim Subject
    Dim Body
    Dim olMail As MailItem
    Set otlApp = CreateObject("Outlook.Application")
    Set olMail = otlApp.CreateItem(olMailItem)
    Set Doc = olMail.GetInspector.WordEditor

    Dim Link As Variant
    Dim EmailBody As Variant

    EmailBody = "text of email is here"

    Subject = "Subject text is here"
    With olMail
        .SentOnBehalfOfName = "email.this.should.be.from@mycompany.com" 'this is the part that is not working
        .To = SendID
        .Subject = Subject
        .HTMLBody = EmailBody
        .Display
        '.Send
    End With
    
End Sub

解决方法

1. 替换为SendUsingAccount属性(推荐)

SentOnBehalfOfName依赖Exchange服务器权限配置,容易受缓存或权限变动影响,改用指定发送账户的方式更可靠:

Sub Make_Email(Wood As Variant, metal As Variant, SendID As Variant)
    Option Explicit ' 强制变量声明,避免隐式错误
    Dim oFSO As Object
    Dim oFolder As Object
    Dim oFile As Object
    Dim i As Integer
    Dim NewSubject As Variant
    Dim InvoiceCount As Integer
    Dim PartnerName As Variant
    Dim Folder As Variant
    Dim EmailLR As Variant
    Dim EmailArray As Variant
    Dim mainWB As Workbook
    Dim CCID
    Dim Subject
    Dim Body
    Dim olMail As MailItem
    Dim otlApp As Outlook.Application
    Dim sendAccount As Outlook.Account
    
    Set otlApp = CreateObject("Outlook.Application")
    Set olMail = otlApp.CreateItem(olMailItem)
    
    ' 遍历账户找到目标邮箱
    For Each sendAccount In otlApp.Session.Accounts
        If sendAccount.SmtpAddress = "email.this.should.be.from@mycompany.com" Then
            Set olMail.SendUsingAccount = sendAccount
            Exit For
        End If
    Next sendAccount

    Dim Link As Variant
    Dim EmailBody As Variant

    EmailBody = "text of email is here"
    Subject = "Subject text is here"
    
    With olMail
        .To = SendID
        .Subject = Subject
        .HTMLBody = EmailBody
        .Display
        '.Send
    End With
    
    ' 释放对象
    Set olMail = Nothing
    Set otlApp = Nothing
End Sub

说明:该方法直接调用Outlook中已配置的目标账户,绕过代理发送的权限依赖,前提是目标邮箱已添加到你的Outlook账户列表。

2. 验证Exchange服务器权限

即使手动能发,也可能是服务器端权限配置变更:

  • 联系IT管理员确认你的账户是否仍拥有目标邮箱的代表发送(Send On Behalf Of)权限,若权限被改为代理发送(Send As),SentOnBehalfOfName会失效
  • 若需要保留原属性,可要求管理员恢复「代表发送」权限

3. 清理Outlook缓存

缓存文件异常可能导致权限识别错误:

  • 关闭Outlook,前往C:\Users\[你的用户名]\AppData\Local\Microsoft\Outlook
  • 备份后删除.ost或.pst缓存文件
  • 重启Outlook,重新同步服务器配置

4. 修复代码变量声明问题

原代码中otlApp未显式声明类型,可能引发隐式调用错误:

  • 在代码开头添加Option Explicit,强制所有变量必须声明
  • 显式声明otlApp为Outlook.Application类型,确保属性调用的准确性

内容的提问来源于stack exchange,提问作者Shlemkevich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:48:37