最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

OUTLOOK - VBA Code to change SenderMail to another Mail - Stack Overflow

programmeradmin0浏览0评论

I'm currently trying to change the sender's email address in VBA to my secondary email in Outlook. The sender should change if an attachment's name includes a specific "attachment_name". I've already tried using the Application_ItemSend event, but it didn't work as expected.

It's sending the email from the default email address, even when I include a "stop" and go step by step. It reaches the point where "account" is defined as the new_sender_email, but it's still sending from the wrong address Here's my attempt:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim mailItem As Outlook.mailItem
    Dim attachment As Outlook.attachment
    Dim smtpAddress As String
    
    If TypeName(Item) <> "MailItem" Then Exit Sub
    Stop
    Set mailItem = Item
    smtpAddress = "new_sender_email"
    
    For Each attachment In mailItem.Attachments
        If InStr(LCase(attachment.FileName), "rechnung") > 0 Then
            mailItem.SentOnBehalfOfName = smtpAddress
            

            If mailItem.SentOnBehalfOfName <> smtpAddress Then
                MsgBox "Error2", vbExclamation
                Cancel = True
            End If
            
            Exit For
        End If
    Next attachment
End Sub

I'm currently trying to change the sender's email address in VBA to my secondary email in Outlook. The sender should change if an attachment's name includes a specific "attachment_name". I've already tried using the Application_ItemSend event, but it didn't work as expected.

It's sending the email from the default email address, even when I include a "stop" and go step by step. It reaches the point where "account" is defined as the new_sender_email, but it's still sending from the wrong address Here's my attempt:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim mailItem As Outlook.mailItem
    Dim attachment As Outlook.attachment
    Dim smtpAddress As String
    
    If TypeName(Item) <> "MailItem" Then Exit Sub
    Stop
    Set mailItem = Item
    smtpAddress = "new_sender_email"
    
    For Each attachment In mailItem.Attachments
        If InStr(LCase(attachment.FileName), "rechnung") > 0 Then
            mailItem.SentOnBehalfOfName = smtpAddress
            

            If mailItem.SentOnBehalfOfName <> smtpAddress Then
                MsgBox "Error2", vbExclamation
                Cancel = True
            End If
            
            Exit For
        End If
    Next attachment
End Sub
Share edited Feb 4 at 15:09 Dmitry Streblechenko 66.3k4 gold badges55 silver badges83 bronze badges asked Feb 4 at 8:47 OleOle 1
Add a comment  | 

1 Answer 1

Reset to default 2

The issue you're facing is due to using the SentOnBehalfOfName property, which is designed for scenarios where you are sending an email on behalf of another person (such as a delegate). Instead, you need to use the SendUsingAccount property to specify which email account should be used for sending the email.

Here's the corrected code:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim mailItem As Outlook.MailItem
    Dim attachment As Outlook.Attachment
    Dim newSenderAccount As Outlook.Account
    Dim smtpAddress As String
    Dim account As Outlook.Account
    Dim accounts As Outlook.Accounts
    Dim found As Boolean

    ' Ensure it's a MailItem
    If TypeName(Item) <> "MailItem" Then Exit Sub
    
    Set mailItem = Item
    smtpAddress = "new_sender_email"  ' Define the new sender's email address
    found = False
    
    ' Get all accounts in Outlook
    Set accounts = Application.Session.Accounts
    
    ' Loop through accounts and find the one that matches the smtpAddress
    For Each account In accounts
        If account.SmtpAddress = smtpAddress Then
            Set newSenderAccount = account
            found = True
            Exit For
        End If
    Next account
    
    ' If the account is found, set the email to send using that account
    If found Then
        mailItem.SendUsingAccount = newSenderAccount
    Else
        MsgBox "Account not found.", vbExclamation
        Cancel = True
    End If
    
    ' Check for attachments and apply condition based on the file name
    For Each attachment In mailItem.Attachments
        If InStr(LCase(attachment.FileName), "rechnung") > 0 Then
            ' Ensure the new sender is correctly applied
            If mailItem.SendUsingAccount Is newSenderAccount Then
                MsgBox "Email will be sent from " & newSenderAccount.DisplayName, vbInformation
            Else
                MsgBox "Error: Unable to change sender.", vbExclamation
                Cancel = True
            End If
            Exit For
        End If
    Next attachment
End Sub
发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>