【问题标题】:Inserting select-case for different e-mail addresses为不同的电子邮件地址插入选择案例
【发布时间】:2022-07-17 17:07:18
【问题描述】:

我的代码可以通过单击按钮保存附件。

我们的货运管理团队希望根据带有附件的客户电子邮件来自哪个电子邮件地址,将其保存在客户特定的文件夹中。 (视情况更改strFolderpath。)

我想使用 select-case 方法来更轻松地进行更改和添加。我尝试了多种更改。

如何为该用例添加 select-case 方法?

我的工作代码:

Sub SaveAttachments()
Dim objOL As Outlook.Application
Dim objMsg As Outlook.MailItem 'Object
Dim objAttachments As Outlook.Attachments
Dim objSelection As Outlook.Selection
Dim i As Long
Dim lngCount As Long
Dim strFile As String
Dim strFolderpath As String
Dim strDeletedFiles As String

' Instantiate an Outlook Application object.
Set objOL = CreateObject("Outlook.Application")

' Call the Namespace to see the sender e-mail address.
Set objNamespace = objOL.GetNamespace("MAPI")

' Get the collection of selected objects.
Set objSelection = objOL.ActiveExplorer.Selection

' Set the Attachment folder.
strFolderpath = "C:\Folder\Test\"

' Check each selected item for attachments. If attachments exist,
' save them to the strFolderPath folder and strip them from the item.
For Each objMsg In objSelection

    ' This code only strips attachments from mail items.
    ' If objMsg.class=olMail Then
    ' Get the Attachments collection of the item.
    Set objAttachments = objMsg.Attachments
    lngCount = objAttachments.Count
    strDeletedFiles = ""

    If lngCount > 0 Then

        ' We need to use a count down loop for removing items
        ' from a collection. Otherwise, the loop counter gets
        ' confused and only every other item is removed.

        For i = lngCount To 1 Step -1

            ' Save attachment before deleting from item.
            ' Get the file name.
            strFile = objAttachments.Item(i).FileName

            ' Combine with the path to the Temp folder.
            strFile = strFolderpath & strFile

            ' Save the attachment as a file.
            objAttachments.Item(i).SaveAsFile strFile

            ' Delete the attachment.
            objAttachments.Item(i).Delete

            'write the save as path to a string to add to the message
            'check for html and use html tags in link
            If objMsg.BodyFormat <> olFormatHTML Then
                strDeletedFiles = strDeletedFiles & vbCrLf & "<file://" & strFile & ">"
            Else
                strDeletedFiles = strDeletedFiles & "<br>" & "<a href='file://" & _
                strFile & "'>" & strFile & "</a>"
            End If

            'Use the MsgBox command to troubleshoot. Remove it from the final code.
            'MsgBox strDeletedFiles

        Next i

        ' Adds the filename string to the message body and save it
        ' Check for HTML body
        If objMsg.BodyFormat <> olFormatHTML Then
            objMsg.Body = vbCrLf & "The file(s) were saved to " & strDeletedFiles & vbCrLf & objMsg.Body
        Else
            objMsg.HTMLBody = "<p>" & "The file(s) were saved to " & strDeletedFiles & "</p>" & objMsg.HTMLBody
        End If
        objMsg.Save
    End If
Next

ExitSub:

Set objAttachments = Nothing
Set objMsg = Nothing
Set objSelection = Nothing
Set objOL = Nothing
Set objNamespace = Nothing
End Sub

【问题讨论】:

  • 您在确定邮件发送到的地址时遇到问题吗?还是创建案例陈述?
  • 创建案例陈述待定。
  • 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example

标签: vba outlook office365


【解决方案1】:

您需要将Select Case 放在For Each objMsg 循环内(顺便说一句,如果您在使用Case 语法时遇到困难,也可以使用If 语句)。

For Each objMsg In objSelection
    Select Case True
        Case objMsg.SenderEmailAddress = "example@address.com"
            strFolderpath = "C:\Folder\sender1folder\"
        Case objMsg.SenderEmailAddress like "*domain.com"
            strFolderpath = "C:\Folder\otherfolder\"
        Case Else
            strFolderpath = "C:\Folder\Test\"
    End Select

    'rest of loop carry on here

【讨论】:

  • 感谢您的代码。我确实把它放在我的代码中,它似乎工作,但它只使用最后一种情况(其他情况),它没有我定义的电子邮件地址。代码中是否缺少阻止读取发件人电子邮件地址的内容?
  • 在不知道您正在使用的确切数据/代码的情况下,这很困难。最好的办法是使用 F8 逐行遍历代码,直到您知道出错的地方,然后检查变量(例如 debug.print objMsg.SenderEmailAddress 以查看是否有任何意外情况。
  • 我对其进行了调试,结果它向我显示了 ou "/O=EXCHANGELABS..." 而不是电子邮件地址。你能用它做点什么吗?
  • 好的,试试 .senderEmailAddress 以外的其他属性 - 也许将过滤器基于 .Sender
  • 我找到了解决方案。我用我的内部邮件地址而不是外部邮件地址进行了测试。有了外部的,一切都像魅力一样。谢谢你的帮助!
【解决方案2】:

我想为此使用 select-case 方法以便将来更轻松地进行更改和添加,但我现在卡住了

不必使用 select case 运算符。您需要做的第一件事是在代码中获取发件人的 SMTP 地址,然后您才能决定使用哪个路径。

要获取 SMTP 地址而不是 Exchange 1 (X500),您可以尝试使用 AddressEntry.GetExchangeUser 方法获取 Exchange 用户,然后尝试检索 ExchangeUser.PrimarySmtpAddress 属性值。

HowTo: Convert Exchange-based email address into SMTP email address 文章中了解更多信息。

在您检索到 SMTP 地址后,您可以分析内容并选择合适的文件夹来保存附件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2011-03-31
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多