3

我正在尝试在通过 Outlook 2016 发送的每封电子邮件上设置 .SentOnBehalfOfName。也就是说,每当我点击新邮件、回复、全部回复或转发时。

我试过这个:

Public WithEvents myItem As Outlook.MailItem

Private Sub Application_ItemLoad(ByVal Item As Object)
    If (TypeOf Item Is MailItem) Then
        Set myItem = Item
    End If
End Sub


Private Sub FromField()

With myItem
    .SentOnBehalfOfName = "example@aol.com"
    .Display
End With

End Sub


Private Sub myItem_Open(Cancel As Boolean)

    FromField

End Sub
4

4 回答 4

1

SentOnBehalfOfName属性仅在 Exchange 配置文件/帐户的情况下才有意义此外,您需要具有代表他人发送所需的权限。有关类似讨论, 请参阅SentOnBehalfOfName问题。

如果您在配置文件中配置了多个帐户,则可以使用SendUsingAccount属性,该属性允许 Account 对象表示要发送 MailItem 的帐户。

 Sub SendUsingAccount() 
  Dim oAccount As Outlook.account 
  For Each oAccount In Application.Session.Accounts 
   If oAccount.AccountType = olPop3 Then 
    Dim oMail As Outlook.MailItem 
    Set oMail = Application.CreateItem(olMailItem) 
    oMail.Subject = "Sent using POP3 Account" 
    oMail.Recipients.Add ("someone@example.com") 
    oMail.Recipients.ResolveAll 
    oMail.SendUsingAccount = oAccount 
    oMail.Send 
   End If 
  Next 
 End Sub 
于 2015-10-25T19:37:26.610 回答
1

在这个 Outlook 会话中

Private WithEvents sentInsp As Inspectors
Private WithEvents sentMailItem As mailItem

Private Sub Application_Startup()
    Set sentInsp = Application.Inspectors
End Sub

Private Sub sentInsp_NewInspector(ByVal Inspector As Inspector)
    If Inspector.currentItem.Class = olMail Then
       Set sentMailItem = Inspector.currentItem
       sentMailItem.SentOnBehalfOfName = "someone@someplace.com"
    End If
End Sub

我发现必须通过间隔运行启动来重置我的事件代码。ItemSend 可能更可靠。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

Dim copiedItem As MailItem

If Item.Class = olMail Then

    Set copiedItem = Item.Copy

    copiedItem.SentOnBehalfOfName = "someone@someplace.com"
    'copiedItem.Display
    copiedItem.Send

    Item.Delete
    Cancel = True

End If

    Set copiedItem = Nothing

End Sub

当我运行此代码时,它不会再次调用 ItemSend。

于 2015-10-26T20:09:30.873 回答
0

请改用 Application.ItemSend 事件。

于 2015-10-26T00:37:21.337 回答
0

这是原始问题的答案。

将代码放在“ThisOutlookSession”中

Option Explicit

Public WithEvents myItem As Outlook.MailItem
Public EventsDisable As Boolean

Private Sub Application_ItemLoad(ByVal Item As Object)

'https://stackoverflow.com/questions/21727768/rule-that-runs-macro-when-an-email-is-opened

    If EventsDisable = True Then Exit Sub
    
    If Item.Class = olMail Then
    
        Set myItem = Item
        
    End If
    
End Sub

Private Sub myItem_Open(Cancel As Boolean)

    On Error Resume Next

    Dim copiedItem As MailItem
        
    Set copiedItem = myItem.Copy
    
    copiedItem.SentOnBehalfOfName = "someone@someplace.com"
    copiedItem.Display

    Cancel = True 'This cancels 'myItem' from opening for the user because we only want 'copiedItem' to open.

End Sub

我花了大约三个星期才得到这个答案。归功于 niton 的回答,它帮助我得到了这个答案。

使用此方法,您可以在向用户显示电子邮件之前调整 .SentOnBehalfOfName 属性。与在用户单击“发送”后更改 .SentOnBehalfOfName 属性的 Application_ItemSend 方法相反。

请注意,在向用户显示电子邮件之前,需要调整 .SentOnBehalfOfName 属性。

您无法在 Application_ItemLoad 方法中进行太多调整,您需要使用“myItem”来复制“Item”,执行您的逻辑,然后将“myItem”复制到“copiedItem”,然后设置copyedItem.SentOnBehalfOfName 属性,然后最后使用.Display 向用户显示“复制项目”。

于 2021-04-15T13:31:27.063 回答