Outlook: изменение отправителя для использования функции "Отправить от имени"

Я сошел с ума, пытаясь понять это! Это длинный пост, но, пожалуйста, подождите и позвольте мне составить для вас сценарий:

Две команды: MainTeam и HelpingTeam

MainTeam использует исключительно общий почтовый ящик и использует макрос для отправки всех писем "от имени MainTeam " вместо простой отправки в качестве общего почтового ящика.

Пользователи HelpingTeam не используют общий почтовый ящик, но теперь время от времени собираются помогать другой команде. Когда они это сделают, им нужно изменить отправителя, чтобы указать, что их электронное письмо от основной команды, но оно все равно должно быть "от имени".

Общий почтовый ящик был добавлен пользователям в HelpingTeam, и в новом окне почты адрес электронной почты для общего почтового ящика находится ниже их личного. Использование этого адреса "От" будет означать, что они пытаются отправить почтовый ящик SendAs, что нам не нужно.

Конечно, я мог бы легко показать им, как добавить еще один адрес "От" и настроить его для использования их основной учетной записи в "SendonBehalfOf", но они не хотят запутаться, потому что теперь они увидят две записи в своем "От" список: запись "SendAs" (фиксированная, не может быть удалена) и запись "SendonBehalfOf" (может быть удалена).

Я пытался создать макрос (из исследованных макросов), который бы фиксировал этот сценарий и изменял свойства электронной почты, чтобы электронное письмо было отправлено пользователем от имени общего почтового ящика. При отправке электронного письма из общего почтового ящика с помощью этого макроса все работает отлично. При отправке электронного письма из личного почтового ящика и изменении отправителя на учетную запись "SendAs" (единственная общая учетная запись в списке) свойства макроса кажутся правильными, но Outlook не обрабатывает изменение, и система отклоняет сообщение.

Я сделал так много исправлений, что потерял представление о том, что работает, а что нет. Ниже представлена ​​наиболее функциональная версия, описанная выше. В сообщ окно записи, чтобы помочь мне отслеживать то, что происходит за кулисами:

       Dim oAccount As Outlook.Account
Dim objItem As MailItem
Dim WithEvents objInspectors As Outlook.Inspectors
Dim WithEvents objMailItem As Outlook.MailItem
Dim WithEvents myOlExp As Outlook.Explorer
Dim Sender As Outlook.AddressEntry

Private Sub Application_Startup()
    Initialize_handler
End Sub

Public Sub Initialize_handler()
    Set objInspectors = Application.Inspectors
    Set myOlExp = Application.ActiveExplorer
End Sub

Private Sub objInspectors_NewInspector(ByVal Inspector As Inspector)
    If Inspector.CurrentItem.Class = olMail Then
        Set objMailItem = Inspector.CurrentItem
        If objMailItem.Sent = False Then
            Call SetFromAddress(objMailItem)
        End If
    End If
End Sub

Public Sub SetFromAddress(objMailItem As Outlook.MailItem)
    'To see which account user is trying to send from
    MsgBox "[SetFromAddress] SendUsingAccount: " & objMailItem.SendUsingAccount
    MsgBox "[SetFromAddress] SentOnBehalfOfName: " & objMailItem.SentOnBehalfOfName
    
    'Check which account is in focus as primary
    If objMailItem.SendUsingAccount = "MainTeam@company.com" Then
        MsgBox "sendfromaddress if triggered"
        'set sender to be the Shared Mailbox
        objMailItem.SentOnBehalfOfName = "MainTeam@company.com"
          
        'Find Primary O365 account and use that to send the email "on behalf of"
        For Each oAccount In Application.Session.Accounts
            If oAccount = "U.ser@company.com" Then
                objMailItem.SendUsingAccount = oAccount
            End If
        Next
    End If
    
    MsgBox "SetFromAddress Sending As: " & objMailItem.SendUsingAccount
    MsgBox "SetFromAddress OnBehalf: " & objMailItem.SentOnBehalfOfName
End Sub

'Below enables Outlook 2013/2016/365 Reading Pane Reply
Private Sub myOlExp_InlineResponse(ByVal objItem As Object)
    Call SetFromAddress(objItem)
End Sub

'Added the sub below in case the user manually switchs from personal to shared mailbox
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    MsgBox "[ItemSend] SendUsingAccount: " & Item.SendUsingAccount
    MsgBox "[ItemSend] SentOnBehalfOfName: " & Item.SentOnBehalfOfName
    
    'Check if Shared Account
    If Item.SentOnBehalfOfName = "MainTeam@company.com" Then
        MsgBox "If triggered"
        'set sender to be the Shared Mailbox
        Item.SentOnBehalfOfName = "MainTeam@company.com"
        
        'Find Primary O365 account and use that to send the email "on behalf of"
        For Each oAccount In Application.Session.Accounts
            If oAccount = "U.ser@company.com" Then
                Item.SendUsingAccount = oAccount
            End If
        Next
    End If
    
    MsgBox "[ItemSend] SendUsingAccount: " & Item.SendUsingAccount
    MsgBox "[ItemSend] SentOnBehalfOfName: " & Item.SentOnBehalfOfName
End Sub

30.11.2020

Вот как я сейчас работаю над проблемой, но, как я уже упоминал, это не удается, если это встроенный ответ:

       Private Sub Application_ItemSend(ByVal item As Object, Cancel As Boolean)
    Dim oAccount As Outlook.Account
    Dim objItem As MailItem
 
    'To test later which account user is trying to send from
    Set SendingAccount = item.SendUsingAccount
        
    'Check if Shared Account
    If SendingAccount = "MainTeam@company.com" Then

        'Intecept email, stop it from sending, and create a new one "on behalf of"
        If TypeOf item Is MailItem Then
            Set objItem = item.Copy
            item.Delete
            Cancel = True
                       
            'set sender to be the Shared Mailbox
            objItem.SentOnBehalfOfName = "MainTeam@company.com"
            
            'Find Primary O365 account and use that to send the email "on behalf of"
            For Each oAccount In Application.Session.Accounts
                If oAccount = "U.ser@company.com" Then
                    objItem.SendUsingAccount = oAccount
                End If
            Next
        End If
        
        'send email
        objItem.Send
    End If
End Sub

2 ответа

Похоже, я нашел отличный обходной путь! Хотя это и не ответ , он, по крайней мере, заставляет этот код работать. Я в основном отправил команду для проверки имен SendKeys "%k"(ALT+k), который проверяет поле отправителя и получателя. В то время как CTRL+k проверяет имена в новом сообщении, он открывает окно вставки гиперссылки на ответ, поэтому я выбрал ALT+k.

Я добавил это в конце инструкции SetFromAddress и for, которая проверяет правильность отправляющей учетной записи. Я тестировал как внутри, так и снаружи оператора for, но внутри работает каждый раз.

      Public Sub SetFromAddress(objMailItem As Outlook.MailItem)
    'To see which account user is trying to send from
    
    'Check which account is in focus as primary
    If objMailItem.SendUsingAccount = "MainTeam@company.com" Then
        'set sender to be the Shared Mailbox
        objMailItem.SentOnBehalfOfName = "MainTeam@company.com"
          
        'Find Primary O365 account and use that to send the email "on behalf of"
        For Each oAccount In Application.Session.Accounts
            If oAccount = "U.ser@company.com" Then
                objMailItem.SendUsingAccount = oAccount
            End If
        Next
    End If
    SendKeys "%k
End Sub

а также

                  For Each oAccount In Application.Session.Accounts
                If oAccount = "U.ser@company.com" Then
                    objItem.SendUsingAccount = oAccount
                    sendkeys (%k)
                End If
            Next
        End If

Он не идеален, но пока будет работать, пока я не придумаю, как обрабатывать встроенные ответы.

Мне нужно обманом заставить Outlook принять SentOnBehalfOfName. Ваша установка может отличаться.

Dim oAccount As account

Const mailAddressShared = "MainTeam@company.com"

Private Sub setSentOnBehalfName()
    Dim currItem As MailItem
    Set currItem = ActiveInspector.currentItem
    Debug.Print currItem.subject
    currItem.SentOnBehalfOfName = mailAddressShared
    currItem.Save
End Sub

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

    Debug.Print "[ItemSend] SendUsingAccount: " & Item.SendUsingAccount
    Debug.Print "[ItemSend] SentOnBehalfOfName: " & Item.SentOnBehalfOfName
    
    Dim copiedItem As Object
    
    'Check if Shared Account
    If Item.SentOnBehalfOfName = mailAddressShared Then
    
        ' trick Outlook into accepting .SentOnBehalfOfName
        Set copiedItem = Item.Copy
        
        'assign shared mailbox
        copiedItem.SentOnBehalfOfName = mailAddressShared
        Debug.Print "copiedItem.SentOnBehalfOfName: " & copiedItem.SentOnBehalfOfName
    
    ElseIf Item.SentOnBehalfOfName = "" Then
    
        If MsgBox("Assign shared mailbox to SentOnBehalfOfName?", vbYesNo) = vbYes Then
        
            ' trick Outlook into accepting .SentOnBehalfOfName
            Set copiedItem = Item.Copy
            
            'assign shared mailbox
            copiedItem.SentOnBehalfOfName = mailAddressShared
            Debug.Print "copiedItem.SentOnBehalfOfName: " & copiedItem.SentOnBehalfOfName
            
        End If
        
    End If
    
    'Find default account to send the email
    If Not copiedItem Is Nothing Then
    
        Item.Delete
        Cancel = True   ' cancels original item
        
        For Each oAccount In Session.Accounts
            If oAccount = Session.GetDefaultFolder(olFolderInbox).Parent Then
                copiedItem.SendUsingAccount = oAccount
                Exit For
            End If
        Next
        
        Debug.Print "[ItemSend] copiedItem.SendUsingAccount: " & copiedItem.SendUsingAccount
        Debug.Print "[ItemSend] copiedItem.SentOnBehalfOfName: " & copiedItem.SentOnBehalfOfName
    
        copiedItem.Send ' does not re-trigger ItemSend
        
    Else
    
        Debug.Print "[ItemSend] Item.SendUsingAccount: " & Item.SendUsingAccount
        Debug.Print "[ItemSend] Item.SentOnBehalfOfName: " & Item.SentOnBehalfOfName
        
        For Each oAccount In Session.Accounts
            If oAccount = Session.GetDefaultFolder(olFolderInbox).Parent Then
                Item.SendUsingAccount = oAccount
                Exit For
            End If
        Next
    
        Debug.Print "[ItemSend] Item.SendUsingAccount: " & Item.SendUsingAccount
    End If
    
End Sub
Другие вопросы по тегам